Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndi_G <andigros72@googlemail.com>2011-01-17 22:29:09 (GMT)
committer Andi_G <andigros72@googlemail.com>2011-01-17 22:29:09 (GMT)
commit7aab67189856a1c34835b819c42a8093a602a00e (patch)
treecfc70a9c1af0b1d70f1f117ae88e12306db5e7d5
parent9a954fd57f69d407a7919d8ab641c638e54bbb6e (diff)
the first experimental version that allows annotation sharing
-rw-r--r--MANIFEST266
-rw-r--r--activity/activity-anno.svg101
-rw-r--r--activity/activity.info9
-rw-r--r--activity/mimetypes.xml7
-rw-r--r--anno_v1.dbbin0 -> 2048 bytes
-rw-r--r--annoactivity.py1033
-rw-r--r--annobookmark.py181
-rw-r--r--epubadapter.py64
-rw-r--r--epubview/__init__.py24
-rw-r--r--epubview/__init__.pycbin0 -> 383 bytes
-rw-r--r--epubview/epub.py152
-rw-r--r--epubview/epub.pycbin0 -> 4960 bytes
-rw-r--r--epubview/epubinfo.py90
-rw-r--r--epubview/epubinfo.pycbin0 -> 3644 bytes
-rw-r--r--epubview/epubview.py563
-rw-r--r--epubview/epubview.pycbin0 -> 19504 bytes
-rw-r--r--epubview/jobs.py296
-rw-r--r--epubview/jobs.pycbin0 -> 10512 bytes
-rw-r--r--epubview/navmap.py93
-rw-r--r--epubview/navmap.pycbin0 -> 4546 bytes
-rw-r--r--epubview/widgets.py31
-rw-r--r--epubview/widgets.pycbin0 -> 1778 bytes
-rw-r--r--locale/af/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1052 bytes
-rw-r--r--locale/af/activity.linfo2
-rw-r--r--locale/am/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/am/activity.linfo2
-rw-r--r--locale/ar/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 2157 bytes
-rw-r--r--locale/ar/activity.linfo2
-rw-r--r--locale/ay/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ay/activity.linfo2
-rw-r--r--locale/bg/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1350 bytes
-rw-r--r--locale/bg/activity.linfo2
-rw-r--r--locale/bi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/bi/activity.linfo2
-rw-r--r--locale/bn/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1301 bytes
-rw-r--r--locale/bn/activity.linfo2
-rw-r--r--locale/bn_IN/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1034 bytes
-rw-r--r--locale/bn_IN/activity.linfo2
-rw-r--r--locale/ca/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1031 bytes
-rw-r--r--locale/ca/activity.linfo2
-rw-r--r--locale/cpp/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/cpp/activity.linfo2
-rw-r--r--locale/cs/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/cs/activity.linfo2
-rw-r--r--locale/da/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 930 bytes
-rw-r--r--locale/da/activity.linfo2
-rw-r--r--locale/de/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1923 bytes
-rw-r--r--locale/de/activity.linfo2
-rw-r--r--locale/dz/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/dz/activity.linfo2
-rw-r--r--locale/el/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1426 bytes
-rw-r--r--locale/el/activity.linfo2
-rw-r--r--locale/en/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/en/activity.linfo2
-rw-r--r--locale/en_US/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1127 bytes
-rw-r--r--locale/en_US/activity.linfo2
-rw-r--r--locale/es/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1248 bytes
-rw-r--r--locale/es/activity.linfo2
-rw-r--r--locale/fa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1199 bytes
-rw-r--r--locale/fa/activity.linfo2
-rw-r--r--locale/fa_AF/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1198 bytes
-rw-r--r--locale/fa_AF/activity.linfo2
-rw-r--r--locale/ff/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ff/activity.linfo2
-rw-r--r--locale/fi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/fi/activity.linfo2
-rw-r--r--locale/fil/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/fil/activity.linfo2
-rw-r--r--locale/fr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1902 bytes
-rw-r--r--locale/fr/activity.linfo2
-rw-r--r--locale/gu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/gu/activity.linfo2
-rw-r--r--locale/ha/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ha/activity.linfo2
-rw-r--r--locale/he/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/he/activity.linfo2
-rw-r--r--locale/hi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 2439 bytes
-rw-r--r--locale/hi/activity.linfo2
-rw-r--r--locale/ht/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1098 bytes
-rw-r--r--locale/ht/activity.linfo2
-rw-r--r--locale/hu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/hu/activity.linfo2
-rw-r--r--locale/id/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/id/activity.linfo2
-rw-r--r--locale/ig/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ig/activity.linfo2
-rw-r--r--locale/is/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 888 bytes
-rw-r--r--locale/is/activity.linfo2
-rw-r--r--locale/it/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1892 bytes
-rw-r--r--locale/it/activity.linfo2
-rw-r--r--locale/ja/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1918 bytes
-rw-r--r--locale/ja/activity.linfo2
-rw-r--r--locale/km/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1291 bytes
-rw-r--r--locale/km/activity.linfo2
-rw-r--r--locale/ko/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ko/activity.linfo2
-rw-r--r--locale/kos/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/kos/activity.linfo2
-rw-r--r--locale/mg/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1416 bytes
-rw-r--r--locale/mg/activity.linfo2
-rw-r--r--locale/mi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/mi/activity.linfo2
-rw-r--r--locale/mk/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 997 bytes
-rw-r--r--locale/mk/activity.linfo2
-rw-r--r--locale/ml/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ml/activity.linfo2
-rw-r--r--locale/mn/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 2250 bytes
-rw-r--r--locale/mn/activity.linfo2
-rw-r--r--locale/mr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1332 bytes
-rw-r--r--locale/mr/activity.linfo2
-rw-r--r--locale/ms/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/ms/activity.linfo2
-rw-r--r--locale/mvo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/mvo/activity.linfo2
-rw-r--r--locale/nb/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 937 bytes
-rw-r--r--locale/nb/activity.linfo2
-rw-r--r--locale/ne/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1450 bytes
-rw-r--r--locale/ne/activity.linfo2
-rw-r--r--locale/nl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1937 bytes
-rw-r--r--locale/nl/activity.linfo2
-rw-r--r--locale/pa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/pa/activity.linfo2
-rw-r--r--locale/pap/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1090 bytes
-rw-r--r--locale/pap/activity.linfo2
-rw-r--r--locale/pis/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/pis/activity.linfo2
-rw-r--r--locale/pl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 908 bytes
-rw-r--r--locale/pl/activity.linfo2
-rw-r--r--locale/ps/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1114 bytes
-rw-r--r--locale/ps/activity.linfo2
-rw-r--r--locale/pt/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1936 bytes
-rw-r--r--locale/pt/activity.linfo2
-rw-r--r--locale/pt_BR/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1113 bytes
-rw-r--r--locale/pt_BR/activity.linfo2
-rw-r--r--locale/qu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/qu/activity.linfo2
-rw-r--r--locale/ro/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1004 bytes
-rw-r--r--locale/ro/activity.linfo2
-rw-r--r--locale/ru/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1157 bytes
-rw-r--r--locale/ru/activity.linfo2
-rw-r--r--locale/rw/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1155 bytes
-rw-r--r--locale/rw/activity.linfo2
-rw-r--r--locale/sd/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 463 bytes
-rw-r--r--locale/sd/activity.linfo2
-rw-r--r--locale/si/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1369 bytes
-rw-r--r--locale/si/activity.linfo2
-rw-r--r--locale/sk/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/sk/activity.linfo2
-rw-r--r--locale/sl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1170 bytes
-rw-r--r--locale/sl/activity.linfo2
-rw-r--r--locale/sq/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/sq/activity.linfo2
-rw-r--r--locale/sv/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1154 bytes
-rw-r--r--locale/sv/activity.linfo2
-rw-r--r--locale/sw/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/sw/activity.linfo2
-rw-r--r--locale/ta/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 3036 bytes
-rw-r--r--locale/ta/activity.linfo2
-rw-r--r--locale/te/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1450 bytes
-rw-r--r--locale/te/activity.linfo2
-rw-r--r--locale/th/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1133 bytes
-rw-r--r--locale/th/activity.linfo2
-rw-r--r--locale/tpi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/tpi/activity.linfo2
-rw-r--r--locale/tr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1147 bytes
-rw-r--r--locale/tr/activity.linfo2
-rw-r--r--locale/tvl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/tvl/activity.linfo2
-rw-r--r--locale/tzo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/tzo/activity.linfo2
-rw-r--r--locale/ug/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/ug/activity.linfo2
-rw-r--r--locale/ur/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1237 bytes
-rw-r--r--locale/ur/activity.linfo2
-rw-r--r--locale/vi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1893 bytes
-rw-r--r--locale/vi/activity.linfo2
-rw-r--r--locale/wa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 407 bytes
-rw-r--r--locale/wa/activity.linfo2
-rw-r--r--locale/yo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 404 bytes
-rw-r--r--locale/yo/activity.linfo2
-rw-r--r--locale/zh_CN/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1036 bytes
-rw-r--r--locale/zh_CN/activity.linfo2
-rw-r--r--locale/zh_TW/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mobin0 -> 1828 bytes
-rw-r--r--locale/zh_TW/activity.linfo2
-rw-r--r--po/Read.pot81
-rw-r--r--po/af.po84
-rw-r--r--po/am.po85
-rw-r--r--po/ar.po154
-rw-r--r--po/ay.po85
-rw-r--r--po/bg.po86
-rw-r--r--po/bi.po89
-rw-r--r--po/bn.po80
-rw-r--r--po/bn_IN.po83
-rw-r--r--po/ca.po80
-rw-r--r--po/cpp.po89
-rw-r--r--po/cs.po89
-rw-r--r--po/da.po150
-rw-r--r--po/de.po157
-rw-r--r--po/dz.po81
-rw-r--r--po/el.po92
-rw-r--r--po/en.po85
-rw-r--r--po/en_US.po88
-rw-r--r--po/es.po105
-rw-r--r--po/fa.po81
-rw-r--r--po/fa_AF.po81
-rw-r--r--po/ff.po81
-rw-r--r--po/fi.po89
-rw-r--r--po/fil.po140
-rw-r--r--po/fr.po150
-rw-r--r--po/gu.po85
-rw-r--r--po/ha.po85
-rw-r--r--po/he.po89
-rw-r--r--po/hi.po150
-rw-r--r--po/ht.po84
-rw-r--r--po/hu.po89
-rw-r--r--po/id.po148
-rw-r--r--po/ig.po85
-rw-r--r--po/is.po81
-rw-r--r--po/it.po153
-rw-r--r--po/ja.po147
-rw-r--r--po/km.po84
-rw-r--r--po/ko.po81
-rw-r--r--po/kos.po148
-rw-r--r--po/mg.po150
-rw-r--r--po/mi.po89
-rw-r--r--po/mk.po83
-rw-r--r--po/ml.po81
-rw-r--r--po/mn.po149
-rw-r--r--po/mr.po84
-rw-r--r--po/ms.po89
-rw-r--r--po/mvo.po85
-rw-r--r--po/nb.po88
-rw-r--r--po/ne.po91
-rw-r--r--po/nl.po152
-rw-r--r--po/pa.po81
-rw-r--r--po/pap.po84
-rw-r--r--po/pis.po85
-rw-r--r--po/pl.po85
-rw-r--r--po/ps.po80
-rw-r--r--po/pseudo.po70
-rw-r--r--po/pt.po162
-rw-r--r--po/pt_BR.po85
-rw-r--r--po/qu.po85
-rw-r--r--po/ro.po84
-rw-r--r--po/ru.po84
-rw-r--r--po/rw.po86
-rw-r--r--po/sd.po84
-rw-r--r--po/si.po80
-rw-r--r--po/sk.po89
-rw-r--r--po/sl.po88
-rw-r--r--po/sq.po148
-rw-r--r--po/sv.po88
-rw-r--r--po/sw.po89
-rw-r--r--po/ta.po151
-rw-r--r--po/te.po84
-rw-r--r--po/th.po84
-rw-r--r--po/tpi.po85
-rw-r--r--po/tr.po84
-rw-r--r--po/tvl.po140
-rw-r--r--po/tzo.po148
-rw-r--r--po/ug.po89
-rw-r--r--po/ur.po87
-rw-r--r--po/vi.po147
-rw-r--r--po/wa.po89
-rw-r--r--po/yo.po85
-rw-r--r--po/zh_CN.po76
-rw-r--r--po/zh_TW.po143
-rw-r--r--readdb.py881
-rw-r--r--readdialog.py289
-rw-r--r--readsidebar.py329
-rw-r--r--readtoolbar.py320
-rw-r--r--readtopbar.py204
-rwxr-xr-xsetup.py21
273 files changed, 13460 insertions, 0 deletions
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..3bb3b51
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,266 @@
+readdialog.py
+README
+annotation.svg
+epubadapter.py
+annobookmark.py
+readtopbar.py
+readsidebar.py
+annoactivity.py
+anno_v1.db
+readtoolbar.py
+setup.py
+readdb.py
+epubview/__init__.py
+epubview/epub.py
+epubview/widgets.py
+epubview/jobs.py
+epubview/epubview.py
+epubview/navmap.py
+epubview/epubinfo.py
+locale/mr/activity.linfo
+locale/mr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/he/activity.linfo
+locale/he/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/qu/activity.linfo
+locale/qu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/kos/activity.linfo
+locale/kos/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ug/activity.linfo
+locale/ug/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/dz/activity.linfo
+locale/dz/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/nl/activity.linfo
+locale/nl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ml/activity.linfo
+locale/ml/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/bg/activity.linfo
+locale/bg/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/es/activity.linfo
+locale/es/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ff/activity.linfo
+locale/ff/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/gu/activity.linfo
+locale/gu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ms/activity.linfo
+locale/ms/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/yo/activity.linfo
+locale/yo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/zh_TW/activity.linfo
+locale/zh_TW/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/sq/activity.linfo
+locale/sq/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/mg/activity.linfo
+locale/mg/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/pap/activity.linfo
+locale/pap/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/fa_AF/activity.linfo
+locale/fa_AF/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/af/activity.linfo
+locale/af/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/sl/activity.linfo
+locale/sl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/pt_BR/activity.linfo
+locale/pt_BR/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/si/activity.linfo
+locale/si/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/rw/activity.linfo
+locale/rw/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/cs/activity.linfo
+locale/cs/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/te/activity.linfo
+locale/te/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ur/activity.linfo
+locale/ur/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/km/activity.linfo
+locale/km/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/en_US/activity.linfo
+locale/en_US/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/wa/activity.linfo
+locale/wa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/is/activity.linfo
+locale/is/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/pl/activity.linfo
+locale/pl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/hu/activity.linfo
+locale/hu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ro/activity.linfo
+locale/ro/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/pt/activity.linfo
+locale/pt/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/sd/activity.linfo
+locale/sd/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/hi/activity.linfo
+locale/hi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/th/activity.linfo
+locale/th/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/mn/activity.linfo
+locale/mn/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/bn/activity.linfo
+locale/bn/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/el/activity.linfo
+locale/el/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ay/activity.linfo
+locale/ay/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/tzo/activity.linfo
+locale/tzo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/en/activity.linfo
+locale/en/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ps/activity.linfo
+locale/ps/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/zh_CN/activity.linfo
+locale/zh_CN/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/de/activity.linfo
+locale/de/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/vi/activity.linfo
+locale/vi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ru/activity.linfo
+locale/ru/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/bn_IN/activity.linfo
+locale/bn_IN/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ca/activity.linfo
+locale/ca/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ta/activity.linfo
+locale/ta/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/tpi/activity.linfo
+locale/tpi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/tr/activity.linfo
+locale/tr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ne/activity.linfo
+locale/ne/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/sv/activity.linfo
+locale/sv/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/bi/activity.linfo
+locale/bi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ht/activity.linfo
+locale/ht/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ha/activity.linfo
+locale/ha/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/fr/activity.linfo
+locale/fr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/id/activity.linfo
+locale/id/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/mvo/activity.linfo
+locale/mvo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ig/activity.linfo
+locale/ig/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/it/activity.linfo
+locale/it/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/fi/activity.linfo
+locale/fi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/da/activity.linfo
+locale/da/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/pa/activity.linfo
+locale/pa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/mk/activity.linfo
+locale/mk/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/mi/activity.linfo
+locale/mi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/tvl/activity.linfo
+locale/tvl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/fil/activity.linfo
+locale/fil/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ar/activity.linfo
+locale/ar/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/am/activity.linfo
+locale/am/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/fa/activity.linfo
+locale/fa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/cpp/activity.linfo
+locale/cpp/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/sk/activity.linfo
+locale/sk/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/pis/activity.linfo
+locale/pis/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ja/activity.linfo
+locale/ja/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/ko/activity.linfo
+locale/ko/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/sw/activity.linfo
+locale/sw/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+locale/nb/activity.linfo
+locale/nb/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
+activity/activity.info
+activity/activity-anno.svg
+activity/mimetypes.xml
+po/ps.po
+po/pis.po
+po/ha.po
+po/fr.po
+po/mvo.po
+po/zh_CN.po
+po/qu.po
+po/sl.po
+po/pl.po
+po/en.po
+po/ay.po
+po/tpi.po
+po/sd.po
+po/th.po
+po/tzo.po
+po/rw.po
+po/ta.po
+po/ne.po
+po/ht.po
+po/fi.po
+po/pap.po
+po/mi.po
+po/km.po
+po/is.po
+po/ko.po
+po/fil.po
+po/sv.po
+po/hi.po
+po/ff.po
+po/it.po
+po/tr.po
+po/bg.po
+po/mg.po
+po/el.po
+po/sk.po
+po/te.po
+po/da.po
+po/am.po
+po/ug.po
+po/ro.po
+po/id.po
+po/gu.po
+po/cpp.po
+po/pt.po
+po/ca.po
+po/es.po
+po/si.po
+po/pa.po
+po/ig.po
+po/ml.po
+po/ur.po
+po/hu.po
+po/mk.po
+po/en_US.po
+po/ar.po
+po/vi.po
+po/kos.po
+po/fa.po
+po/zh_TW.po
+po/sw.po
+po/ru.po
+po/Read.pot
+po/dz.po
+po/bi.po
+po/yo.po
+po/he.po
+po/mr.po
+po/fa_AF.po
+po/wa.po
+po/de.po
+po/bn_IN.po
+po/ms.po
+po/sq.po
+po/mn.po
+po/nb.po
+po/ja.po
+po/tvl.po
+po/cs.po
+po/nl.po
+po/af.po
+po/bn.po
+po/pt_BR.po
diff --git a/activity/activity-anno.svg b/activity/activity-anno.svg
new file mode 100644
index 0000000..775225c
--- /dev/null
+++ b/activity/activity-anno.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="55px"
+ version="1.1"
+ viewBox="0 0 55 55"
+ width="55px"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="activity-read.svg"><metadata
+ id="metadata17"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs15"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 27.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="55 : 27.5 : 1"
+ inkscape:persp3d-origin="27.5 : 18.333333 : 1"
+ id="perspective19" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="784"
+ inkscape:window-height="868"
+ id="namedview13"
+ showgrid="false"
+ inkscape:zoom="4.2909091"
+ inkscape:cx="27.5"
+ inkscape:cy="27.033898"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" /><g
+ display="block"
+ id="activity-read">
+ <path
+ d="M27.904,11.023h-0.002 c0-0.002-1.71-2.053-9.376-2.504C10.86,8.07,6.843,10.121,6.84,10.122c-1.898,0.619-3.495,1.735-3.495,3.494v27.702 c0,2.025,1.235,3.494,3.495,3.494c0.003,0,4.41-1.35,10.004-1.35c5.589-0.001,11.061,2.253,11.061,2.253"
+ display="inline"
+ fill="#FFFFFF"
+ stroke="#010101"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ id="path5" />
+ <path
+ d="M27.898,11.023 L27.898,11.023c0-0.002,1.715-2.053,9.377-2.504c7.668-0.449,11.686,1.602,11.688,1.603c1.897,0.619,3.494,1.735,3.494,3.494 v27.702c0,2.025-1.233,3.494-3.494,3.494c-0.003,0-4.409-1.35-10.004-1.35c-5.589-0.001-11.062,2.253-11.062,2.253"
+ display="inline"
+ fill="#FFFFFF"
+ stroke="#010101"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ id="path7" />
+
+ <line
+ display="inline"
+ fill="none"
+ stroke="#010101"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ x1="27.898"
+ x2="27.9"
+ y1="11.023"
+ y2="45.717"
+ id="line9" />
+ <path
+ d=" M32.566,44.275c0,0-0.031,2.906-4.666,2.906c-4.632,0-4.663-2.906-4.663-2.906"
+ display="inline"
+ fill="none"
+ stroke="#010101"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ id="path11" />
+</g><text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="34.258476"
+ y="30.762712"
+ id="text2825"><tspan
+ sodipodi:role="line"
+ id="tspan2827"
+ x="34.258476"
+ y="30.762712"
+ style="font-size:16;-inkscape-font-specification:cmr10;font-family:cmr10">A</tspan></text>
+</svg> \ No newline at end of file
diff --git a/activity/activity.info b/activity/activity.info
new file mode 100644
index 0000000..de7c48c
--- /dev/null
+++ b/activity/activity.info
@@ -0,0 +1,9 @@
+[Activity]
+name = Anno
+service_name = org.laptop.sugar.AnnoActivity
+icon = activity-anno
+exec = sugar-activity annoactivity.AnnoActivity
+show_launcher = no
+activity_version = 1
+mime_types = application/pdf;image/vnd.djvu;image/x.djvu;image/tiff;application/x-cbz;application/x-cbr;application/epub+zip
+license = GPLv2+
diff --git a/activity/mimetypes.xml b/activity/mimetypes.xml
new file mode 100644
index 0000000..5c27572
--- /dev/null
+++ b/activity/mimetypes.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/epub+zip">
+ <comment xml:lang="en">Epub document</comment>
+ <glob pattern="*.epub"/>
+ </mime-type>
+</mime-info>
diff --git a/anno_v1.db b/anno_v1.db
new file mode 100644
index 0000000..fac21dd
--- /dev/null
+++ b/anno_v1.db
Binary files differ
diff --git a/annoactivity.py b/annoactivity.py
new file mode 100644
index 0000000..e5a3bbc
--- /dev/null
+++ b/annoactivity.py
@@ -0,0 +1,1033 @@
+# Copyright (C) 2007, Red Hat, Inc.
+# Copyright (C) 2007 Collabora Ltd. <http://www.collabora.co.uk/>
+# Copyright 2008 One Laptop Per Child
+# Copyright 2009 Simon Schampijer
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import logging
+import os
+import time
+from gettext import gettext as _
+import re
+import md5
+
+import dbus
+import evince
+import gobject
+import gtk
+import pango
+from glib import GError
+import telepathy
+
+from sugar.activity import activity
+from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.toolbarbox import ToolbarBox
+from sugar.graphics.toolbarbox import ToolbarButton
+from sugar.graphics.toggletoolbutton import ToggleToolButton
+from sugar.graphics.menuitem import MenuItem
+from sugar.activity.widgets import ActivityToolbarButton
+from sugar.activity.widgets import StopButton
+from sugar import network
+from sugar import mime
+
+from jarabe.journal import journalactivity
+from sugar.datastore import datastore
+from sugar.graphics.objectchooser import ObjectChooser
+
+from readtoolbar import EditToolbar, ViewToolbar
+from readsidebar import Sidebar
+from readtopbar import TopBar
+
+
+_EPUB_SUPPORT = True
+try:
+ import epubadapter
+except:
+ _EPUB_SUPPORT = False
+
+
+_HARDWARE_MANAGER_INTERFACE = 'org.laptop.HardwareManager'
+_HARDWARE_MANAGER_SERVICE = 'org.laptop.HardwareManager'
+_HARDWARE_MANAGER_OBJECT_PATH = '/org/laptop/HardwareManager'
+
+_TOOLBAR_READ = 2
+
+_logger = logging.getLogger('anno-activity')
+
+def _get_screen_dpi():
+ xft_dpi = gtk.settings_get_default().get_property('gtk-xft-dpi')
+ _logger.debug('Setting dpi to %f', float(xft_dpi / 1024))
+ return float(xft_dpi / 1024)
+
+def get_md5(filename): #FIXME: Should be moved somewhere else
+ filename = filename.replace('file://', '') #XXX: hack
+ fh = open(filename)
+ digest = md5.new()
+ while 1:
+ buf = fh.read(4096)
+ if buf == "":
+ break
+ digest.update(buf)
+ fh.close()
+ return digest.hexdigest()
+
+class AnnoHTTPRequestHandler(network.ChunkedGlibHTTPRequestHandler):
+ """HTTP Request Handler for transferring document while collaborating.
+
+ RequestHandler class that integrates with Glib mainloop. It writes
+ the specified file to the client in chunks, returning control to the
+ mainloop between chunks.
+
+ """
+ def translate_path(self, path):
+ """Return the filepath to the shared document."""
+ return self.server.filepath
+
+
+class AnnoHTTPServer(network.GlibTCPServer):
+ """HTTP Server for transferring document while collaborating."""
+ def __init__(self, server_address, filepath):
+ """Set up the GlibTCPServer with the AnnoHTTPRequestHandler.
+
+ filepath -- path to shared document to be served.
+ """
+ self.filepath = filepath
+ network.GlibTCPServer.__init__(self, server_address,
+ AnnoHTTPRequestHandler)
+
+
+class AnnoURLDownloader(network.GlibURLDownloader):
+ """URLDownloader that provides content-length and content-type."""
+
+ def get_content_length(self):
+ """Return the content-length of the download."""
+ if self._info is not None:
+ return int(self._info.headers.get('Content-Length'))
+
+ def get_content_type(self):
+ """Return the content-type of the download."""
+ if self._info is not None:
+ return self._info.headers.get('Content-type')
+ return None
+
+
+READ_STREAM_SERVICE = 'anno-activity-http'
+
+class AnnoActivity(activity.Activity):
+ """The Anno sugar activity."""
+ def __init__(self, handle):
+ activity.Activity.__init__(self, handle)
+
+ if hasattr(evince, 'evince_embed_init'):
+ # if we use evince-2.24
+ evince.evince_embed_init()
+
+ self._epub = False
+ self._document = None
+ self._fileserver = None
+ self._object_id = handle.object_id
+ self._url = ''
+
+ self.connect('key-press-event', self._key_press_event_cb)
+ self.connect('key-release-event', self._key_release_event_cb)
+ self.connect('window-state-event', self._window_state_event_cb)
+
+ _logger.debug('Starting Anno...')
+
+ self._view = None
+
+ self._sidebar = Sidebar()
+ self._sidebar.show()
+
+ toolbar_box = ToolbarBox()
+
+ activity_button = ActivityToolbarButton(self)
+ toolbar_box.toolbar.insert(activity_button, 0)
+ activity_button.show()
+
+ self._edit_toolbar = EditToolbar()
+ self._edit_toolbar.undo.props.visible = False
+ self._edit_toolbar.redo.props.visible = False
+ self._edit_toolbar.separator.props.visible = False
+ self._edit_toolbar.copy.set_sensitive(False)
+ self._edit_toolbar.copy.connect('clicked', self._edit_toolbar_copy_cb)
+ self._edit_toolbar.paste.props.visible = False
+
+ edit_toolbar_button = ToolbarButton(
+ page=self._edit_toolbar,
+ icon_name='toolbar-edit')
+ self._edit_toolbar.show()
+ toolbar_box.toolbar.insert(edit_toolbar_button, -1)
+ edit_toolbar_button.show()
+
+ self._view_toolbar = ViewToolbar()
+ self._view_toolbar.connect('needs-update-size',
+ self.__view_toolbar_needs_update_size_cb)
+ self._view_toolbar.connect('go-fullscreen',
+ self.__view_toolbar_go_fullscreen_cb)
+ view_toolbar_button = ToolbarButton(
+ page=self._view_toolbar,
+ icon_name='toolbar-view')
+ self._view_toolbar.show()
+ toolbar_box.toolbar.insert(view_toolbar_button, -1)
+ view_toolbar_button.show()
+
+ self._back_button = self._create_back_button()
+ toolbar_box.toolbar.insert(self._back_button, -1)
+ self._back_button.show()
+
+ self._forward_button = self._create_forward_button()
+ toolbar_box.toolbar.insert(self._forward_button, -1)
+ self._forward_button.show()
+
+ num_page_item = gtk.ToolItem()
+ self._num_page_entry = self._create_search()
+ num_page_item.add(self._num_page_entry)
+ self._num_page_entry.show()
+ toolbar_box.toolbar.insert(num_page_item, -1)
+ num_page_item.show()
+
+ total_page_item = gtk.ToolItem()
+ self._total_page_label = self._create_total_page_label()
+ total_page_item.add(self._total_page_label)
+ self._total_page_label.show()
+ toolbar_box.toolbar.insert(total_page_item, -1)
+ total_page_item.show()
+
+ spacer = gtk.SeparatorToolItem()
+ spacer.props.draw = False
+ toolbar_box.toolbar.insert(spacer, -1)
+ spacer.show()
+
+ navigator_toolbar = gtk.Toolbar()
+ navigator_item = gtk.ToolItem()
+ self._navigator = self._create_navigator()
+ navigator_item.add(self._navigator)
+ self._navigator.show()
+ navigator_toolbar.insert(navigator_item, -1)
+ navigator_item.show()
+ self._navigator_toolbar_button = ToolbarButton(page=navigator_toolbar,
+ icon_name='view-list')
+ navigator_toolbar.show()
+ toolbar_box.toolbar.insert(self._navigator_toolbar_button, -1)
+ #navigator_toolbar_button.show()
+
+ spacer = gtk.SeparatorToolItem()
+ spacer.props.draw = False
+ toolbar_box.toolbar.insert(spacer, -1)
+ spacer.show()
+
+ annotator_item = gtk.ToolItem()
+ self._annotator = self._create_annotator()
+ self._annotator_toggle_handler_id = self._annotator.connect( \
+ 'toggled', self.__annotator_toggled_cb)
+ annotator_item.add(self._annotator)
+ self._annotator.show()
+ toolbar_box.toolbar.insert(annotator_item, -1)
+ annotator_item.show()
+
+ annotator_syncer_item = gtk.ToolItem()
+ self._annotator_syncer = self._create_annotator_syncer()
+ self._annotator_syncer_toggle_handler_id = self._annotator_syncer.connect( \
+ 'toggled', self.__annotator_syncer_toggled_cb)
+ annotator_syncer_item.add(self._annotator_syncer)
+ self._annotator_syncer.show()
+ toolbar_box.toolbar.insert(annotator_syncer_item, -1)
+ annotator_syncer_item.show()
+
+
+ annotator_downloader_item = gtk.ToolItem()
+ self._annotator_downloader = self._create_annotator_downloader()
+ self._annotator_downloader_toggle_handler_id = self._annotator_downloader.connect( \
+ 'toggled', self.__annotator_downloader_toggled_cb)
+ annotator_downloader_item.add(self._annotator_downloader)
+ self._annotator_downloader.show()
+ toolbar_box.toolbar.insert(annotator_downloader_item, -1)
+ annotator_downloader_item.show()
+
+ stop_button = StopButton(self)
+ stop_button.props.accelerator = '<Ctrl><Shift>Q'
+ toolbar_box.toolbar.insert(stop_button, -1)
+ stop_button.show()
+
+ self.set_toolbar_box(toolbar_box)
+ toolbar_box.show()
+
+ self._vbox = gtk.VBox()
+ self._vbox.show()
+
+ self._topbar = TopBar()
+ self._vbox.pack_start(self._topbar, expand = False, fill = False)
+
+ self._hbox = gtk.HBox()
+ self._hbox.show()
+ self._hbox.pack_start(self._sidebar, expand=False, fill=False)
+
+ self._vbox.pack_start(self._hbox, expand = True, fill = True)
+ self.set_canvas(self._vbox)
+
+ # Set up for idle suspend
+ self._idle_timer = 0
+ self._service = None
+
+ # start with sleep off
+ self._sleep_inhibit = True
+
+ self.unused_download_tubes = set()
+ self._want_document = True
+ self._download_content_length = 0
+ self._download_content_type = None
+ # Status of temp file used for write_file:
+ self._tempfile = None
+ self._close_requested = False
+
+ self._journal = journalactivity.get_journal()
+
+
+ fname = os.path.join('/etc', 'inhibit-ebook-sleep')
+ if not os.path.exists(fname):
+ try:
+ bus = dbus.SystemBus()
+ proxy = bus.get_object(_HARDWARE_MANAGER_SERVICE,
+ _HARDWARE_MANAGER_OBJECT_PATH)
+ self._service = dbus.Interface(proxy,
+ _HARDWARE_MANAGER_INTERFACE)
+ self._scrolled.props.vadjustment.connect("value-changed",
+ self._user_action_cb)
+ self._scrolled.props.hadjustment.connect("value-changed",
+ self._user_action_cb)
+ self.connect("focus-in-event", self._focus_in_event_cb)
+ self.connect("focus-out-event", self._focus_out_event_cb)
+ self.connect("notify::active", self._now_active_cb)
+
+ _logger.debug('Suspend on idle enabled')
+ except dbus.DBusException, e:
+ _logger.info(
+ 'Hardware manager service not found, no idle suspend.')
+ else:
+ _logger.debug('Suspend on idle disabled')
+
+ self.connect("shared", self._shared_cb)
+
+ h = hash(self._activity_id)
+ self.port = 1024 + (h % 64511)
+
+
+ if handle.uri:
+ self._load_document(handle.uri)
+
+ if self.shared_activity:
+ # We're joining
+ if self.get_shared():
+ # Already joined for some reason, just get the document
+ self._joined_cb(self)
+ else:
+ # Wait for a successful join before trying to get the document
+ self.connect("joined", self._joined_cb)
+ elif self._object_id is None:
+ # Not joining, not resuming
+ self._show_journal_object_picker()
+ # uncomment this and adjust the path for easier testing
+ #else:
+ # self._load_document('file:///home/smcv/tmp/test.pdf')
+
+ def _create_back_button(self):
+ back = ToolButton('go-previous')
+ back.set_tooltip(_('Back'))
+ back.props.sensitive = False
+ palette = back.get_palette()
+ previous_page = MenuItem(text_label= _("Previous page"))
+ palette.menu.append(previous_page)
+ previous_page.show_all()
+ previous_annotation = MenuItem(text_label= _("Previous annotation"))
+ palette.menu.append(previous_annotation)
+ previous_annotation.show_all()
+ back.connect('clicked', self.__go_back_cb)
+ previous_page.connect('activate', self.__go_back_page_cb)
+ previous_annotation.connect('activate', self.__prev_annotation_activate_cb)
+ return back
+
+ def _create_forward_button(self):
+ forward = ToolButton('go-next')
+ forward.set_tooltip(_('Forward'))
+ forward.props.sensitive = False
+ palette = forward.get_palette()
+ next_page = MenuItem(text_label= _("Next page"))
+ palette.menu.append(next_page)
+ next_page.show_all()
+ next_annotation = MenuItem(text_label= _("Next annotation"))
+ palette.menu.append(next_annotation)
+ next_annotation.show_all()
+ forward.connect('clicked', self.__go_forward_cb)
+ next_page.connect('activate', self.__go_forward_page_cb)
+ next_annotation.connect('activate', self.__next_annotation_activate_cb)
+ return forward
+
+ def _create_search(self):
+ num_page_entry = gtk.Entry()
+ num_page_entry.set_text('0')
+ num_page_entry.set_alignment(1)
+ num_page_entry.connect('insert-text',
+ self.__num_page_entry_insert_text_cb)
+ num_page_entry.connect('activate',
+ self.__num_page_entry_activate_cb)
+ num_page_entry.set_width_chars(4)
+ return num_page_entry
+
+ def _create_total_page_label(self):
+ total_page_label = gtk.Label()
+
+ label_attributes = pango.AttrList()
+ label_attributes.insert(pango.AttrSize(14000, 0, -1))
+ label_attributes.insert(pango.AttrForeground(65535, 65535,
+ 65535, 0, -1))
+ total_page_label.set_attributes(label_attributes)
+
+ total_page_label.set_text(' / 0')
+ return total_page_label
+
+ def _create_navigator(self):
+ navigator = gtk.ComboBox()
+ navigator.set_add_tearoffs(True)
+ cell = gtk.CellRendererText()
+ navigator.pack_start(cell, True)
+ navigator.add_attribute(cell, 'text', 0)
+ navigator.props.visible = False
+ return navigator
+
+ def _create_annotator(self):
+ annotator = ToggleToolButton('emblem-favorite')
+ annotator.set_tooltip(_('Add annotation'))
+ return annotator
+
+ def _create_annotator_syncer(self):
+ syncer = ToggleToolButton('go-up')
+ syncer.set_tooltip(_('Sync annotations'))
+ return syncer
+
+ def _create_annotator_downloader(self):
+ downloader = ToggleToolButton('go-down')
+ downloader.set_tooltip(_('Download annotations'))
+ return downloader
+
+
+ def __num_page_entry_insert_text_cb(self, entry, text, length, position):
+ if not re.match('[0-9]', text):
+ entry.emit_stop_by_name('insert-text')
+ return True
+ return False
+
+ def __num_page_entry_activate_cb(self, entry):
+ if entry.props.text:
+ page = int(entry.props.text) - 1
+ else:
+ page = 0
+
+ if page >= self._document.get_n_pages():
+ page = self._document.get_n_pages() - 1
+ elif page < 0:
+ page = 0
+
+ self._document.get_page_cache().set_current_page(page)
+ entry.props.text = str(page + 1)
+
+ def __go_back_cb(self, button):
+ self._view.scroll(gtk.SCROLL_PAGE_BACKWARD, False)
+
+ def __go_forward_cb(self, button):
+ self._view.scroll(gtk.SCROLL_PAGE_FORWARD, False)
+
+ def __go_back_page_cb(self, button):
+ self._view.previous_page()
+
+ def __go_forward_page_cb(self, button):
+ self._view.next_page()
+
+ def __prev_annotation_activate_cb(self, menuitem):
+ page = self._document.get_page_cache().get_current_page()
+ annomanager = self._sidebar.get_annotationmanager()
+
+ prev_anno = annomanager.get_prev_annotation(page)
+ if prev_anno is not None:
+ _logger.debug('prev annotation page is %d' % prev_anno.page)
+ self._document.get_page_cache().set_current_page(prev_anno.page + 1)
+
+
+
+ def __next_annotation_activate_cb(self, menuitem):
+ page = self._document.get_page_cache().get_current_page()
+ annomanager = self._sidebar.get_annotationmanager()
+
+ next_anno= annomanager.get_next_annotation(page)
+
+ if next_anno is not None:
+ _logger.debug('next annotation page is %d' % next_anno.page)
+ self._document.get_page_cache().set_current_page(next_anno.page + 1)
+
+
+
+ def __bookmarker_toggled_cb(self, button):
+ page = self._document.get_page_cache().get_current_page()
+ if self._bookmarker.props.active:
+ self._sidebar.add_bookmark(page)
+ else:
+ self._sidebar.del_bookmark(page)
+
+ def __annotator_toggled_cb(self, button):
+ page = self._document.get_page_cache().get_current_page()
+ if self._annotator.props.active:
+ self._sidebar.add_annotation(page)
+ else:
+ self._sidebar.del_annotation(page)
+
+ def __annotator_syncer_toggled_cb(self, button):
+ self._sidebar.sync_annotations()
+
+
+ def __annotator_downloader_toggled_cb(self, button):
+ self._sidebar.download_annotations()
+
+
+ def __page_changed_cb(self, page, proxy = None):
+ self._update_nav_buttons()
+ if hasattr(self._document, 'has_document_links'):
+ if self._document.has_document_links():
+ self._toc_select_active_page()
+
+ self._sidebar.update_for_page(self._document.get_page_cache().get_current_page())
+
+ self._annotator.handler_block(self._annotator_toggle_handler_id)
+ self._annotator.props.active = self._sidebar.is_showing_local_bookmark()
+ self._annotator.handler_unblock(self._annotator_toggle_handler_id)
+
+ def _update_nav_buttons(self):
+ current_page = self._document.get_page_cache().get_current_page()
+ self._back_button.props.sensitive = current_page > 0
+ self._forward_button.props.sensitive = \
+ current_page < self._document.get_n_pages() - 1
+
+ self._num_page_entry.props.text = str(current_page + 1)
+ self._total_page_label.props.label = \
+ ' / ' + str(self._document.get_n_pages())
+
+ def _update_toc(self):
+ if hasattr(self._document, 'has_document_links'):
+ if self._document.has_document_links():
+ self._navigator_toolbar_button.show()
+ self._navigator.show_all()
+
+ self._toc_model = self._document.get_links_model()
+ self._navigator.set_model(self._toc_model)
+ self._navigator.set_active(0)
+
+ self._navigator_changed_handler_id = \
+ self._navigator.connect('changed',
+ self.__navigator_changed_cb)
+
+ self._toc_select_active_page()
+
+ def __navigator_changed_cb(self, combobox):
+ iter = self._navigator.get_active_iter()
+
+ link = self._toc_model.get(iter, 1)[0]
+ self._view.handle_link(link)
+
+ def _toc_select_active_page_foreach(self, model, path, iter, current_page):
+ link = self._toc_model.get(iter, 1)[0]
+
+ if not hasattr(link, 'get_page'):
+ #FIXME: This needs to be implemented in epubadapter, not here
+ filepath = self._view.get_current_file()
+ if filepath.endswith(link):
+ self._navigator.set_active_iter(iter)
+ return True
+ else:
+ if current_page == link.get_page():
+ self._navigator.set_active_iter(iter)
+ return True
+
+ return False
+
+ def _toc_select_active_page(self):
+ iter = self._navigator.get_active_iter()
+
+ current_link = self._toc_model.get(iter, 1)[0]
+ current_page = self._document.get_page_cache().get_current_page()
+
+
+ if not hasattr(current_link, 'get_page'):
+ filepath = self._view.get_current_file()
+ if filepath is None or filepath.endswith(current_link):
+ return
+ else:
+ if current_link.get_page() == current_page:
+ return
+
+ self._navigator.handler_block(self._navigator_changed_handler_id)
+ self._toc_model.foreach(self._toc_select_active_page_foreach, current_page)
+ self._navigator.handler_unblock(self._navigator_changed_handler_id)
+
+ def _show_journal_object_picker(self):
+ """Show the journal object picker to load a document.
+
+ This is for if Anno is launched without a document.
+ """
+ if not self._want_document:
+ return
+ chooser = ObjectChooser(_('Choose document'), self,
+ gtk.DIALOG_MODAL |
+ gtk.DIALOG_DESTROY_WITH_PARENT,
+ what_filter=mime.GENERIC_TYPE_TEXT)
+ try:
+ result = chooser.run()
+ if result == gtk.RESPONSE_ACCEPT:
+ logging.debug('ObjectChooser: %r' %
+ chooser.get_selected_object())
+ jobject = chooser.get_selected_object()
+ if jobject and jobject.file_path:
+ self.read_file(jobject.file_path)
+ properties = jobject.metadata.get_dictionary().copy()
+ self._url = properties['url']
+ finally:
+ chooser.destroy()
+ del chooser
+
+ def _now_active_cb(self, widget, pspec):
+ if self.props.active:
+ # Now active, start initial suspend timeout
+ if self._idle_timer > 0:
+ gobject.source_remove(self._idle_timer)
+ self._idle_timer = gobject.timeout_add_seconds(15, self._suspend_cb)
+ self._sleep_inhibit = False
+ else:
+ # Now inactive
+ self._sleep_inhibit = True
+
+ def _focus_in_event_cb(self, widget, event):
+ """Enable ebook mode idle sleep since Anno has focus."""
+ self._sleep_inhibit = False
+ self._user_action_cb(self)
+
+ def _focus_out_event_cb(self, widget, event):
+ """Disable ebook mode idle sleep since Anno lost focus."""
+ self._sleep_inhibit = True
+
+ def _user_action_cb(self, widget):
+ """Set a timer for going back to ebook mode idle sleep."""
+ if self._idle_timer > 0:
+ gobject.source_remove(self._idle_timer)
+ self._idle_timer = gobject.timeout_add_seconds(5, self._suspend_cb)
+
+ def _suspend_cb(self):
+ """Go into ebook mode idle sleep."""
+ # If the machine has been idle for 5 seconds, suspend
+ self._idle_timer = 0
+ if not self._sleep_inhibit and not self.get_shared():
+ self._service.set_kernel_suspend()
+ return False
+
+ def read_file(self, file_path):
+ """Load a file from the datastore on activity start."""
+ _logger.debug('AnnoActivity.read_file: %s', file_path)
+ extension = os.path.splitext(file_path)[1]
+ tempfile = os.path.join(self.get_activity_root(), 'instance',
+ 'tmp%i%s' % (time.time(), extension))
+ os.link(file_path, tempfile)
+ self._tempfile = tempfile
+ self._load_document('file://' + self._tempfile)
+
+ # FIXME: This should obviously be fixed properly
+ gobject.timeout_add_seconds(1, self.__view_toolbar_needs_update_size_cb,
+ None)
+
+ def write_file(self, file_path):
+ """Write into datastore for Keep.
+
+ The document is saved by hardlinking from the temporary file we
+ keep around instead of "saving".
+
+ The metadata is updated, including current page, view settings,
+ search text.
+
+ """
+ if self._tempfile is None:
+ # Workaround for closing Anno with no document loaded
+ raise NotImplementedError
+
+ try:
+ self.metadata['Anno_current_page'] = \
+ str(self._document.get_page_cache().get_current_page())
+
+ self.metadata['Anno_zoom'] = str(self._view.props.zoom)
+ self.metadata['url'] = self._url
+
+ if not self._epub:
+ if self._view.props.sizing_mode == evince.SIZING_BEST_FIT:
+ self.metadata['Anno_sizing_mode'] = "best-fit"
+ elif self._view.props.sizing_mode == evince.SIZING_FREE:
+ self.metadata['Anno_sizing_mode'] = "free"
+ elif self._view.props.sizing_mode == evince.SIZING_FIT_WIDTH:
+ self.metadata['Anno_sizing_mode'] = "fit-width"
+ else:
+ _logger.error("Don't know how to save sizing_mode state '%s'" %
+ self._view.props.sizing_mode)
+ self.metadata['Anno_sizing_mode'] = "fit-width"
+
+ self.metadata['Anno_search'] = \
+ self._edit_toolbar._search_entry.props.text
+
+ except Exception, e:
+ _logger.error('write_file(): %s', e)
+
+ self.metadata['Anno_search'] = \
+ self._edit_toolbar._search_entry.props.text
+ self.metadata['activity'] = self.get_bundle_id()
+ self.metadata['url'] = self._url
+ _logger.debug(str('set url to %s' % self._url))
+
+ os.link(self._tempfile, file_path)
+
+ if self._close_requested:
+ _logger.debug("Removing temp file %s because we will close",
+ self._tempfile)
+ os.unlink(self._tempfile)
+ self._tempfile = None
+
+ def can_close(self):
+ """Prepare to cleanup on closing.
+
+ Called from self.close()
+ """
+ self._close_requested = True
+ return True
+
+ def _download_result_cb(self, getter, tempfile, suggested_name, tube_id):
+ if self._download_content_type == 'text/html':
+ # got an error page instead
+ self._download_error_cb(getter, 'HTTP Error', tube_id)
+ return
+
+ del self.unused_download_tubes
+
+ self._tempfile = tempfile
+ file_path = os.path.join(self.get_activity_root(), 'instance',
+ '%i' % time.time())
+ _logger.debug("Saving file %s to datastore...", file_path)
+ os.link(tempfile, file_path)
+ self._jobject.file_path = file_path
+ datastore.write(self._jobject, transfer_ownership=True)
+
+ _logger.debug("Got document %s (%s) from tube %u",
+ tempfile, suggested_name, tube_id)
+ self._load_document("file://%s" % tempfile)
+ self.save()
+
+ def _download_progress_cb(self, getter, bytes_downloaded, tube_id):
+ # FIXME: Draw a progress bar
+ if self._download_content_length > 0:
+ _logger.debug("Downloaded %u of %u bytes from tube %u...",
+ bytes_downloaded, self._download_content_length,
+ tube_id)
+ else:
+ _logger.debug("Downloaded %u bytes from tube %u...",
+ bytes_downloaded, tube_id)
+
+ def _download_error_cb(self, getter, err, tube_id):
+ _logger.debug("Error getting document from tube %u: %s",
+ tube_id, err)
+ self._want_document = True
+ self._download_content_length = 0
+ self._download_content_type = None
+ gobject.idle_add(self._get_document)
+
+ def _download_document(self, tube_id, path):
+ # FIXME: should ideally have the CM listen on a Unix socket
+ # instead of IPv4 (might be more compatible with Rainbow)
+ chan = self.shared_activity.telepathy_tubes_chan
+ iface = chan[telepathy.CHANNEL_TYPE_TUBES]
+ addr = iface.AcceptStreamTube(tube_id,
+ telepathy.SOCKET_ADDRESS_TYPE_IPV4,
+ telepathy.SOCKET_ACCESS_CONTROL_LOCALHOST, 0,
+ utf8_strings=True)
+ _logger.debug('Accepted stream tube: listening address is %r', addr)
+ # SOCKET_ADDRESS_TYPE_IPV4 is defined to have addresses of type '(sq)'
+ assert isinstance(addr, dbus.Struct)
+ assert len(addr) == 2
+ assert isinstance(addr[0], str)
+ assert isinstance(addr[1], (int, long))
+ assert addr[1] > 0 and addr[1] < 65536
+ port = int(addr[1])
+
+ getter = AnnoURLDownloader("http://%s:%d/document"
+ % (addr[0], port))
+ getter.connect("finished", self._download_result_cb, tube_id)
+ getter.connect("progress", self._download_progress_cb, tube_id)
+ getter.connect("error", self._download_error_cb, tube_id)
+ _logger.debug("Starting download to %s...", path)
+ getter.start(path)
+ self._download_content_length = getter.get_content_length()
+ self._download_content_type = getter.get_content_type()
+ return False
+
+ def _get_document(self):
+ if not self._want_document:
+ return False
+
+ # Assign a file path to download if one doesn't exist yet
+ if not self._jobject.file_path:
+ path = os.path.join(self.get_activity_root(), 'instance',
+ 'tmp%i' % time.time())
+ else:
+ path = self._jobject.file_path
+
+ # Pick an arbitrary tube we can try to download the document from
+ try:
+ tube_id = self.unused_download_tubes.pop()
+ except (ValueError, KeyError), e:
+ _logger.debug('No tubes to get the document from right now: %s',
+ e)
+ return False
+
+ # Avoid trying to download the document multiple times at once
+ self._want_document = False
+ gobject.idle_add(self._download_document, tube_id, path)
+ return False
+
+ def _joined_cb(self, also_self):
+ """Callback for when a shared activity is joined.
+
+ Get the shared document from another participant.
+ """
+ self.watch_for_tubes()
+ gobject.idle_add(self._get_document)
+
+ def _setup_epub_viewer(self):
+ self._view = epubadapter.View()
+ self._view.set_screen_dpi(_get_screen_dpi())
+ self._view.connect('notify::has-selection',
+ self._view_notify_has_selection_cb)
+
+ self._hbox.pack_start(self._view, expand=True, fill=True)
+ self._view.show_all()
+
+ def _setup_evince_viewer(self):
+ self._view = evince.View()
+ self._view.set_screen_dpi(_get_screen_dpi())
+ self._view.connect('notify::has-selection',
+ self._view_notify_has_selection_cb)
+
+ self._scrolled = gtk.ScrolledWindow()
+ self._scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ self._scrolled.props.shadow_type = gtk.SHADOW_NONE
+
+ self._scrolled.add(self._view)
+ self._view.show()
+
+ self._hbox.pack_start(self._scrolled, expand=True, fill=True)
+ self._scrolled.show()
+
+
+ def _load_document(self, filepath):
+ """Load the specified document and set up the UI.
+
+ filepath -- string starting with file://
+
+ """
+ _logger.debug('_load_document filepath: %s ' % filepath )
+ mimetype = mime.get_for_file(filepath)
+ if mimetype == 'application/epub+zip':
+ if not _EPUB_SUPPORT:
+ self.close()
+ self._epub = True
+ self._setup_epub_viewer()
+ self._document = epubadapter.EpubDocument(self._view, filepath.replace('file://', ''))
+ else:
+ self._setup_evince_viewer()
+ #get the url from the object in the journal that matches this file path
+
+ try:
+ self._document = evince.factory_get_document(filepath)
+ except GError, e:
+ _logger.error('Can not load document: %s', e)
+ return
+
+ self._view_toolbar.set_view(self._view)
+ self._edit_toolbar.set_view(self._view)
+
+ self._want_document = False
+ self._view.set_document(self._document)
+ self._edit_toolbar.set_document(self._document)
+ self._topbar.set_document(self._document)
+
+ filehash = get_md5(filepath)
+ self._sidebar.set_bookmarkmanager(filehash)
+ self._sidebar.set_annotationmanager(filehash, mimetype)
+
+ self._update_nav_buttons()
+ self._update_toc()
+
+ page_cache = self._document.get_page_cache()
+ page_cache.connect('page-changed', self.__page_changed_cb)
+
+ if not self.metadata['title_set_by_user'] == '1':
+ info = self._document.get_info()
+ if info and info.title:
+ self.metadata['title'] = info.title
+
+ if not self._epub:
+ sizing_mode = self.metadata.get('Anno_sizing_mode', 'fit-width')
+ _logger.debug('Found sizing mode: %s', sizing_mode)
+ if sizing_mode == "best-fit":
+ self._view.props.sizing_mode = evince.SIZING_BEST_FIT
+ if hasattr(self._view, 'update_view_size'):
+ self._view.update_view_size(self._scrolled)
+ elif sizing_mode == "free":
+ self._view.props.sizing_mode = evince.SIZING_FREE
+ self._view.props.zoom = float(self.metadata.get('Anno_zoom', '1.0'))
+ _logger.debug('Set zoom to %f', self._view.props.zoom)
+ elif sizing_mode == "fit-width":
+ self._view.props.sizing_mode = evince.SIZING_FIT_WIDTH
+ if hasattr(self._view, 'update_view_size'):
+ self._view.update_view_size(self._scrolled)
+ else:
+ # this may happen when we get a document from a buddy with a later
+ # version of Anno, for example.
+ _logger.warning("Unknown sizing_mode state '%s'", sizing_mode)
+ if self.metadata.get('Anno_zoom', None) is not None:
+ self._view.props.zoom = float(self.metadata['Anno_zoom'])
+
+ self._view_toolbar._update_zoom_buttons()
+
+ self._edit_toolbar._search_entry.props.text = \
+ self.metadata.get('Anno_search', '')
+
+ current_page = int(self.metadata.get('Anno_current_page', '0'))
+ _logger.debug('Setting page to: %d', current_page)
+ self._document.get_page_cache().set_current_page(current_page)
+
+ # We've got the document, so if we're a shared activity, offer it
+ try:
+ if self.get_shared():
+ self.watch_for_tubes()
+ self._share_document()
+ except Exception, e:
+ _logger.debug('Sharing failed: %s', e)
+
+ def _share_document(self):
+ """Share the document."""
+ # FIXME: should ideally have the fileserver listen on a Unix socket
+ # instead of IPv4 (might be more compatible with Rainbow)
+
+ _logger.debug('Starting HTTP server on port %d', self.port)
+ self._fileserver = AnnoHTTPServer(("", self.port),
+ self._tempfile)
+
+ # Make a tube for it
+ chan = self.shared_activity.telepathy_tubes_chan
+ iface = chan[telepathy.CHANNEL_TYPE_TUBES]
+ self._fileserver_tube_id = iface.OfferStreamTube(READ_STREAM_SERVICE,
+ {},
+ telepathy.SOCKET_ADDRESS_TYPE_IPV4,
+ ('127.0.0.1', dbus.UInt16(self.port)),
+ telepathy.SOCKET_ACCESS_CONTROL_LOCALHOST, 0)
+
+ def watch_for_tubes(self):
+ """Watch for new tubes."""
+ tubes_chan = self.shared_activity.telepathy_tubes_chan
+
+ tubes_chan[telepathy.CHANNEL_TYPE_TUBES].connect_to_signal('NewTube',
+ self._new_tube_cb)
+ tubes_chan[telepathy.CHANNEL_TYPE_TUBES].ListTubes(
+ reply_handler=self._list_tubes_reply_cb,
+ error_handler=self._list_tubes_error_cb)
+
+ def _new_tube_cb(self, tube_id, initiator, tube_type, service, params,
+ state):
+ """Callback when a new tube becomes available."""
+ _logger.debug('New tube: ID=%d initator=%d type=%d service=%s '
+ 'params=%r state=%d', tube_id, initiator, tube_type,
+ service, params, state)
+ if self._document is None and service == READ_STREAM_SERVICE:
+ _logger.debug('I could download from that tube')
+ self.unused_download_tubes.add(tube_id)
+ # if no download is in progress, let's fetch the document
+ if self._want_document:
+ gobject.idle_add(self._get_document)
+
+ def _list_tubes_reply_cb(self, tubes):
+ """Callback when new tubes are available."""
+ for tube_info in tubes:
+ self._new_tube_cb(*tube_info)
+
+ def _list_tubes_error_cb(self, e):
+ """Handle ListTubes error by logging."""
+ _logger.error('ListTubes() failed: %s', e)
+
+ def _shared_cb(self, activityid):
+ """Callback when activity shared.
+
+ Set up to share the document.
+
+ """
+ # We initiated this activity and have now shared it, so by
+ # definition we have the file.
+ _logger.debug('Activity became shared')
+ self.watch_for_tubes()
+ self._share_document()
+
+ def _view_notify_has_selection_cb(self, view, pspec):
+ self._edit_toolbar.copy.set_sensitive(self._view.props.has_selection)
+
+ def _edit_toolbar_copy_cb(self, button):
+ self._view.copy()
+
+ def _key_press_event_cb(self, widget, event):
+ keyname = gtk.gdk.keyval_name(event.keyval)
+ if keyname == 'c' and event.state & gtk.gdk.CONTROL_MASK:
+ self._view.copy()
+ return True
+ elif keyname == 'KP_Home':
+ # FIXME: refactor later to self.zoom_in()
+ self._view_toolbar.zoom_in()
+ return True
+ elif keyname == 'KP_End':
+ self._view_toolbar.zoom_out()
+ return True
+ else:
+ return False
+
+ def _key_release_event_cb(self, widget, event):
+ #keyname = gtk.gdk.keyval_name(event.keyval)
+ #_logger.debug("Keyname Release: %s, time: %s", keyname, event.time)
+ return False
+
+ def _window_state_event_cb(self, window, event):
+ if not (event.changed_mask & gtk.gdk.WINDOW_STATE_FULLSCREEN):
+ return False
+
+ if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
+ self._topbar.show_all()
+ else:
+ self._topbar.hide()
+
+ def __view_toolbar_needs_update_size_cb(self, view_toolbar):
+ if hasattr(self._view, 'update_view_size'):
+ self._view.update_view_size(self._scrolled)
+ else:
+ return False # No need to run this again and again
+
+ def __view_toolbar_go_fullscreen_cb(self, view_toolbar):
+ self.fullscreen()
diff --git a/annobookmark.py b/annobookmark.py
new file mode 100644
index 0000000..b1d7468
--- /dev/null
+++ b/annobookmark.py
@@ -0,0 +1,181 @@
+# Copyright 2009 One Laptop Per Child
+# Author: Sayamindu Dasgupta <sayamindu@laptop.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import cjson
+import logging
+
+_logger = logging.getLogger('anno-activity')
+
+
+class Bookmark:
+ def __init__(self, data):
+ self.md5 = data[0]
+ self.page_no = data[1]
+ self.content = data[2]
+ self.timestamp = data[3]
+ self.nick = data[4]
+ self.color = data[5]
+ self.local = data[6]
+
+ def belongstopage(self, page_no):
+ return self.page_no == page_no
+
+ def is_local(self):
+ return bool(self.local)
+
+ def get_note_title(self):
+ if self.content == '' or self.content is None:
+ return ''
+
+ note = cjson.decode(self.content)
+ return note['title']
+
+ def get_note_body(self):
+ if self.content == '' or self.content is None:
+ return ''
+
+ note = cjson.decode(self.content)
+ return note['body']
+
+
+
+
+class AnnoBookmark:
+ def __init__(self, data):
+ self.id = data[0]
+ self.md5 = data[1]
+ self.page = data[2]
+ self.title = data[3]
+ self.content = data[4]
+ self.bodyurl = data[5]
+ self.context = data[6]
+ self.created = data[7]
+ self.modified = data[8]
+ self.creator = data[9]
+ self.annotates = data[10]
+ self.rdf = data[11]
+ self.color = data[12]
+ self.local = data[13]
+ self.mimetype = data[14]
+ self.uuid = data[15]
+ self.annotationurl = data[16]
+ self.bodysvg = data[17]
+ if ( ( self.uuid == None ) or ( len( self.uuid ) == 0 ) ) and ( self.md5 != None ) and ( self.id != None ):
+ self.uuid = "urn:sugaruuid:" + self.creator + "-" + self.md5 + "-" + str(self.id)
+ _logger.debug('annobookmark annotates is %s' % self.annotates)
+
+
+ def __str__(self):
+ r = str( "A bookmark: id: %s \nuuid: %s" % ( str( self.id ), self.uuid ) )
+ r += str( "\nmd5: %s" % str( self.md5 ) )
+ r += str( "\npage: %d\ntitle: %s" % ( self.page, self.title ) )
+ r += str( "\ncontent: %s" % self.content )
+ r += str( "\nbodyurl: %s \nannotationurl: %s" % ( self.bodyurl, self.annotationurl ) )
+ r += str( "\ncontext: %s \ncreated: %s" % ( self.context, str( self.created ) ) )
+ r += str( "\nmodified: %s \ncreator: %s" % ( str( self.modified ), self.creator ) )
+ r += str( "\nannotates: %s \nmimetype: %s" % ( self.annotates, self.mimetype ) )
+ r += str( "\nrdf: %s" % self.rdf )
+ r += str( "\ncolor: %s \nlocal: %s" % ( str( self.color ), str( self.local ) ) )
+ r += str( "\nbodysvg: %s" % self.bodysvg )
+ return r
+
+
+ def belongstopage(self, page):
+ return self.page == page
+
+ def is_local(self):
+ return bool(self.local)
+
+ def set_note_title(self, note_title):
+ self.title = note_title
+
+ def get_note_title(self):
+ if self.title == '' or self.title is None:
+ return ''
+ return self.title
+
+ def set_note_body(self, note_content):
+ self.content = note_content
+
+ def get_note_body(self):
+ if self.content == '' or self.content is None:
+ return ''
+ return self.content
+
+ def set_bodysvg(self, bodysvg):
+ self.bodysvg = bodysvg
+
+
+ def get_bodysvg(self):
+ return self.bodysvg
+
+ def get_id(self):
+ return self.id
+
+ def set_modified(self, modified):
+ self.modified = modified
+
+ def get_modified(self):
+ return self.modified
+
+ def get_page(self):
+ return self.page
+
+ def get_bodyurl(self):
+ return self.bodyurl
+
+ def set_bodyurl(self, url):
+ self.bodyurl = url
+
+ def get_annotationurl(self):
+ return self.annotationurl
+
+ def set_annotationurl(self, url):
+ self.annotationurl = url
+
+ def get_context(self):
+ return self.context
+
+ def get_created(self):
+ return self.created
+
+ def get_creator(self):
+ return self.creator
+
+ def get_target(self):
+ return self.get_annotates()
+
+ def get_annotates(self):
+ return self.annotates
+
+ def get_rdf(self):
+ return self.rdf
+
+ def set_rdf(self, rdf):
+ self.rdf = rdf
+
+ def get_color(self):
+ return self.color
+
+ def get_mimetype(self):
+ return self.mimetype
+
+ def get_filehash(self):
+ return self.md5
+
+ def get_uuid(self):
+ return self.uuid
diff --git a/epubadapter.py b/epubadapter.py
new file mode 100644
index 0000000..cfb50d2
--- /dev/null
+++ b/epubadapter.py
@@ -0,0 +1,64 @@
+import gobject
+import logging
+
+import epubview
+
+_logger = logging.getLogger('anno-activity')
+
+class View(epubview.EpubView):
+ def __init__(self):
+ epubview.EpubView.__init__(self)
+
+ def _try_load_page(self, n):
+ if self._ready:
+ self._load_page(n)
+ return False
+ else:
+ return True
+
+ def set_screen_dpi(self, dpi):
+ return
+
+ def find_set_highlight_search(self, set_highlight_search):
+ return
+
+ def set_current_page(self, n):
+ # When the book is being loaded, calling this does not help
+ # In such a situation, we go into a loop and try to load the
+ # supplied page when the book has loaded completely
+ n += 1
+ if self._ready:
+ self._load_page(n)
+ else:
+ gobject.timeout_add(200, self._try_load_page, n)
+
+ def get_current_page(self):
+ return int(self._loaded_page - 1)
+
+ def find_changed(self, job, page = None):
+ self._find_changed(job)
+
+ def handle_link(self, link):
+ self._load_file(link)
+
+
+class EpubDocument(epubview.Epub):
+ def __init__(self, view, docpath):
+ epubview.Epub.__init__(self, docpath)
+ self._page_cache = view
+
+ def get_page_cache(self):
+ return self._page_cache
+
+ def get_n_pages(self):
+ return int(self._page_cache.get_pagecount())
+
+ def has_document_links(self):
+ return True
+
+ def get_links_model(self):
+ return self.get_toc_model()
+
+class JobFind(epubview.JobFind):
+ def __init__(self, document, start_page, n_pages, text, case_sensitive=False):
+ epubview.JobFind.__init__(self, document, start_page, n_pages, text, case_sensitive=False)
diff --git a/epubview/__init__.py b/epubview/__init__.py
new file mode 100644
index 0000000..81a3175
--- /dev/null
+++ b/epubview/__init__.py
@@ -0,0 +1,24 @@
+# Copyright 2009 One Laptop Per Child
+# Author: Sayamindu Dasgupta <sayamindu@laptop.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import gobject
+
+gobject.threads_init()
+
+from epub import _Epub as Epub
+from epubview import _View as EpubView
+from jobs import _JobFind as JobFind \ No newline at end of file
diff --git a/epubview/__init__.pyc b/epubview/__init__.pyc
new file mode 100644
index 0000000..2c23dd5
--- /dev/null
+++ b/epubview/__init__.pyc
Binary files differ
diff --git a/epubview/epub.py b/epubview/epub.py
new file mode 100644
index 0000000..71267aa
--- /dev/null
+++ b/epubview/epub.py
@@ -0,0 +1,152 @@
+# Copyright 2009 One Laptop Per Child
+# Author: Sayamindu Dasgupta <sayamindu@laptop.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import zipfile
+import tempfile
+import os, os.path
+from lxml import etree
+import shutil
+
+import navmap, epubinfo
+
+
+class _Epub(object):
+ def __init__(self, filepath):
+ self._filepath = filepath
+ self._zobject = None
+ self._opfpath = None
+ self._ncxpath = None
+ self._basepath = None
+ self._tempdir = tempfile.mkdtemp()
+
+ if not self._verify():
+ print 'Warning: This does not seem to be a valid epub file'
+
+ self._get_opf()
+ self._get_ncx()
+
+ ncxfile = self._zobject.open(self._ncxpath)
+ opffile = self._zobject.open(self._opfpath)
+ self._navmap = navmap.NavMap(opffile, ncxfile, self._basepath)
+
+ opffile = self._zobject.open(self._opfpath)
+ self._info = epubinfo.EpubInfo(opffile)
+
+ self._unzip()
+
+ def _unzip(self):
+ #self._zobject.extractall(path = self._tempdir) # This is broken upto python 2.7
+ orig_cwd = os.getcwd()
+ os.chdir(self._tempdir)
+ for name in self._zobject.namelist():
+ if name.startswith(os.path.sep): # Some weird zip file entries start with a slash, and we don't want to write to the root directory
+ name = name[1:]
+ if name.endswith(os.path.sep) or name.endswith('\\'):
+ os.makedirs(name)
+ else:
+ self._zobject.extract(name)
+ os.chdir(orig_cwd)
+
+
+ def _get_opf(self):
+ containerfile = self._zobject.open('META-INF/container.xml')
+
+ tree = etree.parse(containerfile)
+ root = tree.getroot()
+
+ for element in root.iterfind('.//{urn:oasis:names:tc:opendocument:xmlns:container}rootfile'):
+ if element.get('media-type') == 'application/oebps-package+xml':
+ self._opfpath = element.get('full-path')
+
+ if self._opfpath.rpartition('/')[0]:
+ self._basepath = self._opfpath.rpartition('/')[0] + '/'
+ else:
+ self._basepath = ''
+
+ containerfile.close()
+
+
+ def _get_ncx(self):
+ opffile = self._zobject.open(self._opfpath)
+
+ tree = etree.parse(opffile)
+ root = tree.getroot()
+
+ spine = root.find('.//{http://www.idpf.org/2007/opf}spine')
+ tocid = spine.get('toc')
+
+ for element in root.iterfind('.//{http://www.idpf.org/2007/opf}item'):
+ if element.get('id') == tocid:
+ self._ncxpath = self._basepath + element.get('href')
+
+ opffile.close()
+
+ def _verify(self):
+ '''
+ Method to crudely check to verify that what we
+ are dealing with is a epub file or not
+ '''
+ if not os.path.exists(self._filepath):
+ return False
+
+ self._zobject = zipfile.ZipFile(self._filepath)
+
+ if not 'mimetype' in self._zobject.namelist():
+ return False
+
+ mtypefile = self._zobject.open('mimetype')
+ mimetype = mtypefile.readline()
+
+ if not mimetype.startswith('application/epub+zip'): # Some files seem to have trailing characters
+ return False
+
+ return True
+
+ def get_toc_model(self):
+ '''
+ Returns a GtkTreeModel representation of the
+ Epub table of contents
+ '''
+ return self._navmap.get_gtktreestore()
+
+ def get_flattoc(self):
+ '''
+ Returns a flat (linear) list of files to be
+ rendered.
+ '''
+ return self._navmap.get_flattoc()
+
+ def get_basedir(self):
+ '''
+ Returns the base directory where the contents of the
+ epub has been unzipped
+ '''
+ return self._tempdir
+
+ def get_info(self):
+ '''
+ Returns a EpubInfo object for the open Epub file
+ '''
+ return self._info
+
+ def close(self):
+ '''
+ Cleans up (closes open zip files and deletes uncompressed content of Epub.
+ Please call this when a file is being closed or during application exit.
+ '''
+ self._zobject.close()
+ shutil.rmtree(self._tempdir)
diff --git a/epubview/epub.pyc b/epubview/epub.pyc
new file mode 100644
index 0000000..ad0d223
--- /dev/null
+++ b/epubview/epub.pyc
Binary files differ
diff --git a/epubview/epubinfo.py b/epubview/epubinfo.py
new file mode 100644
index 0000000..d25dfc2
--- /dev/null
+++ b/epubview/epubinfo.py
@@ -0,0 +1,90 @@
+import os
+from lxml import etree
+
+
+class EpubInfo(): #TODO: Cover the entire DC range
+ def __init__(self, opffile):
+ self._tree = etree.parse(opffile)
+ self._root = self._tree.getroot()
+ self._e_metadata = self._root.find('{http://www.idpf.org/2007/opf}metadata')
+
+ self.title = self._get_title()
+ self.creator = self._get_creator()
+ self.date = self._get_date()
+ self.subject = self._get_subject()
+ self.source = self._get_source()
+ self.rights = self._get_rights()
+ self.identifier = self._get_identifier()
+ self.language = self._get_language()
+
+
+ def _get_data(self, tagname):
+ element = self._e_metadata.find(tagname)
+ return element.text
+
+ def _get_title(self):
+ try:
+ ret = self._get_data('.//{http://purl.org/dc/elements/1.1/}title')
+ except AttributeError:
+ return None
+
+ return ret
+
+ def _get_creator(self):
+ try:
+ ret = self._get_data('.//{http://purl.org/dc/elements/1.1/}creator')
+ except AttributeError:
+ return None
+ return ret
+
+ def _get_date(self):
+ #TODO: iter
+ try:
+ ret = self._get_data('.//{http://purl.org/dc/elements/1.1/}date')
+ except AttributeError:
+ return None
+
+ return ret
+
+ def _get_source(self):
+ try:
+ ret = self._get_data('.//{http://purl.org/dc/elements/1.1/}source')
+ except AttributeError:
+ return None
+
+ return ret
+
+ def _get_rights(self):
+ try:
+ ret = self._get_data('.//{http://purl.org/dc/elements/1.1/}rights')
+ except AttributeError:
+ return None
+
+ return ret
+
+ def _get_identifier(self):
+ #TODO: iter
+ element = self._e_metadata.find('.//{http://purl.org/dc/elements/1.1/}identifier')
+
+ if element is not None:
+ return {'id':element.get('id'), 'value':element.text}
+ else:
+ return None
+
+ def _get_language(self):
+ try:
+ ret = self._get_data('.//{http://purl.org/dc/elements/1.1/}language')
+ except AttributeError:
+ return None
+
+ return ret
+
+ def _get_subject(self):
+ try:
+ subjectlist = []
+ for element in self._e_metadata.iterfind('.//{http://purl.org/dc/elements/1.1/}subject'):
+ subjectlist.append(element.text)
+ except AttributeError:
+ return None
+
+ return subjectlist \ No newline at end of file
diff --git a/epubview/epubinfo.pyc b/epubview/epubinfo.pyc
new file mode 100644
index 0000000..fdf1ad8
--- /dev/null
+++ b/epubview/epubinfo.pyc
Binary files differ
diff --git a/epubview/epubview.py b/epubview/epubview.py
new file mode 100644
index 0000000..595eb20
--- /dev/null
+++ b/epubview/epubview.py
@@ -0,0 +1,563 @@
+# Copyright 2009 One Laptop Per Child
+# Author: Sayamindu Dasgupta <sayamindu@laptop.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import gtk, gtk.gdk
+import gobject
+import widgets
+
+import os.path
+import math
+import shutil
+
+from epub import _Epub
+from jobs import _JobPaginator as _Paginator
+
+
+LOADING_HTML = '''
+<div style="width:100%;height:100%;text-align:center;padding-top:50%;">
+ <h1>Loading...</h1>
+</div>
+'''
+
+class _View(gtk.HBox):
+ __gproperties__ = {
+ 'has-selection' : (gobject.TYPE_BOOLEAN, 'whether has selection',
+ 'whether the widget has selection or not',
+ 0, gobject.PARAM_READABLE),
+ 'zoom' : (gobject.TYPE_FLOAT, 'the zoom level',
+ 'the zoom level of the widget',
+ 0.5, 4.0, 1.0, gobject.PARAM_READWRITE)
+ }
+ __gsignals__ = {
+ 'page-changed': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([]))
+ }
+ def __init__(self):
+ gobject.threads_init()
+ gtk.HBox.__init__(self)
+
+ self.connect("destroy", self._destroy_cb)
+
+ self._ready = False
+ self._paginator = None
+ self._loaded_page = -1
+ #self._old_scrollval = -1
+ self._loaded_filename = None
+ self._pagecount = -1
+ self.__going_fwd = True
+ self.__going_back = False
+ self.__page_changed = False
+ self.has_selection = False
+ self.zoom = 1.0
+ self._epub = None
+ self._findjob = None
+ self.__in_search = False
+ self.__search_fwd = True
+
+ self._sw = gtk.ScrolledWindow()
+ self._view = widgets._WebView()
+ self._view.load_string(LOADING_HTML, 'text/html', 'utf-8', '/')
+ settings = self._view.get_settings()
+ settings.props.default_font_family = 'DejaVu LGC Serif'
+ settings.props.enable_plugins = False
+ settings.props.default_encoding = 'utf-8'
+ self._view.connect('load-finished', self._view_load_finished_cb)
+ self._view.connect('scroll-event', self._view_scroll_event_cb)
+ self._view.connect('key-press-event', self._view_keypress_event_cb)
+ self._view.connect('button-release-event', self._view_buttonrelease_event_cb)
+ self._view.connect('selection-changed', self._view_selection_changed_cb)
+ self._view.connect_after('populate-popup', self._view_populate_popup_cb)
+
+ self._sw.add(self._view)
+ self._sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER)
+ self._v_vscrollbar = self._sw.get_vscrollbar()
+ self._v_scrollbar_value_changed_cb_id = self._v_vscrollbar.connect('value-changed', \
+ self._v_scrollbar_value_changed_cb)
+ self._scrollbar = gtk.VScrollbar()
+ self._scrollbar.set_update_policy(gtk.UPDATE_DISCONTINUOUS)
+ self._scrollbar_change_value_cb_id = self._scrollbar.connect('change-value', \
+ self._scrollbar_change_value_cb)
+ self.pack_start(self._sw, expand = True, fill = True)
+ self.pack_start(self._scrollbar, expand = False, fill = False)
+
+ self._view.set_flags(gtk.CAN_DEFAULT|gtk.CAN_FOCUS)
+
+ def set_document(self, epubdocumentinstance):
+ '''
+ Sets document (should be a Epub instance)
+ '''
+ self._epub = epubdocumentinstance
+ gobject.idle_add(self._paginate)
+
+ def do_get_property(self, property):
+ if property.name == 'has-selection':
+ return self.has_selection
+ elif property.name == 'zoom':
+ return self.zoom
+ else:
+ raise AttributeError, 'unknown property %s' % property.name
+
+ def do_set_property(self, property, value):
+ if property.name == 'zoom':
+ self.__set_zoom(value)
+ else:
+ raise AttributeError, 'unknown property %s' % property.name
+
+ def get_has_selection(self):
+ '''
+ Returns True if any part of the content is selected
+ '''
+ return self.get_property('has-selection')
+
+ def get_zoom(self):
+ '''
+ Returns the current zoom level
+ '''
+ return self.get_property('zoom')
+
+ def set_zoom(self, value):
+ '''
+ Sets the current zoom level
+ '''
+ self.set_property('zoom', value)
+
+ def zoom_in(self):
+ '''
+ Zooms in (increases zoom level by 0.1)
+ '''
+ if self.can_zoom_in():
+ self.set_zoom(self.get_zoom() + 0.1)
+ return True
+ else:
+ return False
+
+ def zoom_out(self):
+ '''
+ Zooms out (decreases zoom level by 0.1)
+ '''
+ if self.can_zoom_out():
+ self.set_zoom(self.get_zoom() - 0.1)
+ return True
+ else:
+ return False
+
+ def can_zoom_in(self):
+ '''
+ Returns True if it is possible to zoom in further
+ '''
+ if self.zoom < 4:
+ return True
+ else:
+ return False
+
+ def can_zoom_out(self):
+ '''
+ Returns True if it is possible to zoom out further
+ '''
+ if self.zoom > 0.5:
+ return True
+ else:
+ return False
+
+ def get_current_page(self):
+ '''
+ Returns the currently loaded page
+ '''
+ return self._loaded_page
+
+ def get_current_file(self):
+ '''
+ Returns the currently loaded XML file
+ '''
+ #return self._loaded_filename
+ if self._paginator:
+ return self._paginator.get_file_for_pageno(self._loaded_page)
+ else:
+ return None
+
+ def get_pagecount(self):
+ '''
+ Returns the pagecount of the loaded file
+ '''
+ return self._pagecount
+
+ def set_current_page(self, n):
+ '''
+ Loads page number n
+ '''
+ if n < 1 or n > self._pagecount:
+ return False
+ self._load_page(n)
+ return True
+
+ def next_page(self):
+ '''
+ Loads next page if possible
+ Returns True if transition to next page is possible and done
+ '''
+ if self._loaded_page == self._pagecount:
+ return False
+ self._load_next_page()
+ return True
+
+ def previous_page(self):
+ '''
+ Loads previous page if possible
+ Returns True if transition to previous page is possible and done
+ '''
+ if self._loaded_page == 1:
+ return False
+ self._load_prev_page()
+ return True
+
+ def scroll(self, scrolltype, horizontal):
+ '''
+ Scrolls through the pages.
+ Scrolling is horizontal if horizontal is set to True
+ Valid scrolltypes are: gtk.SCROLL_PAGE_BACKWARD and gtk.SCROLL_PAGE_FORWARD
+ '''
+ if scrolltype == gtk.SCROLL_PAGE_BACKWARD:
+ self.__going_back = True
+ self.__going_fwd = False
+ if not self._do_page_transition():
+ self._view.move_cursor(gtk.MOVEMENT_PAGES, -1)
+ elif scrolltype == gtk.SCROLL_PAGE_FORWARD:
+ self.__going_back = False
+ self.__going_fwd = True
+ if not self._do_page_transition():
+ self._view.move_cursor(gtk.MOVEMENT_PAGES, 1)
+ else:
+ print ('Got unsupported scrolltype %s' % str(scrolltype))
+
+ def copy(self):
+ '''
+ Copies the current selection to clipboard.
+ '''
+ self._view.copy_clipboard()
+
+ def find_next(self):
+ '''
+ Highlights the next matching item for current search
+ '''
+ self._view.grab_focus()
+ self._view.grab_default()
+
+ if self._view.search_text(self._findjob.get_search_text(), \
+ self._findjob.get_case_sensitive(), True, False):
+ return
+ else:
+ path = os.path.join(self._epub.get_basedir(), self._findjob.get_next_file())
+ self.__in_search = True
+ self.__search_fwd = True
+ self._load_file(path)
+
+ def find_previous(self):
+ '''
+ Highlights the previous matching item for current search
+ '''
+ self._view.grab_focus()
+ self._view.grab_default()
+
+ if self._view.search_text(self._findjob.get_search_text(), \
+ self._findjob.get_case_sensitive(), False, False):
+ return
+ else:
+ path = os.path.join(self._epub.get_basedir(), self._findjob.get_prev_file())
+ self.__in_search = True
+ self.__search_fwd = False
+ self._load_file(path)
+
+ def _find_changed(self, job):
+ self._view.grab_focus()
+ self._view.grab_default()
+ self._findjob = job
+ #self._view.search_text(self._findjob.get_search_text(), \
+ # self._findjob.get_case_sensitive(), True, False)
+ self.find_next()
+
+ def __set_zoom(self, value):
+ self._view.set_zoom_level(value)
+ self.zoom = value
+
+ def __set_has_selection(self, value):
+ if value != self.has_selection:
+ self.has_selection = value
+ self.notify('has-selection')
+
+ def _view_populate_popup_cb(self, view, menu):
+ menu.destroy() #HACK
+ return
+
+ def _view_selection_changed_cb(self, view):
+ # FIXME: This does not seem to be implemented in
+ # webkitgtk yet
+ print view.has_selection()
+
+ def _view_buttonrelease_event_cb(self, view, event):
+ # Ugly hack
+ self.__set_has_selection(view.can_copy_clipboard() \
+ | view.can_cut_clipboard())
+
+ def _view_keypress_event_cb(self, view, event):
+ name = gtk.gdk.keyval_name(event.keyval)
+ if name == 'Page_Down' or name == 'Down':
+ self.__going_back = False
+ self.__going_fwd = True
+ elif name == 'Page_Up' or name == 'Up':
+ self.__going_back = True
+ self.__going_fwd = False
+
+ self._do_page_transition()
+
+ def _view_scroll_event_cb(self, view, event):
+ if event.direction == gtk.gdk.SCROLL_DOWN:
+ self.__going_back = False
+ self.__going_fwd = True
+ elif event.direction == gtk.gdk.SCROLL_UP:
+ self.__going_back = True
+ self.__going_fwd = False
+
+ self._do_page_transition()
+
+ def _do_page_transition(self):
+ if self.__going_fwd:
+ if self._v_vscrollbar.get_value() >= \
+ self._v_vscrollbar.props.adjustment.props.upper - \
+ self._v_vscrollbar.props.adjustment.props.page_size:
+ self._load_next_file()
+ return True
+ elif self.__going_back:
+ if self._v_vscrollbar.get_value() == self._v_vscrollbar.props.adjustment.props.lower:
+ self._load_prev_file()
+ return True
+
+ return False
+
+ def _view_load_finished_cb(self, v, frame):
+
+ # Normally the line below would not be required - ugly workaround for
+ # possible Webkit bug. See : https://bugs.launchpad.net/bugs/483231
+ self._sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER)
+
+ filename = self._view.props.uri.replace('file://', '')
+ if os.path.exists(filename.replace('xhtml', 'xml')):
+ filename = filename.replace('xhtml', 'xml') # Hack for making javascript work
+
+ filename = filename.split('#')[0] # Get rid of anchors
+
+ if self._loaded_page < 1 or filename == None:
+ return False
+
+ self._loaded_filename = filename
+
+ remfactor = self._paginator.get_remfactor_for_file(filename)
+ pages = self._paginator.get_pagecount_for_file(filename)
+ extra = int(math.ceil(remfactor * self._view.get_page_height()/(pages-remfactor)))
+ if extra > 0:
+ self._view.add_bottom_padding(extra)
+
+ if self.__in_search:
+ self._view.search_text(self._findjob.get_search_text(), \
+ self._findjob.get_case_sensitive(), \
+ self.__search_fwd, False)
+ self.__in_search = False
+ else:
+ if self.__going_back:
+ # We need to scroll to the last page
+ self._scroll_page_end()
+ else:
+ self._scroll_page()
+
+ base_pageno = self._paginator.get_base_pageno_for_file(filename)
+ scrollval = self._v_vscrollbar.get_value()
+ scroll_upper = self._v_vscrollbar.props.adjustment.props.upper
+
+ if scroll_upper == 0: # This is a one page file
+ pageno = base_pageno
+ else:
+ offset = (scrollval/scroll_upper) * self._paginator.get_pagecount_for_file(filename)
+ pageno = math.floor(base_pageno + offset)
+
+ if pageno != self._loaded_page:
+ self._on_page_changed(int(pageno))
+
+
+ def _scroll_page_end(self):
+ v_upper = self._v_vscrollbar.props.adjustment.props.upper
+ v_page_size = self._v_vscrollbar.props.adjustment.props.page_size
+ self._v_vscrollbar.set_value(v_upper)
+
+ def _scroll_page(self):
+ pageno = self._loaded_page
+
+ v_upper = self._v_vscrollbar.props.adjustment.props.upper
+ v_page_size = self._v_vscrollbar.props.adjustment.props.page_size
+
+ scrollfactor = self._paginator.get_scrollfactor_pos_for_pageno(pageno)
+ self._v_vscrollbar.set_value((v_upper - v_page_size) * scrollfactor)
+
+ def _paginate(self):
+ filelist = []
+ for i in self._epub._navmap.get_flattoc():
+ filelist.append(os.path.join(self._epub._tempdir, i))
+
+ self._paginator = _Paginator(filelist)
+ self._paginator.connect('paginated', self._paginated_cb)
+
+ def _load_next_page(self):
+ self._load_page(self._loaded_page + 1)
+
+ def _load_prev_page(self):
+ self._load_page(self._loaded_page - 1)
+
+ def _v_scrollbar_value_changed_cb(self, scrollbar):
+ if self._loaded_page < 1:
+ return
+ scrollval = scrollbar.get_value()
+ scroll_upper = self._v_vscrollbar.props.adjustment.props.upper
+ scroll_page_size = self._v_vscrollbar.props.adjustment.props.page_size
+
+ if self.__going_fwd == True and not self._loaded_page == self._pagecount:
+ if self._paginator.get_file_for_pageno(self._loaded_page) != \
+ self._paginator.get_file_for_pageno(self._loaded_page + 1):
+ return # We don't need this if the next page is in another file
+
+ scrollfactor_next = self._paginator.get_scrollfactor_pos_for_pageno(self._loaded_page + 1)
+ if scrollval > 0:
+ scrollfactor = scrollval/(scroll_upper - scroll_page_size)
+ else:
+ scrollfactor = 0
+ if scrollfactor >= scrollfactor_next:
+ self._on_page_changed(self._loaded_page + 1)
+ elif self.__going_back == True and self._loaded_page > 1:
+ if self._paginator.get_file_for_pageno(self._loaded_page) != \
+ self._paginator.get_file_for_pageno(self._loaded_page - 1):
+ return
+
+ scrollfactor_cur = self._paginator.get_scrollfactor_pos_for_pageno(self._loaded_page)
+ if scrollval > 0:
+ scrollfactor = scrollval/(scroll_upper - scroll_page_size)
+ else:
+ scrollfactor = 0
+
+ if scrollfactor <= scrollfactor_cur:
+ self._on_page_changed(self._loaded_page - 1)
+
+ def _on_page_changed(self, pageno):
+ self.__page_changed = True
+ self._loaded_page = pageno
+ self._scrollbar.handler_block(self._scrollbar_change_value_cb_id)
+ self._scrollbar.set_value(pageno)
+ self._scrollbar.handler_unblock(self._scrollbar_change_value_cb_id)
+ self.emit('page-changed')
+
+ def _load_page(self, pageno):
+ if pageno > self._pagecount or pageno < 1:
+ #TODO: Cause an exception
+ return
+
+ self._on_page_changed(pageno)
+ filename = self._paginator.get_file_for_pageno(pageno)
+ if filename != self._loaded_filename:
+ #self._loaded_filename = filename
+ if filename.endswith('xml'):
+ dest = filename.replace('xml', 'xhtml')
+ shutil.copy(filename.replace('file://', ''), dest.replace('file://', ''))
+ self._view.open(dest)
+ else:
+ self._view.open(filename)
+ else:
+ self._scroll_page()
+
+ def _load_next_file(self):
+ if self._loaded_page == self._pagecount:
+ return
+ cur_file = self._paginator.get_file_for_pageno(self._loaded_page)
+ pageno = self._loaded_page
+ while pageno < self._paginator.get_total_pagecount():
+ pageno += 1
+ if self._paginator.get_file_for_pageno(pageno) != cur_file:
+ break
+
+ self._load_page(pageno)
+
+ def _load_file(self, path):
+ #TODO: This is a bit suboptimal - fix it
+ for pageno in range(1, self.get_pagecount()):
+ filepath = self._paginator.get_file_for_pageno(pageno)
+ if filepath.endswith(path):
+ self._load_page(pageno)
+ break
+
+ def _load_prev_file(self):
+ if self._loaded_page == 1:
+ return
+ cur_file = self._paginator.get_file_for_pageno(self._loaded_page)
+ pageno = self._loaded_page
+ while pageno > 1:
+ pageno -= 1
+ if self._paginator.get_file_for_pageno(pageno) != cur_file:
+ break
+
+ self._load_page(pageno)
+
+ def _scrollbar_change_value_cb(self, range, scrolltype, value):
+ if scrolltype == gtk.SCROLL_STEP_FORWARD:
+ self.__going_fwd = True
+ self.__going_back = False
+ if not self._do_page_transition():
+ self._view.move_cursor(gtk.MOVEMENT_DISPLAY_LINES, 1)
+ elif scrolltype == gtk.SCROLL_STEP_BACKWARD:
+ self.__going_fwd = False
+ self.__going_back = True
+ if not self._do_page_transition():
+ self._view.move_cursor(gtk.MOVEMENT_DISPLAY_LINES, -1)
+ elif scrolltype == gtk.SCROLL_JUMP or \
+ scrolltype == gtk.SCROLL_PAGE_FORWARD or \
+ scrolltype == gtk.SCROLL_PAGE_BACKWARD:
+ if value > self._scrollbar.props.adjustment.props.upper:
+ self._load_page(self._pagecount)
+ else:
+ self._load_page(round(value))
+ else:
+ print 'Warning: unknown scrolltype %s with value %f' % (str(scrolltype), value)
+
+ self._scrollbar.set_value(self._loaded_page) #FIXME: This should not be needed here
+
+ if self.__page_changed == True:
+ self.__page_changed = False
+ return False
+ else:
+ return True
+
+ def _paginated_cb(self, object):
+ self._ready = True
+
+ self._pagecount = self._paginator.get_total_pagecount()
+ self._scrollbar.set_range(1.0, self._pagecount - 1.0)
+ self._scrollbar.set_increments(1.0, 1.0)
+ self._view.grab_focus()
+ self._view.grab_default()
+ if self._loaded_page < 1:
+ self._load_page(1)
+
+
+
+ def _destroy_cb(self, widget):
+ self._epub.close()
+
diff --git a/epubview/epubview.pyc b/epubview/epubview.pyc
new file mode 100644
index 0000000..abbada9
--- /dev/null
+++ b/epubview/epubview.pyc
Binary files differ
diff --git a/epubview/jobs.py b/epubview/jobs.py
new file mode 100644
index 0000000..19c8434
--- /dev/null
+++ b/epubview/jobs.py
@@ -0,0 +1,296 @@
+# Copyright 2009 One Laptop Per Child
+# Author: Sayamindu Dasgupta <sayamindu@laptop.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+import gobject
+import gtk
+import widgets
+import cairo
+
+import math
+import os.path
+import BeautifulSoup
+
+import epub
+
+import threading
+
+PAGE_WIDTH = 135
+PAGE_HEIGHT = 216
+
+def _pixel_to_mm(pixel, dpi):
+ inches = pixel/dpi
+ return int(inches/0.03937)
+
+def _mm_to_pixel(mm, dpi):
+ inches = mm * 0.03937
+ return int(inches * dpi)
+
+
+
+class SearchThread(threading.Thread):
+ def __init__(self, obj):
+ threading.Thread.__init__ (self)
+ self.obj = obj
+ self.stopthread = threading.Event()
+
+ def _start_search(self):
+ for entry in self.obj.flattoc:
+ if self.stopthread.isSet():
+ break
+ filepath = os.path.join(self.obj._document.get_basedir(), entry)
+ f = open(filepath)
+ if self._searchfile(f):
+ self.obj._matchfilelist.append(entry)
+ f.close()
+
+ gtk.gdk.threads_enter()
+ self.obj._finished = True
+ self.obj.emit('updated')
+ gtk.gdk.threads_leave()
+
+ return False
+
+ def _searchfile(self, fileobj):
+ soup = BeautifulSoup.BeautifulSoup(fileobj)
+ body = soup.find('body')
+ tags = body.findChildren(True)
+ for tag in tags:
+ if not tag.string is None:
+ if tag.string.find(self.obj._text) > -1:
+ return True
+
+ return False
+
+ def run (self):
+ self._start_search()
+
+ def stop(self):
+ self.stopthread.set()
+
+
+
+class _JobPaginator(gobject.GObject):
+ __gsignals__ = {
+ 'paginated': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([]))
+ }
+ def __init__(self, filelist):
+ gobject.GObject.__init__(self)
+
+ self._filelist = filelist
+ self._filedict = {}
+ self._pagemap = {}
+
+ self._bookheight = 0
+ self._count = 0
+ self._pagecount = 0
+
+ self._screen = gtk.gdk.screen_get_default()
+ self._old_fontoptions = self._screen.get_font_options()
+ options = cairo.FontOptions()
+ options.set_hint_style(cairo.HINT_STYLE_MEDIUM)
+ options.set_antialias(cairo.ANTIALIAS_GRAY)
+ options.set_subpixel_order(cairo.SUBPIXEL_ORDER_DEFAULT)
+ options.set_hint_metrics(cairo.HINT_METRICS_DEFAULT)
+ self._screen.set_font_options(options)
+
+ self._temp_win = gtk.Window()
+ self._temp_view = widgets._WebView()
+
+ settings = self._temp_view.get_settings()
+ settings.props.default_font_family = 'DejaVu LGC Serif'
+ settings.props.sans_serif_font_family = 'DejaVu LGC Sans'
+ settings.props.serif_font_family = 'DejaVu LGC Serif'
+ settings.props.monospace_font_family = 'DejaVu LGC Sans Mono'
+ settings.props.enforce_96_dpi = True
+ #settings.props.auto_shrink_images = False #FIXME: This does not seem to work
+ settings.props.enable_plugins = False
+ settings.props.default_font_size = 12
+ settings.props.default_monospace_font_size = 10
+ settings.props.default_encoding = 'utf-8'
+
+ sw = gtk.ScrolledWindow()
+ sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER)
+ self._dpi = 96
+ sw.set_size_request(_mm_to_pixel(PAGE_WIDTH, self._dpi), _mm_to_pixel(PAGE_HEIGHT, self._dpi))
+ sw.add(self._temp_view)
+ self._temp_win.add(sw)
+ self._temp_view.connect('load-finished', self._page_load_finished_cb)
+
+ self._temp_win.show_all()
+ self._temp_win.unmap()
+
+ self._temp_view.open(self._filelist[self._count])
+
+ def _page_load_finished_cb(self, v, frame):
+ f = v.get_main_frame()
+ pageheight = v.get_page_height()
+
+ if pageheight <= _mm_to_pixel(PAGE_HEIGHT, self._dpi):
+ pages = 1
+ else:
+ pages = pageheight/float(_mm_to_pixel(PAGE_HEIGHT, self._dpi))
+ for i in range(1, int(math.ceil(pages) + 1)):
+ if pages - i < 0:
+ pagelen = (pages - math.floor(pages))/pages
+ else:
+ pagelen = 1/pages
+ self._pagemap[float(self._pagecount + i)] = (f.props.uri, (i-1)/math.ceil(pages), pagelen)
+
+ self._pagecount += math.ceil(pages)
+ self._filedict[f.props.uri.replace('file://', '')] = (math.ceil(pages), math.ceil(pages) - pages)
+ self._bookheight += pageheight
+
+ if self._count+1 >= len(self._filelist):
+ self._temp_win.destroy()
+ self._screen.set_font_options(self._old_fontoptions)
+ self.emit('paginated')
+ else:
+ self._count += 1
+ self._temp_view.open(self._filelist[self._count])
+
+
+ def get_file_for_pageno(self, pageno):
+ '''
+ Returns the file in which pageno occurs
+ '''
+ return self._pagemap[pageno][0]
+
+ def get_scrollfactor_pos_for_pageno(self, pageno):
+ '''
+ Returns the position scrollfactor (fraction) for pageno
+ '''
+ return self._pagemap[pageno][1]
+
+ def get_scrollfactor_len_for_pageno(self, pageno):
+ '''
+ Returns the length scrollfactor (fraction) for pageno
+ '''
+ return self._pagemap[pageno][2]
+
+ def get_pagecount_for_file(self, filename):
+ '''
+ Returns the number of pages in file
+ '''
+ return self._filedict[filename][0]
+
+ def get_base_pageno_for_file(self, filename):
+ '''
+ Returns the pageno which begins in filename
+ '''
+ for key in self._pagemap.keys():
+ if self._pagemap[key][0].replace('file://', '') == filename:
+ return key
+
+ return None
+
+ def get_remfactor_for_file(self, filename):
+ '''
+ Returns the remainder factor (1 - fraction length of last page in file)
+ '''
+ return self._filedict[filename][1]
+
+ def get_total_pagecount(self):
+ '''
+ Returns the total pagecount for the Epub file
+ '''
+ return self._pagecount
+
+ def get_total_height(self):
+ '''
+ Returns the total height of the Epub in pixels
+ '''
+ return self._bookheight
+
+
+class _JobFind(gobject.GObject):
+ __gsignals__ = {
+ 'updated': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([]))
+ }
+ def __init__(self, document, start_page, n_pages, text, case_sensitive=False):
+ gobject.GObject.__init__(self)
+ gtk.gdk.threads_init()
+
+ self._finished = False
+ self._document = document
+ self._start_page = start_page
+ self._n_pages = n_pages
+ self._text = text
+ self._case_sensitive = case_sensitive
+ self.flattoc = self._document.get_flattoc()
+ self._matchfilelist = []
+ self._current_file_index = 0
+ self.threads = []
+
+ s_thread = SearchThread(self)
+ self.threads.append(s_thread)
+ s_thread.start()
+
+ def cancel(self):
+ '''
+ Cancels the search job
+ '''
+ for s_thread in self.threads:
+ s_thread.stop()
+
+ def is_finished(self):
+ '''
+ Returns True if the entire search job has been finished
+ '''
+ return self._finished
+
+ def get_next_file(self):
+ '''
+ Returns the next file which has the search pattern
+ '''
+ self._current_file_index += 1
+ try:
+ path = self._matchfilelist[self._current_file_index]
+ except IndexError:
+ self._current_file_index = 0
+ path = self._matchfilelist[self._current_file_index]
+
+ return path
+
+ def get_prev_file(self):
+ '''
+ Returns the previous file which has the search pattern
+ '''
+ self._current_file_index -= 1
+ try:
+ path = self._matchfilelist[self._current_file_index]
+ except IndexError:
+ self._current_file_index = -1
+ path = self._matchfilelist[self._current_file_index]
+
+ return path
+
+ def get_search_text(self):
+ '''
+ Returns the search text
+ '''
+ return self._text
+
+ def get_case_sensitive(self):
+ '''
+ Returns True if the search is case-sensitive
+ '''
+ return self._case_sensitive
diff --git a/epubview/jobs.pyc b/epubview/jobs.pyc
new file mode 100644
index 0000000..4ba8785
--- /dev/null
+++ b/epubview/jobs.pyc
Binary files differ
diff --git a/epubview/navmap.py b/epubview/navmap.py
new file mode 100644
index 0000000..a0a1799
--- /dev/null
+++ b/epubview/navmap.py
@@ -0,0 +1,93 @@
+from lxml import etree
+import gtk
+
+class NavPoint(object):
+ def __init__(self, label, contentsrc, children = []):
+ self._label = label
+ self._contentsrc = contentsrc
+ self._children = children
+
+ def get_label(self):
+ return self._label
+
+ def get_contentsrc(self):
+ return self._contentsrc
+
+ def get_children(self):
+ return self._children
+
+
+class NavMap(object):
+ def __init__(self, opffile, ncxfile, basepath):
+ self._basepath = basepath
+ self._opffile = opffile
+ self._tree = etree.parse(ncxfile)
+ self._root = self._tree.getroot()
+ self._gtktreestore = gtk.TreeStore(str, str)
+ self._flattoc = []
+
+ self._populate_flattoc()
+ self._populate_toc()
+
+ def _populate_flattoc(self):
+ tree = etree.parse(self._opffile)
+ root = tree.getroot()
+
+ itemmap = {}
+ manifest = root.find('.//{http://www.idpf.org/2007/opf}manifest')
+ for element in manifest.iterfind('{http://www.idpf.org/2007/opf}item'):
+ itemmap[element.get('id')] = element
+
+ spine = root.find('.//{http://www.idpf.org/2007/opf}spine')
+ for element in spine.iterfind('{http://www.idpf.org/2007/opf}itemref'):
+ idref = element.get('idref')
+ href = itemmap[idref].get('href')
+ self._flattoc.append(self._basepath + href)
+
+ self._opffile.close()
+
+ def _populate_toc(self):
+ navmap = self._root.find('{http://www.daisy.org/z3986/2005/ncx/}navMap')
+ for navpoint in navmap.iterfind('./{http://www.daisy.org/z3986/2005/ncx/}navPoint'):
+ self._process_navpoint(navpoint)
+
+ def _gettitle(self, navpoint):
+ text = navpoint.find('./{http://www.daisy.org/z3986/2005/ncx/}navLabel/{http://www.daisy.org/z3986/2005/ncx/}text')
+ return text.text
+
+ def _getcontent(self, navpoint):
+ text = navpoint.find('./{http://www.daisy.org/z3986/2005/ncx/}content/')
+ return self._basepath + text.get('src')
+
+ def _process_navpoint(self, navpoint, parent = None):
+ title = self._gettitle(navpoint)
+ content = self._getcontent(navpoint)
+
+ #print title, content
+
+ iter = self._gtktreestore.append(parent, [title, content])
+ #self._flattoc.append((title, content))
+
+ childnavpointlist = list(navpoint.iterfind('./{http://www.daisy.org/z3986/2005/ncx/}navPoint'))
+
+ if len(childnavpointlist):
+ for childnavpoint in childnavpointlist:
+ self._process_navpoint(childnavpoint, parent = iter)
+ else:
+ return
+
+ def get_gtktreestore(self):
+ '''
+ Returns a GtkTreeModel representation of the
+ Epub table of contents
+ '''
+ return self._gtktreestore
+
+ def get_flattoc(self):
+ '''
+ Returns a flat (linear) list of files to be
+ rendered.
+ '''
+ return self._flattoc
+
+#t = TocParser('/home/sayamindu/Desktop/Test/OPS/fb.ncx') \ No newline at end of file
diff --git a/epubview/navmap.pyc b/epubview/navmap.pyc
new file mode 100644
index 0000000..8eb322b
--- /dev/null
+++ b/epubview/navmap.pyc
Binary files differ
diff --git a/epubview/widgets.py b/epubview/widgets.py
new file mode 100644
index 0000000..d80c45a
--- /dev/null
+++ b/epubview/widgets.py
@@ -0,0 +1,31 @@
+import webkit
+import gtk
+
+
+class _WebView(webkit.WebView):
+ def __init__(self):
+ webkit.WebView.__init__(self)
+
+ def get_page_height(self):
+ '''
+ Gets height (in pixels) of loaded (X)HTML page.
+ This is done via javascript at the moment
+ '''
+ #TODO: Need to check status of page load
+ js = 'oldtitle=document.title;document.title=Math.max(document.body.scrollHeight, document.body.offsetHeight,document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);'
+ self.execute_script(js)
+ ret = self.get_main_frame().get_title()
+ js = 'document.title=oldtitle;'
+ self.execute_script(js)
+ if ret is None:
+ return 0
+ return int(ret)
+
+ def add_bottom_padding(self, incr):
+ '''
+ Adds incr pixels of padding to the end of the loaded (X)HTML page.
+ This is done via javascript at the moment
+ '''
+ js = ('var newdiv = document.createElement("div");newdiv.style.height = "%dpx";document.body.appendChild(newdiv);' % incr)
+ self.execute_script(js)
+
diff --git a/epubview/widgets.pyc b/epubview/widgets.pyc
new file mode 100644
index 0000000..cffed84
--- /dev/null
+++ b/epubview/widgets.pyc
Binary files differ
diff --git a/locale/af/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/af/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..af80674
--- /dev/null
+++ b/locale/af/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/af/activity.linfo b/locale/af/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/af/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/am/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/am/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/am/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/am/activity.linfo b/locale/am/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/am/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ar/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ar/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..e141196
--- /dev/null
+++ b/locale/ar/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ar/activity.linfo b/locale/ar/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ar/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ay/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ay/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/ay/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ay/activity.linfo b/locale/ay/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ay/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/bg/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/bg/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..adc24f5
--- /dev/null
+++ b/locale/bg/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/bg/activity.linfo b/locale/bg/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/bg/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/bi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/bi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/bi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/bi/activity.linfo b/locale/bi/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/bi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/bn/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/bn/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..e1397c1
--- /dev/null
+++ b/locale/bn/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/bn/activity.linfo b/locale/bn/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/bn/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/bn_IN/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/bn_IN/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..3bd8b8e
--- /dev/null
+++ b/locale/bn_IN/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/bn_IN/activity.linfo b/locale/bn_IN/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/bn_IN/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ca/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ca/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..b5b0634
--- /dev/null
+++ b/locale/ca/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ca/activity.linfo b/locale/ca/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ca/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/cpp/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/cpp/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/cpp/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/cpp/activity.linfo b/locale/cpp/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/cpp/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/cs/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/cs/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/cs/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/cs/activity.linfo b/locale/cs/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/cs/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/da/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/da/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..b544e6c
--- /dev/null
+++ b/locale/da/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/da/activity.linfo b/locale/da/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/da/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/de/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/de/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..bee1cc4
--- /dev/null
+++ b/locale/de/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/de/activity.linfo b/locale/de/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/de/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/dz/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/dz/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/dz/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/dz/activity.linfo b/locale/dz/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/dz/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/el/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/el/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..4320871
--- /dev/null
+++ b/locale/el/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/el/activity.linfo b/locale/el/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/el/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/en/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/en/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/en/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/en/activity.linfo b/locale/en/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/en/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/en_US/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/en_US/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..1864bf1
--- /dev/null
+++ b/locale/en_US/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/en_US/activity.linfo b/locale/en_US/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/en_US/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/es/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/es/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..aedf57f
--- /dev/null
+++ b/locale/es/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/es/activity.linfo b/locale/es/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/es/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/fa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/fa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..905320b
--- /dev/null
+++ b/locale/fa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/fa/activity.linfo b/locale/fa/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/fa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/fa_AF/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/fa_AF/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c29bf21
--- /dev/null
+++ b/locale/fa_AF/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/fa_AF/activity.linfo b/locale/fa_AF/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/fa_AF/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ff/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ff/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/ff/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ff/activity.linfo b/locale/ff/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ff/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/fi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/fi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/fi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/fi/activity.linfo b/locale/fi/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/fi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/fil/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/fil/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..ca5e0b0
--- /dev/null
+++ b/locale/fil/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/fil/activity.linfo b/locale/fil/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/fil/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/fr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/fr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..3d1b59e
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/fr/activity.linfo b/locale/fr/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/fr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/gu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/gu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..46b5673
--- /dev/null
+++ b/locale/gu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/gu/activity.linfo b/locale/gu/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/gu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ha/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ha/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/ha/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ha/activity.linfo b/locale/ha/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ha/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/he/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/he/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/he/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/he/activity.linfo b/locale/he/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/he/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/hi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/hi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..83b7084
--- /dev/null
+++ b/locale/hi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/hi/activity.linfo b/locale/hi/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/hi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ht/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ht/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..d7de481
--- /dev/null
+++ b/locale/ht/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ht/activity.linfo b/locale/ht/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ht/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/hu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/hu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/hu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/hu/activity.linfo b/locale/hu/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/hu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/id/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/id/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..2227226
--- /dev/null
+++ b/locale/id/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/id/activity.linfo b/locale/id/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/id/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ig/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ig/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/ig/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ig/activity.linfo b/locale/ig/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ig/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/is/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/is/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..f024d59
--- /dev/null
+++ b/locale/is/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/is/activity.linfo b/locale/is/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/is/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/it/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/it/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..7496aa5
--- /dev/null
+++ b/locale/it/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/it/activity.linfo b/locale/it/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/it/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ja/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ja/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..3bb37bb
--- /dev/null
+++ b/locale/ja/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ja/activity.linfo b/locale/ja/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ja/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/km/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/km/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..4adfbf1
--- /dev/null
+++ b/locale/km/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/km/activity.linfo b/locale/km/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/km/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ko/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ko/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/ko/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ko/activity.linfo b/locale/ko/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ko/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/kos/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/kos/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..2227226
--- /dev/null
+++ b/locale/kos/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/kos/activity.linfo b/locale/kos/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/kos/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/mg/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/mg/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..64ff4c3
--- /dev/null
+++ b/locale/mg/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/mg/activity.linfo b/locale/mg/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/mg/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/mi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/mi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/mi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/mi/activity.linfo b/locale/mi/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/mi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/mk/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/mk/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..3e8601b
--- /dev/null
+++ b/locale/mk/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/mk/activity.linfo b/locale/mk/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/mk/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ml/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ml/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/ml/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ml/activity.linfo b/locale/ml/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ml/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/mn/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/mn/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..142972b
--- /dev/null
+++ b/locale/mn/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/mn/activity.linfo b/locale/mn/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/mn/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/mr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/mr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..754f27a
--- /dev/null
+++ b/locale/mr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/mr/activity.linfo b/locale/mr/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/mr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ms/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ms/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/ms/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ms/activity.linfo b/locale/ms/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ms/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/mvo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/mvo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..414c55f
--- /dev/null
+++ b/locale/mvo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/mvo/activity.linfo b/locale/mvo/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/mvo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/nb/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/nb/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..b251060
--- /dev/null
+++ b/locale/nb/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/nb/activity.linfo b/locale/nb/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/nb/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ne/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ne/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..47c016a
--- /dev/null
+++ b/locale/ne/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ne/activity.linfo b/locale/ne/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ne/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/nl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/nl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..b514b6b
--- /dev/null
+++ b/locale/nl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/nl/activity.linfo b/locale/nl/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/nl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/pa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/pa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/pa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/pa/activity.linfo b/locale/pa/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/pa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/pap/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/pap/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..27e30e6
--- /dev/null
+++ b/locale/pap/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/pap/activity.linfo b/locale/pap/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/pap/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/pis/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/pis/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..414c55f
--- /dev/null
+++ b/locale/pis/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/pis/activity.linfo b/locale/pis/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/pis/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/pl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/pl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..7aa6940
--- /dev/null
+++ b/locale/pl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/pl/activity.linfo b/locale/pl/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/pl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ps/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ps/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..12df916
--- /dev/null
+++ b/locale/ps/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ps/activity.linfo b/locale/ps/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ps/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/pt/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/pt/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..1b02adc
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/pt/activity.linfo b/locale/pt/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/pt/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/pt_BR/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/pt_BR/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..236a7d7
--- /dev/null
+++ b/locale/pt_BR/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/pt_BR/activity.linfo b/locale/pt_BR/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/pt_BR/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/qu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/qu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/qu/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/qu/activity.linfo b/locale/qu/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/qu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ro/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ro/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..9b92966
--- /dev/null
+++ b/locale/ro/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ro/activity.linfo b/locale/ro/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ro/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ru/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ru/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..1ab632c
--- /dev/null
+++ b/locale/ru/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ru/activity.linfo b/locale/ru/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ru/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/rw/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/rw/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..cd9ccf4
--- /dev/null
+++ b/locale/rw/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/rw/activity.linfo b/locale/rw/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/rw/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/sd/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/sd/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..bbe0f25
--- /dev/null
+++ b/locale/sd/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/sd/activity.linfo b/locale/sd/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/sd/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/si/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/si/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..d3c03a3
--- /dev/null
+++ b/locale/si/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/si/activity.linfo b/locale/si/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/si/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/sk/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/sk/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/sk/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/sk/activity.linfo b/locale/sk/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/sk/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/sl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/sl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..b00912d
--- /dev/null
+++ b/locale/sl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/sl/activity.linfo b/locale/sl/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/sl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/sq/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/sq/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..2227226
--- /dev/null
+++ b/locale/sq/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/sq/activity.linfo b/locale/sq/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/sq/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/sv/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/sv/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..19e3588
--- /dev/null
+++ b/locale/sv/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/sv/activity.linfo b/locale/sv/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/sv/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/sw/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/sw/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/sw/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/sw/activity.linfo b/locale/sw/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/sw/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ta/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ta/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..ac0bbf0
--- /dev/null
+++ b/locale/ta/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ta/activity.linfo b/locale/ta/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ta/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/te/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/te/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..e545e99
--- /dev/null
+++ b/locale/te/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/te/activity.linfo b/locale/te/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/te/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/th/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/th/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..8b32d08
--- /dev/null
+++ b/locale/th/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/th/activity.linfo b/locale/th/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/th/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/tpi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/tpi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..414c55f
--- /dev/null
+++ b/locale/tpi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/tpi/activity.linfo b/locale/tpi/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/tpi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/tr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/tr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..e387862
--- /dev/null
+++ b/locale/tr/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/tr/activity.linfo b/locale/tr/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/tr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/tvl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/tvl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..ca5e0b0
--- /dev/null
+++ b/locale/tvl/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/tvl/activity.linfo b/locale/tvl/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/tvl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/tzo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/tzo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..2227226
--- /dev/null
+++ b/locale/tzo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/tzo/activity.linfo b/locale/tzo/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/tzo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ug/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ug/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/ug/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ug/activity.linfo b/locale/ug/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ug/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/ur/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/ur/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..69f80cd
--- /dev/null
+++ b/locale/ur/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/ur/activity.linfo b/locale/ur/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/ur/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/vi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/vi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..95cb6ec
--- /dev/null
+++ b/locale/vi/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/vi/activity.linfo b/locale/vi/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/vi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/wa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/wa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..c6618f2
--- /dev/null
+++ b/locale/wa/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/wa/activity.linfo b/locale/wa/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/wa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/yo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/yo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..63a6eea
--- /dev/null
+++ b/locale/yo/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/yo/activity.linfo b/locale/yo/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/yo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/zh_CN/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/zh_CN/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..8e7215c
--- /dev/null
+++ b/locale/zh_CN/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/zh_CN/activity.linfo b/locale/zh_CN/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/zh_CN/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/locale/zh_TW/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo b/locale/zh_TW/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
new file mode 100644
index 0000000..65ab709
--- /dev/null
+++ b/locale/zh_TW/LC_MESSAGES/org.laptop.sugar.AnnoActivity.mo
Binary files differ
diff --git a/locale/zh_TW/activity.linfo b/locale/zh_TW/activity.linfo
new file mode 100644
index 0000000..23ebeb6
--- /dev/null
+++ b/locale/zh_TW/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Anno
diff --git a/po/Read.pot b/po/Read.pot
new file mode 100644
index 0000000..a969bfd
--- /dev/null
+++ b/po/Read.pot
@@ -0,0 +1,81 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
diff --git a/po/af.po b/po/af.po
new file mode 100644
index 0000000..c48f800
--- /dev/null
+++ b/po/af.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-06-20 19:03-0400\n"
+"Last-Translator: Morgan Collett <morgan.collett@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "Lees"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Redigeer"
+
+#: readactivity.py:103
+msgid "View"
+msgstr "Besigtig"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Vorige"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Volgende"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Soek eerste"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Soek vorige"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Soek volgende"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Terug"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Vorentoe"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "Zoem uit"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "Zoem in"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "Zoem na wydte"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "Zoem na pas"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "Werklike grootte"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "Volskerm"
diff --git a/po/am.po b/po/am.po
new file mode 100644
index 0000000..328f81a
--- /dev/null
+++ b/po/am.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: XbookActivity.py:49 XbookActivity.py:140
+msgid "Read Activity"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/ar.po b/po/ar.po
new file mode 100644
index 0000000..228dc96
--- /dev/null
+++ b/po/ar.po
@@ -0,0 +1,154 @@
+# translation of read-activity.po to Arabic
+# Khaled Hosny <khaledhosny@eglug.org>, 2007.
+# Ahmed Mansour <atphalix@users.arabeyes.org>, 2008.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+msgid ""
+msgstr ""
+"Project-Id-Version: read-activity\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-08-06 00:33-0400\n"
+"PO-Revision-Date: 2009-08-28 15:37-0400\n"
+"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
+"Language-Team: Arabic <en@li.org>\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n>=3 && "
+"n<=10 ? 3 : n>=11 && n<=99 ? 4 : 5;\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2 readactivity.py:143
+msgid "Read"
+msgstr "اقرأ"
+
+#: readactivity.py:139
+msgid "Edit"
+msgstr "تحرير"
+
+#: readactivity.py:151
+msgid "View"
+msgstr "عرض"
+
+#: readactivity.py:241
+msgid "Choose document"
+msgstr "اختر الوثيقة"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "ألغِ"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "حسنا"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>العنوان</b>:"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>التفاصيل</b>:"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "علامة أضافها %(user)s‏ %(time)s"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "أضف ملاحظات للعلامة: "
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "علامة %s"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "علامة على الصفحة %d"
+
+#: readtoolbar.py:91
+msgid "Previous"
+msgstr "السابق"
+
+#: readtoolbar.py:98
+msgid "Next"
+msgstr "التالي"
+
+#: readtoolbar.py:184
+msgid "Find first"
+msgstr "أوجد الأول"
+
+#: readtoolbar.py:190
+msgid "Find previous"
+msgstr "أوجد السابق"
+
+#: readtoolbar.py:192
+msgid "Find next"
+msgstr "أوجد التالي"
+
+#: readtoolbar.py:205
+msgid "Back"
+msgstr "للخلف"
+
+#: readtoolbar.py:208
+msgid "Previous page"
+msgstr "الصفحة السابقة"
+
+#: readtoolbar.py:211
+msgid "Previous bookmark"
+msgstr "العلامة السابقة"
+
+#: readtoolbar.py:221
+msgid "Forward"
+msgstr "للأمام"
+
+#: readtoolbar.py:224
+msgid "Next page"
+msgstr "الصفحة التالية"
+
+#: readtoolbar.py:227
+msgid "Next bookmark"
+msgstr "العلامة التالية"
+
+#: readtoolbar.py:468
+msgid "Zoom out"
+msgstr "صغّر"
+
+#: readtoolbar.py:474
+msgid "Zoom in"
+msgstr "كبّر"
+
+#: readtoolbar.py:480
+msgid "Zoom to width"
+msgstr "لائِم العرض"
+
+#: readtoolbar.py:486
+msgid "Zoom to fit"
+msgstr "لائِم الصفحة"
+
+#: readtoolbar.py:491
+msgid "Actual size"
+msgstr "المقاس الأصلي"
+
+#: readtoolbar.py:508
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:521
+msgid "Fullscreen"
+msgstr "ملء الشاشة"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "صفحة %i من %i"
+
+#~ msgid "Read Activity"
+#~ msgstr "نشاط القراءة"
diff --git a/po/ay.po b/po/ay.po
new file mode 100644
index 0000000..328f81a
--- /dev/null
+++ b/po/ay.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: XbookActivity.py:49 XbookActivity.py:140
+msgid "Read Activity"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/bg.po b/po/bg.po
new file mode 100644
index 0000000..183e977
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,86 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-03-01 13:04-0500\n"
+"Last-Translator: Alexander Todorov <atodorov@redhat.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "Четене"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Редактиране"
+
+#: readactivity.py:103
+msgid "View"
+msgstr "Изглед"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Предишен"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Следващ"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Търсене на първо съвпадение"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Търсене напред"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Търсене назад"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Назад"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Напред"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "Намаляване"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "Увеличаване"
+
+# виж превода на evince
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "Запълване на страницата по ширина"
+
+# виж превода на evince
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "Запълване на страницата"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "Оригинален размер"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "На цял екран"
diff --git a/po/bi.po b/po/bi.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/bi.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/bn.po b/po/bn.po
new file mode 100644
index 0000000..df04b67
--- /dev/null
+++ b/po/bn.po
@@ -0,0 +1,80 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2007-12-30 17:35+0000\n"
+"Last-Translator: Jamil Ahmed <itsjamil@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "পড়"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "সম্পাদনা"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "প্রদর্শন"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "পুর্ববর্তী"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "পরবর্তী"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "পেছনে"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "সামনে"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "ছোট করো"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "বড় করো"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "প্রস্থ অনুসারে বড় করো"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "প্রয়োজন অনুসারে বড় করো"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "আসল আকার"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "প্রথমটি খুঁজো"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "আগেরটি খুঁজো"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "পরেরটি খুঁজো"
diff --git a/po/bn_IN.po b/po/bn_IN.po
new file mode 100644
index 0000000..a44936b
--- /dev/null
+++ b/po/bn_IN.po
@@ -0,0 +1,83 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2008-01-22 09:17+0000\n"
+"Last-Translator: Sankarshan Mukhopadhyay <sankarshan.mukhopadhyay@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "পড়ুন"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "সম্পাদন"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "প্রদর্শন"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "পূর্বের"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "পরের"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "প্রথমটি খুঁজে বের করুন"
+
+#: readtoolbar.py:146
+#, fuzzy
+msgid "Find previous"
+msgstr "পূর্বেরটি খুঁজে বের করুন"
+
+#: readtoolbar.py:148
+#, fuzzy
+msgid "Find next"
+msgstr "পরেরটি খুঁজে বের করুন"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "পিছনে"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "এগিয়ে চলুন"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "ছোট করুন"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "বড় করুন"
+
+#: readtoolbar.py:274
+#, fuzzy
+msgid "Zoom to width"
+msgstr "প্রস্থের মাপে দেখুন"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "প্রকৃত মাপ"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..0724501
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,80 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2008-01-08 18:50+0000\n"
+"Last-Translator: Jaume <jaume@nualart.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "Llegir"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Editar"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "Veure"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Previ"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Següent"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Troba el primer"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Troba l'anterior"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Troba el següent"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Enrere"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Endavant"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "Reduir"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "Ampliar"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "Ajustar amplada"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "Ajustar del tot"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "Dimensió actual"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
diff --git a/po/cpp.po b/po/cpp.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/cpp.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/da.po b/po/da.po
new file mode 100644
index 0000000..47fb192
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,150 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-08-06 00:33-0400\n"
+"PO-Revision-Date: 2009-08-17 21:08-0400\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2 readactivity.py:143
+msgid "Read"
+msgstr "Læs"
+
+#: readactivity.py:139
+msgid "Edit"
+msgstr "Redigér"
+
+#: readactivity.py:151
+msgid "View"
+msgstr "Vis"
+
+#: readactivity.py:241
+msgid "Choose document"
+msgstr ""
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr ""
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr ""
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr ""
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr ""
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr ""
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr ""
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr ""
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr ""
+
+#: readtoolbar.py:91
+msgid "Previous"
+msgstr "Forrige"
+
+#: readtoolbar.py:98
+msgid "Next"
+msgstr "Næste"
+
+#: readtoolbar.py:184
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:190
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:192
+msgid "Find next"
+msgstr "Find næste"
+
+#: readtoolbar.py:205
+msgid "Back"
+msgstr "Tilbage"
+
+#: readtoolbar.py:208
+msgid "Previous page"
+msgstr ""
+
+#: readtoolbar.py:211
+msgid "Previous bookmark"
+msgstr ""
+
+#: readtoolbar.py:221
+msgid "Forward"
+msgstr "Frem"
+
+#: readtoolbar.py:224
+msgid "Next page"
+msgstr ""
+
+#: readtoolbar.py:227
+msgid "Next bookmark"
+msgstr ""
+
+#: readtoolbar.py:468
+msgid "Zoom out"
+msgstr "Formindsk"
+
+#: readtoolbar.py:474
+msgid "Zoom in"
+msgstr "Forstør"
+
+#: readtoolbar.py:480
+msgid "Zoom to width"
+msgstr "Tilpas til bredde"
+
+#: readtoolbar.py:486
+#, fuzzy
+msgid "Zoom to fit"
+msgstr "Tilpas til bredde"
+
+#: readtoolbar.py:491
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:508
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:521
+msgid "Fullscreen"
+msgstr "Fuldskærm"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr ""
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..5fa013a
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,157 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# This file is distributed under the same license as the PACKAGE package.
+# Fabian Affolter <fab@fedoraproject.org>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: xbook\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-09 00:33-0400\n"
+"PO-Revision-Date: 2010-03-28 23:12+0200\n"
+"Last-Translator: Markus <m.slg@gmx.de>\n"
+"Language-Team: cvs@fedoraproject.org <fedora-trans-de@redhat.com>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
+"X-Poedit-Language: German\n"
+
+#: activity/activity.info:2
+msgid "Read"
+msgstr "Lesen"
+
+#: readactivity.py:330
+msgid "Back"
+msgstr "Zurück"
+
+#: readactivity.py:333
+msgid "Previous page"
+msgstr "Vorherige Seite"
+
+#: readactivity.py:336
+msgid "Previous bookmark"
+msgstr "Vorheriges Lesezeichen"
+
+#: readactivity.py:346
+msgid "Forward"
+msgstr "Vor"
+
+#: readactivity.py:349
+msgid "Next page"
+msgstr "Nächste Seite"
+
+#: readactivity.py:352
+msgid "Next bookmark"
+msgstr "Nächstes Lesezeichen"
+
+#: readactivity.py:537
+msgid "Choose document"
+msgstr "Dokument auswählen"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "Ok"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>Titel</b>:"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>Details</b>:"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "Lesezeichen hinzugefügt von %(user)s %(time)s"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "Anmerkungen zu Lesezeichen hinzufügen: "
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "Lesezeichen von %s"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "Lesezeichen für Seite %d"
+
+#: readtoolbar.py:64
+msgid "Previous"
+msgstr "Vorheriges"
+
+#: readtoolbar.py:71
+msgid "Next"
+msgstr "Nächstes"
+
+#: readtoolbar.py:157
+msgid "Find first"
+msgstr "Suche vorwärts"
+
+#: readtoolbar.py:163
+msgid "Find previous"
+msgstr "Suche rückwärts"
+
+#: readtoolbar.py:165
+msgid "Find next"
+msgstr "Weitersuchen"
+
+#: readtoolbar.py:187
+msgid "Zoom out"
+msgstr "Verkleinern"
+
+#: readtoolbar.py:193
+msgid "Zoom in"
+msgstr "Vergrößern"
+
+#: readtoolbar.py:199
+msgid "Zoom to width"
+msgstr "Breite anpassen"
+
+#: readtoolbar.py:205
+msgid "Zoom to fit"
+msgstr "Größe anpassen"
+
+#: readtoolbar.py:210
+msgid "Actual size"
+msgstr "Originalgröße"
+
+#: readtoolbar.py:227
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:240
+msgid "Fullscreen"
+msgstr "Vollbild"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "Seite %i von %i"
+
+#~ msgid "Edit"
+#~ msgstr "Bearbeiten"
+
+#~ msgid "View"
+#~ msgstr "Ansehen"
+
+#~ msgid "Read Activity"
+#~ msgstr "Lese-Aktivitäten"
diff --git a/po/dz.po b/po/dz.po
new file mode 100644
index 0000000..cc83252
--- /dev/null
+++ b/po/dz.po
@@ -0,0 +1,81 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/el.po b/po/el.po
new file mode 100644
index 0000000..89b83d6
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,92 @@
+# Greek translation of Xbook project.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Simos Xenitellis <simos.lists@googlemail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: Xbook project\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: 2008-10-24 11:45-0400\n"
+"Last-Translator: John Sarlis <sarlis@sch.gr>\n"
+"Language-Team: Greek <olpc@grnet.gr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr "Ανάγνωση"
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr "Επεξεργασία"
+
+#: readactivity.py:137
+msgid "View"
+msgstr "Προβολή"
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr "Επιλογή αρχείου κειμένου"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Προηγούμενο"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Επόμενο"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Βρες το πρώτο"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Βρες το προηγούμενο"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Βρες το επόμενο"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Πίσω"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Μπροστά"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "Εστίαση έξω"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "Εστίαση μέσα"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "Εστίαση στο πλάτος"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "Εστίαση στη σελίδα"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "Πραγματικό μέγεθος"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "Πλήρης οθόνη"
+
+#~ msgid "Read Activity"
+#~ msgstr "Ανάγνωση δραστηριότητας"
diff --git a/po/en.po b/po/en.po
new file mode 100644
index 0000000..328f81a
--- /dev/null
+++ b/po/en.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: XbookActivity.py:49 XbookActivity.py:140
+msgid "Read Activity"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/en_US.po b/po/en_US.po
new file mode 100644
index 0000000..ef3dfbc
--- /dev/null
+++ b/po/en_US.po
@@ -0,0 +1,88 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: 2008-11-03 01:08-0500\n"
+"Last-Translator: Desiree M Durham <desireemarie7@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr "Read"
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr "Edit"
+
+#: readactivity.py:137
+msgid "View"
+msgstr "View"
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr "Choose document"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Previous"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Next"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Find first"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Find previous"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Find next"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Back"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Forward"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "Zoom out"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "Zoom in"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "Zoom to width"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "Zoom to fit"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "Actual size"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "Fullscreen"
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 0000000..182c96d
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,105 @@
+# Spanish translations for PACKAGE package.
+# Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Tomeu Vizoso <tomeu@tomeuvizoso.net>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: xbook\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: 2009-03-07 23:32-0500\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
+"Language-Team: Fedora Spanish <fedora-trans-es@redhat.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+"X-Poedit-Language: Spanish\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr "Leer"
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr "Editar"
+
+#: readactivity.py:137
+msgid "View"
+msgstr "Ver"
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr "Escoger documento"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Anterior"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Siguiente"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Encontrar primero"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Encontrar previo"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Encontrar siguiente"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Volver"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Avanzar"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "Reducir"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "Ampliar"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "Ajustar al ancho"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "Ampliar hasta ajustar"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "Tamaño real"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "Pantalla completa"
+
+#~ msgid "Read Activity"
+#~ msgstr "Actividad Leer"
+
+#~ msgid "Open a document to read"
+#~ msgstr "Abrir un documento para leer"
+
+#~ msgid "All supported formats"
+#~ msgstr "Todos los formatos soportados"
+
+#~ msgid "All files"
+#~ msgstr "Todos los ficheros"
+
+#~ msgid "Open"
+#~ msgstr "Abrir"
diff --git a/po/fa.po b/po/fa.po
new file mode 100644
index 0000000..e7982e7
--- /dev/null
+++ b/po/fa.po
@@ -0,0 +1,81 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2008-01-09 08:31+0000\n"
+"Last-Translator: Sohaib Obaidi <ebtihaj_obaidi@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "خواندن"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "ویراستن"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "دیدن"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "قبلی"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "بعدی"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "عقب"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "جلو"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "کوچکنمایی"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "بزرگنمایی"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "بزرگنمایی به عرض"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "بزرگنمایی به اندازه"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "اندازه واقعی"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "٪"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "اولی را بازیاب"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "گذشته را بازیاب"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "بعدی را بازیاب"
diff --git a/po/fa_AF.po b/po/fa_AF.po
new file mode 100644
index 0000000..6130e4d
--- /dev/null
+++ b/po/fa_AF.po
@@ -0,0 +1,81 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2008-01-28 06:22-0500\n"
+"Last-Translator: Sohaib Obaidi <ebtihaj_obaidi@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "خواندن"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "ویراستن"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "دیدن"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "قبلی"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "بعدی"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "عقب"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "جلو"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "کوچکنمایی"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "بزرگنمایی"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "بزرگنمایی به عرض"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "بزرگنمایی به اندازه"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "اندازه واقعی"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "اولی را بازیاب"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "گذشته را بازیاب"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "بعدی را بازیاب"
diff --git a/po/ff.po b/po/ff.po
new file mode 100644
index 0000000..a13ecf6
--- /dev/null
+++ b/po/ff.po
@@ -0,0 +1,81 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
diff --git a/po/fi.po b/po/fi.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/fil.po b/po/fil.po
new file mode 100644
index 0000000..a5f63b4
--- /dev/null
+++ b/po/fil.po
@@ -0,0 +1,140 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-09 00:33-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.3.0\n"
+
+#: activity/activity.info:2
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:330
+msgid "Back"
+msgstr ""
+
+#: readactivity.py:333
+msgid "Previous page"
+msgstr ""
+
+#: readactivity.py:336
+msgid "Previous bookmark"
+msgstr ""
+
+#: readactivity.py:346
+msgid "Forward"
+msgstr ""
+
+#: readactivity.py:349
+msgid "Next page"
+msgstr ""
+
+#: readactivity.py:352
+msgid "Next bookmark"
+msgstr ""
+
+#: readactivity.py:537
+msgid "Choose document"
+msgstr ""
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr ""
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr ""
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr ""
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr ""
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr ""
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr ""
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr ""
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr ""
+
+#: readtoolbar.py:64
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:71
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:157
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:163
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:165
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:187
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:193
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:199
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:205
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:210
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:227
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:240
+msgid "Fullscreen"
+msgstr ""
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr ""
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..6474cbb
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,150 @@
+# translation of xbook.master.po to Français
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Gauthier Ancelin <gauthier.ancelin@laposte.net>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: xbook.master\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-09 00:33-0400\n"
+"PO-Revision-Date: 2010-01-25 07:13+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: Français <fedora-trans-fr@redhat.com>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Read"
+msgstr "Lire"
+
+#: readactivity.py:330
+msgid "Back"
+msgstr "Reculer"
+
+#: readactivity.py:333
+msgid "Previous page"
+msgstr "Page précédente"
+
+#: readactivity.py:336
+msgid "Previous bookmark"
+msgstr "Signet précédent"
+
+#: readactivity.py:346
+msgid "Forward"
+msgstr "Avancer"
+
+#: readactivity.py:349
+msgid "Next page"
+msgstr "Page suivante"
+
+#: readactivity.py:352
+msgid "Next bookmark"
+msgstr "Signet suivant"
+
+#: readactivity.py:537
+msgid "Choose document"
+msgstr "Choisir un document"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "Annuler"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "Ok"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>Titre</b> :"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>Détails</b> :"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "Signet ajouté par %(user)s il y a %(time)s"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "Ajouter des notes pour le signet: "
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "Signet de %s"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "Signet pour la page %d"
+
+#: readtoolbar.py:64
+msgid "Previous"
+msgstr "Précédent"
+
+#: readtoolbar.py:71
+msgid "Next"
+msgstr "Suivant"
+
+#: readtoolbar.py:157
+msgid "Find first"
+msgstr "Trouver le premier"
+
+#: readtoolbar.py:163
+msgid "Find previous"
+msgstr "Trouver le précédent"
+
+#: readtoolbar.py:165
+msgid "Find next"
+msgstr "Trouver le suivant"
+
+#: readtoolbar.py:187
+msgid "Zoom out"
+msgstr "Zoom arrière"
+
+#: readtoolbar.py:193
+msgid "Zoom in"
+msgstr "Zoom avant"
+
+#: readtoolbar.py:199
+msgid "Zoom to width"
+msgstr "Zoom à la largeur de la page"
+
+#: readtoolbar.py:205
+msgid "Zoom to fit"
+msgstr "Zoom plein écran"
+
+#: readtoolbar.py:210
+msgid "Actual size"
+msgstr "Dimension actuelle"
+
+#: readtoolbar.py:227
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:240
+msgid "Fullscreen"
+msgstr "Plein écran"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "Page %i sur %i"
+
+#~ msgid "Edit"
+#~ msgstr "Éditer"
+
+#~ msgid "View"
+#~ msgstr "Afficher"
+
+#~ msgid "Read Activity"
+#~ msgstr "Lecture"
diff --git a/po/gu.po b/po/gu.po
new file mode 100644
index 0000000..d206685
--- /dev/null
+++ b/po/gu.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:103
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/ha.po b/po/ha.po
new file mode 100644
index 0000000..328f81a
--- /dev/null
+++ b/po/ha.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: XbookActivity.py:49 XbookActivity.py:140
+msgid "Read Activity"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/he.po b/po/he.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/he.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/hi.po b/po/hi.po
new file mode 100644
index 0000000..cb743d0
--- /dev/null
+++ b/po/hi.po
@@ -0,0 +1,150 @@
+# translation of read-activity.po to Hindi
+# G Karunakar <karunakar@indlinux.org>, 2007.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+msgid ""
+msgstr ""
+"Project-Id-Version: read-activity\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-09 00:33-0400\n"
+"PO-Revision-Date: 2010-03-22 22:50+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: Hindi <indlinux-hindi@lists.sourceforge.net>\n"
+"Language: hi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Read"
+msgstr "पढ़ें"
+
+#: readactivity.py:330
+msgid "Back"
+msgstr "पीछे"
+
+#: readactivity.py:333
+msgid "Previous page"
+msgstr "पिछला पेज"
+
+#: readactivity.py:336
+msgid "Previous bookmark"
+msgstr "पिछला पसंदीदा"
+
+#: readactivity.py:346
+msgid "Forward"
+msgstr "आगे"
+
+#: readactivity.py:349
+msgid "Next page"
+msgstr "अगला पेज"
+
+#: readactivity.py:352
+msgid "Next bookmark"
+msgstr "अगला पसंदीदा"
+
+#: readactivity.py:537
+msgid "Choose document"
+msgstr "दस्तावेज़ चुनें"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "रद्द करें"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "ठीक"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>शीर्षक</b>:"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>विवरण</b>:"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "%(user)s %(time)s द्वारा पसंदीदा जोड़े गए"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "पसंदीदा के लिए टीप जोड़ें: "
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "%s का पसंदीदा"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "पृष्ठ %d के लिए पसंदीदा"
+
+#: readtoolbar.py:64
+msgid "Previous"
+msgstr "पिछला"
+
+#: readtoolbar.py:71
+msgid "Next"
+msgstr "अगला"
+
+#: readtoolbar.py:157
+msgid "Find first"
+msgstr "पहीले ढूँढें"
+
+#: readtoolbar.py:163
+msgid "Find previous"
+msgstr "पिछला ढूंढें"
+
+#: readtoolbar.py:165
+msgid "Find next"
+msgstr "अगला ढूंढें"
+
+#: readtoolbar.py:187
+msgid "Zoom out"
+msgstr "छोटे आकार में दिखाएँ"
+
+#: readtoolbar.py:193
+msgid "Zoom in"
+msgstr "बड़े आकार में दिखाएँ"
+
+#: readtoolbar.py:199
+msgid "Zoom to width"
+msgstr "चौड़ाई में बड़ा करें"
+
+#: readtoolbar.py:205
+msgid "Zoom to fit"
+msgstr "फिट होने लायक बड़ा करें"
+
+#: readtoolbar.py:210
+msgid "Actual size"
+msgstr "असली आकार"
+
+#: readtoolbar.py:227
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:240
+msgid "Fullscreen"
+msgstr "पूर्ण स्क्रीन"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "पृष्ठ %i में से: %i"
+
+#~ msgid "Edit"
+#~ msgstr "संपादन"
+
+#~ msgid "View"
+#~ msgstr "दृश्य"
+
+#~ msgid "Read Activity"
+#~ msgstr "पढ़ने के क्रियाकलाप"
diff --git a/po/ht.po b/po/ht.po
new file mode 100644
index 0000000..418d73a
--- /dev/null
+++ b/po/ht.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-03-11 09:03-0400\n"
+"Last-Translator: Jude Augusma <jayme2901@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "Li"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Edite"
+
+#: readactivity.py:103
+msgid "View"
+msgstr "Vizyalize"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Previzyon"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Pwochen"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Jwenn an premye"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Jwenn presedan"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Jwenn pwochen"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Retounen"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Avanse"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "rale soti"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "Rale vini"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "Rale louvri"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "Rale pou ajiste"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "Vrè dimansyon "
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "Tout ekran"
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/id.po b/po/id.po
new file mode 100644
index 0000000..f099bf7
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,148 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-08-06 00:33-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.3.0\n"
+
+#: activity/activity.info:2 readactivity.py:143
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:139
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:151
+msgid "View"
+msgstr ""
+
+#: readactivity.py:241
+msgid "Choose document"
+msgstr ""
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr ""
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr ""
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr ""
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr ""
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr ""
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr ""
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr ""
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr ""
+
+#: readtoolbar.py:91
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:98
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:184
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:190
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:192
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:205
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:208
+msgid "Previous page"
+msgstr ""
+
+#: readtoolbar.py:211
+msgid "Previous bookmark"
+msgstr ""
+
+#: readtoolbar.py:221
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:224
+msgid "Next page"
+msgstr ""
+
+#: readtoolbar.py:227
+msgid "Next bookmark"
+msgstr ""
+
+#: readtoolbar.py:468
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:474
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:480
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:486
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:491
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:508
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:521
+msgid "Fullscreen"
+msgstr ""
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr ""
diff --git a/po/ig.po b/po/ig.po
new file mode 100644
index 0000000..328f81a
--- /dev/null
+++ b/po/ig.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: XbookActivity.py:49 XbookActivity.py:140
+msgid "Read Activity"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/is.po b/po/is.po
new file mode 100644
index 0000000..2df1676
--- /dev/null
+++ b/po/is.po
@@ -0,0 +1,81 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "Lesa"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Breyta"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "Sýna"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Fyrri"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Næsta"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Aftur"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Áfram"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "Stækka"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "Minnka"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "Stækka í breidd"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "Stækka til að passa"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "Raunstærð"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..8b8b501
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,153 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-09 00:33-0400\n"
+"PO-Revision-Date: 2009-08-25 13:28-0400\n"
+"Last-Translator: Carlo Falciola <cfalciola@yahoo.it>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Read"
+msgstr "Leggi"
+
+#: readactivity.py:330
+msgid "Back"
+msgstr "Indietro"
+
+#: readactivity.py:333
+msgid "Previous page"
+msgstr "Pagina precedente"
+
+#: readactivity.py:336
+msgid "Previous bookmark"
+msgstr "Segnalibro precedente"
+
+#: readactivity.py:346
+msgid "Forward"
+msgstr "Avanti"
+
+#: readactivity.py:349
+msgid "Next page"
+msgstr "Prossima pagina"
+
+#: readactivity.py:352
+msgid "Next bookmark"
+msgstr "Prossimo segnalibro"
+
+#: readactivity.py:537
+msgid "Choose document"
+msgstr "Scegli documento"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "Annulla"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "Ok"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>Titolo</b>:"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>Dettagli</b>:"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "Segnalibro inserito da %(user)s %(time)s"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "Aggiungi annotazioni al segnalibro: "
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "segnalibro di %s"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "segnalibro alla pagina %d"
+
+#: readtoolbar.py:64
+msgid "Previous"
+msgstr "Precedente"
+
+#: readtoolbar.py:71
+msgid "Next"
+msgstr "Prossima"
+
+#: readtoolbar.py:157
+msgid "Find first"
+msgstr "Trova il primo"
+
+#: readtoolbar.py:163
+msgid "Find previous"
+msgstr "Trova successivo"
+
+#: readtoolbar.py:165
+msgid "Find next"
+msgstr "Trova prossimo"
+
+# Potrebbe essere anche "Rimpicciolire" o "Più piccolo"
+#: readtoolbar.py:187
+msgid "Zoom out"
+msgstr "Zoom indietro"
+
+# Potrebbe essere anche "Ingrandire" o "Più grande"
+#: readtoolbar.py:193
+msgid "Zoom in"
+msgstr "Zoom avanti"
+
+#: readtoolbar.py:199
+msgid "Zoom to width"
+msgstr "Zoom alla larghezza"
+
+#: readtoolbar.py:205
+msgid "Zoom to fit"
+msgstr "Zoom alla pagina"
+
+#: readtoolbar.py:210
+msgid "Actual size"
+msgstr "Larghezza attuale"
+
+#: readtoolbar.py:227
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:240
+msgid "Fullscreen"
+msgstr "Schermo intero"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "Pagina %i di %i"
+
+#~ msgid "Edit"
+#~ msgstr "Modifica"
+
+#~ msgid "View"
+#~ msgstr "Vista"
+
+#, fuzzy
+#~ msgid "Read Activity"
+#~ msgstr "Attività di lettura"
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 0000000..6d0ae31
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,147 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-09 00:33-0400\n"
+"PO-Revision-Date: 2010-01-22 04:15+0200\n"
+"Last-Translator: korakurider <korakurider@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Read"
+msgstr "Read"
+
+#: readactivity.py:330
+msgid "Back"
+msgstr "戻る"
+
+#: readactivity.py:333
+msgid "Previous page"
+msgstr "前ページ"
+
+#: readactivity.py:336
+msgid "Previous bookmark"
+msgstr "前のブックマーク"
+
+#: readactivity.py:346
+msgid "Forward"
+msgstr "進む"
+
+#: readactivity.py:349
+msgid "Next page"
+msgstr "次ページ"
+
+#: readactivity.py:352
+msgid "Next bookmark"
+msgstr "次のブックマーク"
+
+#: readactivity.py:537
+msgid "Choose document"
+msgstr "文書を選ぶ"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "OK"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>表題</b>:"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>詳細</b>:"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "%(user)sが %(time)s に追加したブックマーク"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "ブックマークにノートを追加: "
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "%s のブックマーク"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "ページ %d へのブックマーク"
+
+#: readtoolbar.py:64
+msgid "Previous"
+msgstr "前へ"
+
+#: readtoolbar.py:71
+msgid "Next"
+msgstr "次へ"
+
+#: readtoolbar.py:157
+msgid "Find first"
+msgstr "最初から検索"
+
+#: readtoolbar.py:163
+msgid "Find previous"
+msgstr "前を検索"
+
+#: readtoolbar.py:165
+msgid "Find next"
+msgstr "次を検索"
+
+#: readtoolbar.py:187
+msgid "Zoom out"
+msgstr "縮小"
+
+#: readtoolbar.py:193
+msgid "Zoom in"
+msgstr "拡大"
+
+#: readtoolbar.py:199
+msgid "Zoom to width"
+msgstr "幅にあわせて拡大"
+
+#: readtoolbar.py:205
+msgid "Zoom to fit"
+msgstr "画面にあわせて拡大"
+
+#: readtoolbar.py:210
+msgid "Actual size"
+msgstr "実際のサイズ"
+
+#: readtoolbar.py:227
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:240
+msgid "Fullscreen"
+msgstr "全画面"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "ページ %i/%i"
+
+#~ msgid "Edit"
+#~ msgstr "編集"
+
+#~ msgid "View"
+#~ msgstr "ビュー"
diff --git a/po/km.po b/po/km.po
new file mode 100644
index 0000000..a9c0ad2
--- /dev/null
+++ b/po/km.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Rit Lim <rit.lim@gmail.com>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-03-17 16:50-0400\n"
+"Last-Translator: Rit Lim <rit.lim@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "អាន"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "កែ"
+
+#: readactivity.py:103
+msgid "View"
+msgstr "មើល"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "ទៅ​ក្រោយ"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "ទៅ​មុខ"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "រក​ទី​មួយនៃ"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "រកទៅ​ក្រោយ​នៃ"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "រក​ទៅ​មុខ​នៃ"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "ថយ​ក្រោយ"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "ថយទៅមុខ"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "ពង្រីក"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "បង្រួម"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "ប៉ុន​ទទឹង"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "អោយ​សម"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "ទំហំ​ពិត"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "ពេញអេក្រង់"
diff --git a/po/ko.po b/po/ko.po
new file mode 100644
index 0000000..cc83252
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,81 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/kos.po b/po/kos.po
new file mode 100644
index 0000000..f099bf7
--- /dev/null
+++ b/po/kos.po
@@ -0,0 +1,148 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-08-06 00:33-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.3.0\n"
+
+#: activity/activity.info:2 readactivity.py:143
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:139
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:151
+msgid "View"
+msgstr ""
+
+#: readactivity.py:241
+msgid "Choose document"
+msgstr ""
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr ""
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr ""
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr ""
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr ""
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr ""
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr ""
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr ""
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr ""
+
+#: readtoolbar.py:91
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:98
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:184
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:190
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:192
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:205
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:208
+msgid "Previous page"
+msgstr ""
+
+#: readtoolbar.py:211
+msgid "Previous bookmark"
+msgstr ""
+
+#: readtoolbar.py:221
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:224
+msgid "Next page"
+msgstr ""
+
+#: readtoolbar.py:227
+msgid "Next bookmark"
+msgstr ""
+
+#: readtoolbar.py:468
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:474
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:480
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:486
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:491
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:508
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:521
+msgid "Fullscreen"
+msgstr ""
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr ""
diff --git a/po/mg.po b/po/mg.po
new file mode 100644
index 0000000..8708bae
--- /dev/null
+++ b/po/mg.po
@@ -0,0 +1,150 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-08-06 00:33-0400\n"
+"PO-Revision-Date: 2009-08-23 07:23-0400\n"
+"Last-Translator: Zafimamy Gabriella Ralaivao <gabriella@intnet.mu>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: mg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2 readactivity.py:143
+msgid "Read"
+msgstr "vakio"
+
+#: readactivity.py:139
+msgid "Edit"
+msgstr "Amboary"
+
+#: readactivity.py:151
+msgid "View"
+msgstr "jereo"
+
+#: readactivity.py:241
+msgid "Choose document"
+msgstr "Mifidiana tahirin-kevitra"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr ""
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr ""
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr ""
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr ""
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+#, fuzzy
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "Bokimarika nampidirin'i %(mpampiasa) tamin'ny %(fotoana)"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr ""
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr ""
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr ""
+
+#: readtoolbar.py:91
+msgid "Previous"
+msgstr "teo aloha"
+
+#: readtoolbar.py:98
+msgid "Next"
+msgstr "manaraka"
+
+#: readtoolbar.py:184
+msgid "Find first"
+msgstr "tadiavo aloha"
+
+#: readtoolbar.py:190
+msgid "Find previous"
+msgstr "tadiavo ny teo aloha"
+
+#: readtoolbar.py:192
+msgid "Find next"
+msgstr "tadiavo ny manaraka"
+
+#: readtoolbar.py:205
+msgid "Back"
+msgstr "miverina"
+
+#: readtoolbar.py:208
+msgid "Previous page"
+msgstr "Pejy teo aloha"
+
+#: readtoolbar.py:211
+msgid "Previous bookmark"
+msgstr "Bokimarika teo aloha"
+
+#: readtoolbar.py:221
+msgid "Forward"
+msgstr "Aroso"
+
+#: readtoolbar.py:224
+msgid "Next page"
+msgstr "Pejy manaraka"
+
+#: readtoolbar.py:227
+msgid "Next bookmark"
+msgstr "Bokimarika manaraka"
+
+#: readtoolbar.py:468
+msgid "Zoom out"
+msgstr "Tomory lavitra"
+
+#: readtoolbar.py:474
+msgid "Zoom in"
+msgstr "Tomory akaiky"
+
+#: readtoolbar.py:480
+msgid "Zoom to width"
+msgstr "Tomory amin'ny habeny"
+
+#: readtoolbar.py:486
+msgid "Zoom to fit"
+msgstr "Tomory amin'ny mahaomby"
+
+#: readtoolbar.py:491
+msgid "Actual size"
+msgstr "hadiry tena izy"
+
+#: readtoolbar.py:508
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:521
+msgid "Fullscreen"
+msgstr ""
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr ""
diff --git a/po/mi.po b/po/mi.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/mi.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/mk.po b/po/mk.po
new file mode 100644
index 0000000..0078541
--- /dev/null
+++ b/po/mk.po
@@ -0,0 +1,83 @@
+# translation of mk.po to Macedonian
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Arangel Angov <arangel@linux.net.mk>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: mk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2007-11-22 20:59+0000\n"
+"Last-Translator: Arangel Angov <arangel@slobodensoftver.org.mk>\n"
+"Language-Team: Macedonian <ossm-members@hedona.on.net.mk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "Читај"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Уреди"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "Поглед"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Претходно"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Следно"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Назад"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Напред"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "Намали"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "Зголеми"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "Зголеми во ширина"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "Собери"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "Вистинска големина"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
+
+#~ msgid "Read Activity"
+#~ msgstr "Активност за читање"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/ml.po b/po/ml.po
new file mode 100644
index 0000000..cc83252
--- /dev/null
+++ b/po/ml.po
@@ -0,0 +1,81 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/mn.po b/po/mn.po
new file mode 100644
index 0000000..0012687
--- /dev/null
+++ b/po/mn.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-09 00:33-0400\n"
+"PO-Revision-Date: 2009-09-22 13:51-0400\n"
+"Last-Translator: Odontsetseg Bat-Erdene <obat-erdene@suffolk.edu>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: mn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Read"
+msgstr "Унших"
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr "Засварлах"
+
+#: readactivity.py:137
+msgid "View"
+msgstr "Харах"
+
+#: readactivity.py:537
+msgid "Choose document"
+msgstr "Баримт сонгох"
+
+#: readtoolbar.py:64
+msgid "Previous"
+msgstr "Өмнөх"
+
+#: readtoolbar.py:71
+msgid "Next"
+msgstr "Дараах"
+
+#: readtoolbar.py:157
+msgid "Find first"
+msgstr "Эхнийхийг олох"
+
+#: readtoolbar.py:163
+msgid "Find previous"
+msgstr "Өмнөхийг олох"
+
+#: readtoolbar.py:165
+msgid "Find next"
+msgstr "Дараагийнхийг олох"
+
+#: readactivity.py:330
+msgid "Back"
+msgstr "Буцах"
+
+#: readactivity.py:346
+msgid "Forward"
+msgstr "Урагшлах"
+
+#: readtoolbar.py:187
+msgid "Zoom out"
+msgstr "Холдуулах"
+
+#: readtoolbar.py:193
+msgid "Zoom in"
+msgstr "Ойртуулах"
+
+#: readtoolbar.py:199
+msgid "Zoom to width"
+msgstr "Өргөнд тааруулах"
+
+#: readtoolbar.py:205
+msgid "Zoom to fit"
+msgstr "Багтахаар гаргах"
+
+#: readtoolbar.py:210
+msgid "Actual size"
+msgstr "Бодит хэмжээ"
+
+#: readtoolbar.py:227
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:240
+msgid "Fullscreen"
+msgstr "Дэлгэц дүүрэн"
+
+#: readactivity.py:333
+msgid "Previous page"
+msgstr "Өмнөх хуудас"
+
+#: readactivity.py:336
+msgid "Previous bookmark"
+msgstr "Өмнөх тэмдэглэгээ"
+
+#: readactivity.py:349
+msgid "Next page"
+msgstr "Дараах хуудас"
+
+#: readactivity.py:352
+msgid "Next bookmark"
+msgstr "Дараах тэмдэглэгээ"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "Болио"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "Зөв"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>Гарчиг</b>:"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>Деталь</b>:"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "%(user)s %(time)s-т тэмдэглэгээ нэмсэн"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "Тэмдэглэгээнд тайлбар хийх: "
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "%s-iin тэмдэглэгээ"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "%d -р хуудасны тэмдэглэгээ"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "%i-н %i-р хуудас"
diff --git a/po/mr.po b/po/mr.po
new file mode 100644
index 0000000..848e40e
--- /dev/null
+++ b/po/mr.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-04-28 02:45-0400\n"
+"Last-Translator: Rupali Sarode <rups23in@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "वाचा"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "संपादन करणे"
+
+#: readactivity.py:103
+msgid "View"
+msgstr "पाहा"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "अगोदरचा"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "यानंतर"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "पहिले शोधा"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "अगोदरचे शोधा"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "नंतरच शोधा"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "मागे"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "पुढे पाठविणे"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "झूम आउट"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "झूम ईन"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "झूम टू वीड्त"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "झूम टू फिट"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "वास्तविक आकार"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "पूर्ण पडदा"
diff --git a/po/ms.po b/po/ms.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/ms.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/mvo.po b/po/mvo.po
new file mode 100644
index 0000000..840ef9f
--- /dev/null
+++ b/po/mvo.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:103
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/nb.po b/po/nb.po
new file mode 100644
index 0000000..72145f0
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,88 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-07-23 16:45+0100\n"
+"Last-Translator: Kent Dahl <kentda@pvv.org>\n"
+"Language-Team: Norwegian <i18n-no@lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+#: readactivity.py:95
+msgid "Read"
+msgstr "Les"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Endre"
+
+#: readactivity.py:103
+#, fuzzy
+msgid "View"
+msgstr "Visning"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Forrige"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Neste"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Finn første"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Finn forrige"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Finn neste"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Tilbake"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Fremover"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "Forminsk"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "Forstørr"
+
+#: readtoolbar.py:283
+#, fuzzy
+msgid "Zoom to width"
+msgstr "Tilpass til bredden"
+
+#: readtoolbar.py:289
+#, fuzzy
+msgid "Zoom to fit"
+msgstr "Tilpass til størrelsen"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "Faktisk størrelse"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "Fullskjerm"
diff --git a/po/ne.po b/po/ne.po
new file mode 100644
index 0000000..6004aab
--- /dev/null
+++ b/po/ne.po
@@ -0,0 +1,91 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: 2009-02-25 23:58-0500\n"
+"Last-Translator: Shaksham Thapa <shaksham@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr "पढ"
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr "सम्पादन"
+
+#: readactivity.py:137
+msgid "View"
+msgstr "दृश्य"
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr "कागतपत्र छान"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "पहिलाको"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "यसपछिको"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "पहिलो भेट्टाउ"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "पहिलाको भेट्टाउ"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "यसपछिको भेट्टाउ"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "पछाडि"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "अगाडि"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "टाढाबाट हेर"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "नजिकबाट हेर्ने"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "पूरा चौडाई"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "सबै हेर्ने"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "वास्तविक परिमाण"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "पूरा स्कि्न"
+
+#~ msgid "Read Activity"
+#~ msgstr "पढाई क्रियाकलाप "
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 0000000..952a05b
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,152 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-08-06 00:33-0400\n"
+"PO-Revision-Date: 2009-09-04 01:53-0400\n"
+"Last-Translator: Myckel Habets <myckel@sdf.lonestar.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2 readactivity.py:143
+msgid "Read"
+msgstr "Lezen"
+
+#: readactivity.py:139
+msgid "Edit"
+msgstr "Bewerken"
+
+#: readactivity.py:151
+msgid "View"
+msgstr "Beeld"
+
+#: readactivity.py:241
+msgid "Choose document"
+msgstr "Kies document"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "Ok"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>Titel</b>:"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>Details</b>:"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "Bladwijzer toegevoegd door %(user)s %(time)s"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "Aantekeningen voor bladwijzer toevoegen: "
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "%s's bladwijzer"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "Bladwijzer voor pagina %d"
+
+#: readtoolbar.py:91
+msgid "Previous"
+msgstr "Vorige"
+
+#: readtoolbar.py:98
+msgid "Next"
+msgstr "Volgende"
+
+#: readtoolbar.py:184
+msgid "Find first"
+msgstr "Zoek eerste"
+
+#: readtoolbar.py:190
+msgid "Find previous"
+msgstr "Zoek vorige"
+
+#: readtoolbar.py:192
+msgid "Find next"
+msgstr "Zoek volgende"
+
+#: readtoolbar.py:205
+msgid "Back"
+msgstr "Terug"
+
+#: readtoolbar.py:208
+msgid "Previous page"
+msgstr "Vorige pagina"
+
+#: readtoolbar.py:211
+msgid "Previous bookmark"
+msgstr "Vorige bladwijzer"
+
+#: readtoolbar.py:221
+msgid "Forward"
+msgstr "Vooruit"
+
+#: readtoolbar.py:224
+msgid "Next page"
+msgstr "Volgende pagina"
+
+#: readtoolbar.py:227
+msgid "Next bookmark"
+msgstr "Volgende bladwijzer"
+
+#: readtoolbar.py:468
+msgid "Zoom out"
+msgstr "Zoom uit"
+
+#: readtoolbar.py:474
+msgid "Zoom in"
+msgstr "Zoom in"
+
+#: readtoolbar.py:480
+msgid "Zoom to width"
+msgstr "Zoom naar breedte"
+
+#: readtoolbar.py:486
+msgid "Zoom to fit"
+msgstr "Zoom naar hele pagina"
+
+#: readtoolbar.py:491
+msgid "Actual size"
+msgstr "Werkelijk formaat"
+
+#: readtoolbar.py:508
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:521
+msgid "Fullscreen"
+msgstr "Schermvullend"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "Pagina %i van %i"
+
+#~ msgid "Read Activity"
+#~ msgstr "Lezen Activiteit"
diff --git a/po/pa.po b/po/pa.po
new file mode 100644
index 0000000..cc83252
--- /dev/null
+++ b/po/pa.po
@@ -0,0 +1,81 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/pap.po b/po/pap.po
new file mode 100644
index 0000000..15aa235
--- /dev/null
+++ b/po/pap.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-06-18 18:32-0400\n"
+"Last-Translator: Urso Wieske <uwieske@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "Lesa"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Edita"
+
+#: readactivity.py:103
+msgid "View"
+msgstr "Mira"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Anterior"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Sigiente"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Buska promé"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Buska anterior"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Buska sigiente"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Bèk"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Avansa"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "Zoom out"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "Zoom in"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "Agusta e hanchura"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "Zoom pa fit"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "Size aktual"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "Pantaya kompleto"
diff --git a/po/pis.po b/po/pis.po
new file mode 100644
index 0000000..840ef9f
--- /dev/null
+++ b/po/pis.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:103
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 0000000..4a00053
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2007-11-28 15:49+0000\n"
+"Last-Translator: Wiktor Idzikowski <wiktor.idzikowski@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: XbookActivity.py:49 XbookActivity.py:140
+#, fuzzy
+msgid "Read Activity"
+msgstr "Czytanka"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "Widok"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Wstecz"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Dalej"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Poprzedni"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Następny"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "Czytaj"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Edytuj"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "Zmniejsz"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "Powiększ"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "Dopasuj do szerokości"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "Dopasuj"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "Aktualny rozmiar"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/ps.po b/po/ps.po
new file mode 100644
index 0000000..32c18fe
--- /dev/null
+++ b/po/ps.po
@@ -0,0 +1,80 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2008-01-04 13:32+0000\n"
+"Last-Translator: usman mansoor ansari <jalalkut@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "لوستل"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "اېډېټ"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "ليد"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "مخكنى"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "بل"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "لومړى وموندئ"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "مخكنى موندنه"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "بل موندنه"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "شا"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "مخته"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "لوكمول"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "لوډېرول"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "پسور پورې لوى كړئ"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "اسلولو پورې لوى كړئ"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "آر كچه"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
diff --git a/po/pseudo.po b/po/pseudo.po
new file mode 100644
index 0000000..de8db6d
--- /dev/null
+++ b/po/pseudo.po
@@ -0,0 +1,70 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-11-17 20:52+0100\n"
+"PO-Revision-Date: 2007-11-21 03:27+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: activity/activity.info:2 readactivity.py:84
+msgid "Read"
+msgstr "[ﻛ օƵј Јձ]ЯєаԺ"
+
+#: readactivity.py:80
+msgid "Edit"
+msgstr "[бВ أ ҍ]モԺآҭ"
+
+#: readactivity.py:88
+msgid "View"
+msgstr "[ҍﺳ آڑ ڃ ]Ѵїещ"
+
+#: readtoolbar.py:60
+msgid "Previous"
+msgstr "[ҁ щЦքЎղИҕٲБФҏ]Ряэմւօцی"
+
+#: readtoolbar.py:67
+msgid "Next"
+msgstr "[Ҳе я ԳՕङ]Иչҳт"
+
+#: readtoolbar.py:105
+msgid "Back"
+msgstr "[حҟҵ ѓĐսՅ]Ъձҫќ"
+
+#: readtoolbar.py:112
+msgid "Forward"
+msgstr "[П խەъչگ Ƶu ۦԼѓप]ҒюяաаяԺ"
+
+#: readtoolbar.py:207
+msgid "Zoom out"
+msgstr "[ГڑЂтĐҺ ԃワ ўэж ]Ƶююм юцե"
+
+#: readtoolbar.py:213
+msgid "Zoom in"
+msgstr "[مҲЎƵﻻ є ТԿճո ]Ƶююм آи"
+
+#: readtoolbar.py:219
+msgid "Zoom to width"
+msgstr "[ङдЌuщԲ ﻠҢЈ ќՄपճўՓՑ Їս]Żюօм ٲօ шїժեप"
+
+#: readtoolbar.py:225
+msgid "Zoom to fit"
+msgstr "[АФЊ щհ ԿԿ թ Չц ٮմキ]Żююм тю ғւե"
+
+#: readtoolbar.py:230
+msgid "Actual size"
+msgstr "[ҟ ЍјШ آчڈ ғ վƵТщкЄ]Дۦтцдլ یﻨƶэ"
+
+#: readtoolbar.py:248
+msgid "%"
+msgstr "[Жک ]%"
+
diff --git a/po/pt.po b/po/pt.po
new file mode 100644
index 0000000..ad06380
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,162 @@
+# Portuguese translations for PACKAGE package.
+# Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Tomeu Vizoso <tomeu@tomeuvizoso.net>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-09 00:33-0400\n"
+"PO-Revision-Date: 2009-09-18 11:32-0400\n"
+"Last-Translator: Eduardo H. Silva <HoboPrimate@gmail.com>\n"
+"Language-Team: Portuguese <translation-team-pt@lists.sourceforge.net>\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Read"
+msgstr "Ler"
+
+#: readactivity.py:330
+msgid "Back"
+msgstr "Voltar"
+
+#: readactivity.py:333
+msgid "Previous page"
+msgstr "Página anterior"
+
+#: readactivity.py:336
+msgid "Previous bookmark"
+msgstr "Marcador anterior"
+
+#: readactivity.py:346
+msgid "Forward"
+msgstr "Avançar"
+
+#: readactivity.py:349
+msgid "Next page"
+msgstr "Página seguinte"
+
+#: readactivity.py:352
+msgid "Next bookmark"
+msgstr "Marcador seguinte"
+
+#: readactivity.py:537
+msgid "Choose document"
+msgstr "Escolhe o documento"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "Ok"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>Título</b>:"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>Detalhes</b>:"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "Marcador adicionado por %(user)s %(time)s"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "Adiciona notas para o marcador: "
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "Marcador de %s"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "Marcador para a página %d"
+
+#: readtoolbar.py:64
+msgid "Previous"
+msgstr "Anterior"
+
+#: readtoolbar.py:71
+msgid "Next"
+msgstr "Seguinte"
+
+#: readtoolbar.py:157
+msgid "Find first"
+msgstr "Encontrar o primeiro"
+
+#: readtoolbar.py:163
+msgid "Find previous"
+msgstr "Encontrar o anterior"
+
+#: readtoolbar.py:165
+msgid "Find next"
+msgstr "Encontrar o próximo"
+
+#: readtoolbar.py:187
+msgid "Zoom out"
+msgstr "Afastar zoom"
+
+#: readtoolbar.py:193
+msgid "Zoom in"
+msgstr "Aproximar zoom"
+
+#: readtoolbar.py:199
+msgid "Zoom to width"
+msgstr "Zoom até à largura"
+
+#: readtoolbar.py:205
+msgid "Zoom to fit"
+msgstr "Zoom até caber"
+
+#: readtoolbar.py:210
+msgid "Actual size"
+msgstr "Tamanho real"
+
+#: readtoolbar.py:227
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:240
+msgid "Fullscreen"
+msgstr "Ecrã completo"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "Página %i de %i"
+
+#~ msgid "Edit"
+#~ msgstr "Editar"
+
+#~ msgid "View"
+#~ msgstr "Ver"
+
+#~ msgid "Read Activity"
+#~ msgstr "Actividade Ler"
+
+#~ msgid "Open a document to read"
+#~ msgstr "Abrir um documento para o ler"
+
+#~ msgid "All supported formats"
+#~ msgstr "Todos os formatos suportados"
+
+#~ msgid "All files"
+#~ msgstr "Todos os ficheiros"
+
+#~ msgid "Open"
+#~ msgstr "Abrir"
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644
index 0000000..099f6b7
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,85 @@
+# translation of pt_BR.po to Brazilian Portuguese
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Diego Búrigo Zacarão <diegobz@gmail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: pt_BR\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2008-01-19 11:07+0000\n"
+"Last-Translator: Eduardo H. Silva <HoboPrimate@gmail.com>\n"
+"Language-Team: Brazilian Portuguese <fedora-docs-br@redhat.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "Ler"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Editar"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "Ver"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Anterior"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Próxima"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Voltar"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Ir adiante"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "Diminuir zoom"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "Aumentar zoom"
+
+# baseado na tradução que tenho do Evince
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "Ajustar à largura"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "Melhor ajuste"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "Tamanho real"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
+
+#~ msgid "Read Activity"
+#~ msgstr "Ler a Atividade"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Buscar Primeiro"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Buscar Anterior"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Buscar Próximo"
diff --git a/po/qu.po b/po/qu.po
new file mode 100644
index 0000000..328f81a
--- /dev/null
+++ b/po/qu.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: XbookActivity.py:49 XbookActivity.py:140
+msgid "Read Activity"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/ro.po b/po/ro.po
new file mode 100644
index 0000000..1787a44
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2007-11-22 23:46+0000\n"
+"Last-Translator: Adi Roiban <adiroiban@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: XbookActivity.py:49 XbookActivity.py:140
+msgid "Read Activity"
+msgstr "Activitate de citire"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "Vizualizare"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Înapoi"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Înainte"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Anterior"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Următor"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "Citește"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Modifică"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "Micește lupa"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "Mărește lupa"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "Potrivește în lățime"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "Potrivește în întregime"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "Mărime actuală"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..cecfdd5
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2007-11-24 11:24+0000\n"
+"Last-Translator: Maxim Osipov <maxim.osipov@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: XbookActivity.py:49 XbookActivity.py:140
+msgid "Read Activity"
+msgstr "Активность Чтение"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "Просмотреть"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Назад"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Вперед"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Предыдущий"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Следующий"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "Читать"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Редактировать"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "Увеличить"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "Уменьшить"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "Масштабировать по ширине"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "Масштабировать по размеру"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "Оригинальный размер"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/rw.po b/po/rw.po
new file mode 100644
index 0000000..8ae8968
--- /dev/null
+++ b/po/rw.po
@@ -0,0 +1,86 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-07-31 12:01+0200\n"
+"Last-Translator: GASHAYIJA Guillaume <gashayija2002@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+#: readactivity.py:95
+msgid "Read"
+msgstr "Soma"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "Hindura"
+
+#: readactivity.py:103
+msgid "View"
+msgstr "Irebero"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Ibibanziriza"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Ibikurikira"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Shaka mbere"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Shaka Ibibanziriza"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Shaka ibikurikira"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Inyuma"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Imbere"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "Kwagura"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "Kugabanya"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "Agura ukigira kigari"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "Agura ikntu ugira ngo gikwire ahantu"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "Ingano nyayo"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "Ekarayose"
+
diff --git a/po/sd.po b/po/sd.po
new file mode 100644
index 0000000..5c1e346
--- /dev/null
+++ b/po/sd.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-05-01 09:26-0400\n"
+"Last-Translator: Naveed <sulmanminhas@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "read"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "edit"
+
+#: readactivity.py:103
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/si.po b/po/si.po
new file mode 100644
index 0000000..2cf1ab3
--- /dev/null
+++ b/po/si.po
@@ -0,0 +1,80 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2008-02-15 06:52-0500\n"
+"Last-Translator: Hayesha Somarathne <hayeshais@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "කියවන්න"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "සංස්කරණය කරන්න"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "දර්ශනය කරන්න"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "පෙර"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "ඊලඟ"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "පලමුව සොයන්න"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "පෙර එක සොයන්න"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "ඊලඟ එක සොයන්න"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "පසුපසට"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "ඉදිරියට"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "කුඩා කරන්න"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "විශාල කරන්න"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "පළල තෙක් විශාලනය"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "ගැලපීමට විශාලනය"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "සත්‍ය විශාලත්වය හෝ නියම විශාලත්වය"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
diff --git a/po/sk.po b/po/sk.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/sl.po b/po/sl.po
new file mode 100644
index 0000000..94ab47d
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,88 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: 2008-12-08 08:47-0500\n"
+"Last-Translator: Denis Oštir <denis.ostir@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr "Beri"
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr "Urejanje"
+
+#: readactivity.py:137
+msgid "View"
+msgstr "Pogled"
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr "Izberi dokument"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Prejšnji"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Naslednji"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Najdi prvega"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Najdi prejšnjega"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Najdi naslednjega"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Nazaj"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Naprej"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "Povečaj"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "Pomanjšaj"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "Povečaj do širine"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "Povečaj da ustreza"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "Normalna velikost"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "Cel zaslon"
diff --git a/po/sq.po b/po/sq.po
new file mode 100644
index 0000000..f099bf7
--- /dev/null
+++ b/po/sq.po
@@ -0,0 +1,148 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-08-06 00:33-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.3.0\n"
+
+#: activity/activity.info:2 readactivity.py:143
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:139
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:151
+msgid "View"
+msgstr ""
+
+#: readactivity.py:241
+msgid "Choose document"
+msgstr ""
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr ""
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr ""
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr ""
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr ""
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr ""
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr ""
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr ""
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr ""
+
+#: readtoolbar.py:91
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:98
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:184
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:190
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:192
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:205
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:208
+msgid "Previous page"
+msgstr ""
+
+#: readtoolbar.py:211
+msgid "Previous bookmark"
+msgstr ""
+
+#: readtoolbar.py:221
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:224
+msgid "Next page"
+msgstr ""
+
+#: readtoolbar.py:227
+msgid "Next bookmark"
+msgstr ""
+
+#: readtoolbar.py:468
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:474
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:480
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:486
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:491
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:508
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:521
+msgid "Fullscreen"
+msgstr ""
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr ""
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..e4df3a1
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,88 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: 2009-01-03 18:25-0500\n"
+"Last-Translator: Nicci Manns <nicci@saunalahti.fi>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr "Läs"
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr "Redigera"
+
+#: readactivity.py:137
+msgid "View"
+msgstr "Visa"
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr "Välj dokument"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "Föregående"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "Nästa"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "Sök första"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "Sök föregående"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "Sök nästa"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "Tillbaka"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "Framåt"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "Zooma ut"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "Zooma in"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "Anpassa till bredd"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "Bästa anpassning"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "Verklig storlek"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "Helskärm"
diff --git a/po/sw.po b/po/sw.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/sw.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/ta.po b/po/ta.po
new file mode 100644
index 0000000..3bc0389
--- /dev/null
+++ b/po/ta.po
@@ -0,0 +1,151 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-08-06 00:33-0400\n"
+"PO-Revision-Date: 2009-08-28 03:55-0400\n"
+"Last-Translator: Emilianuspillai Amirthanathan Gnanaseelan "
+"<gnanaseelan2001@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ta\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2 readactivity.py:143
+msgid "Read"
+msgstr "வாசி"
+
+#: readactivity.py:139
+msgid "Edit"
+msgstr "திருத்து"
+
+#: readactivity.py:151
+msgid "View"
+msgstr "பார்வையிடு"
+
+#: readactivity.py:241
+msgid "Choose document"
+msgstr "ஆவணத்தை தெரிவுசெய்"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "இரத்துசெய்"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "எல்லாம் சரி"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>Title</b>:"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>Details</b>:"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr ""
+"புத்தகக் குறி %(பாவனையாளரினால்)களினால் % (தரம்)ங்கள் சேர்க்கப்பட்டுள்ளது"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "புத்தகக் குறிக்கு குறிப்புக்களை சேர்க்க:_"
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "% ல் புத்தகக் குறி"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "பக்கத்திற்கான புத்தகக் குறி %"
+
+#: readtoolbar.py:91
+msgid "Previous"
+msgstr "முன்னைய"
+
+#: readtoolbar.py:98
+msgid "Next"
+msgstr "அடுத்தது"
+
+#: readtoolbar.py:184
+msgid "Find first"
+msgstr "முதலாவதை கண்டுபிடி"
+
+#: readtoolbar.py:190
+msgid "Find previous"
+msgstr "முன்னையதை கண்டுபிடி"
+
+#: readtoolbar.py:192
+msgid "Find next"
+msgstr "அடுத்தததை கண்டுபிடி"
+
+#: readtoolbar.py:205
+msgid "Back"
+msgstr "பின்னோக்கி அனுப்பு"
+
+#: readtoolbar.py:208
+msgid "Previous page"
+msgstr "முதற்பக்கம்"
+
+#: readtoolbar.py:211
+msgid "Previous bookmark"
+msgstr "முன்னைய புத்தகக்குறி "
+
+#: readtoolbar.py:221
+msgid "Forward"
+msgstr "முன்னோக்கி அனுப்பு"
+
+#: readtoolbar.py:224
+msgid "Next page"
+msgstr "அடுத்த பக்கம்"
+
+#: readtoolbar.py:227
+msgid "Next bookmark"
+msgstr "அடுத்த புத்தகக்குறி "
+
+#: readtoolbar.py:468
+msgid "Zoom out"
+msgstr "சிறிதாக்கிக் காட்டு"
+
+#: readtoolbar.py:474
+msgid "Zoom in"
+msgstr "பெரிதாக்கிக் காட்டு"
+
+#: readtoolbar.py:480
+msgid "Zoom to width"
+msgstr "அகலதிற்கு ஏற்றவாறு பெரிதாக்கு"
+
+#: readtoolbar.py:486
+msgid "Zoom to fit"
+msgstr "பொருந்துமாறு பெரிதாக்கு"
+
+#: readtoolbar.py:491
+msgid "Actual size"
+msgstr "சரியான அளவு"
+
+#: readtoolbar.py:508
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:521
+msgid "Fullscreen"
+msgstr "முழுத்திரை"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "பக்கத்தின் %"
diff --git a/po/te.po b/po/te.po
new file mode 100644
index 0000000..58abd47
--- /dev/null
+++ b/po/te.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-05-17 11:48+0100\n"
+"Last-Translator: Satyanarayana Murthy Saladi <saladism@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "చదువు"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "కూర్చు"
+
+#: readactivity.py:103
+msgid "View"
+msgstr "చూడు"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "ముందుది"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "తర్వాతది"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "మొదటిది వెతుకు"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "ముందుది వెతుకు"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "తర్వాతది వెతుకు"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "వెనుకకు"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "ముందుకు"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "దూరంచేసి చూడు"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "దగ్గరచేసి చూడు"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "పూర్తివెడల్పుగా చూడు"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "అంతా కనపడేలా చూడు"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "అసలు కొలత"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "తెరనిండుగా"
diff --git a/po/th.po b/po/th.po
new file mode 100644
index 0000000..92e48fe
--- /dev/null
+++ b/po/th.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2007-12-10 04:23+0000\n"
+"Last-Translator: Manatsawin <manatsawin@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: XbookActivity.py:49 XbookActivity.py:140
+msgid "Read Activity"
+msgstr "กิจกรรมอ่าน"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "มุมมอง"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "กลับ"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "ถัดไป"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "ก่อนหน้า"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "ถัดไป"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "อ่าน"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "แก้ไข"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "ขยายออก"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "ขยายเข้า"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "ขยายเต็มความกว้าง"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "ขยายพอดี"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "ขนาดเท่าจริง"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/tpi.po b/po/tpi.po
new file mode 100644
index 0000000..840ef9f
--- /dev/null
+++ b/po/tpi.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:103
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/tr.po b/po/tr.po
new file mode 100644
index 0000000..d6e176a
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-08-26 10:35-0400\n"
+"Last-Translator: abdullah kocabas <abdullah.kocabas@abcdizustu.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "okumak"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "düzenlemek"
+
+#: readactivity.py:103
+msgid "View"
+msgstr "görünüm"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "önceki"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "ileri"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "ilkini bulunuz."
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "öncekini bulunuz."
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "sonrakini bulunuz."
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "geri"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "ileri"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "uzaklaştırmak"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "büyütmek"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "enine büyütünüz."
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "boyuna büyütünüz."
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "gerçek boyut"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "tam ekran"
diff --git a/po/tvl.po b/po/tvl.po
new file mode 100644
index 0000000..a5f63b4
--- /dev/null
+++ b/po/tvl.po
@@ -0,0 +1,140 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-09 00:33-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.3.0\n"
+
+#: activity/activity.info:2
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:330
+msgid "Back"
+msgstr ""
+
+#: readactivity.py:333
+msgid "Previous page"
+msgstr ""
+
+#: readactivity.py:336
+msgid "Previous bookmark"
+msgstr ""
+
+#: readactivity.py:346
+msgid "Forward"
+msgstr ""
+
+#: readactivity.py:349
+msgid "Next page"
+msgstr ""
+
+#: readactivity.py:352
+msgid "Next bookmark"
+msgstr ""
+
+#: readactivity.py:537
+msgid "Choose document"
+msgstr ""
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr ""
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr ""
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr ""
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr ""
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr ""
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr ""
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr ""
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr ""
+
+#: readtoolbar.py:64
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:71
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:157
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:163
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:165
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:187
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:193
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:199
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:205
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:210
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:227
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:240
+msgid "Fullscreen"
+msgstr ""
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr ""
diff --git a/po/tzo.po b/po/tzo.po
new file mode 100644
index 0000000..f099bf7
--- /dev/null
+++ b/po/tzo.po
@@ -0,0 +1,148 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-08-06 00:33-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.3.0\n"
+
+#: activity/activity.info:2 readactivity.py:143
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:139
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:151
+msgid "View"
+msgstr ""
+
+#: readactivity.py:241
+msgid "Choose document"
+msgstr ""
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr ""
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr ""
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr ""
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr ""
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr ""
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr ""
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr ""
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr ""
+
+#: readtoolbar.py:91
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:98
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:184
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:190
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:192
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:205
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:208
+msgid "Previous page"
+msgstr ""
+
+#: readtoolbar.py:211
+msgid "Previous bookmark"
+msgstr ""
+
+#: readtoolbar.py:221
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:224
+msgid "Next page"
+msgstr ""
+
+#: readtoolbar.py:227
+msgid "Next bookmark"
+msgstr ""
+
+#: readtoolbar.py:468
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:474
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:480
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:486
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:491
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:508
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:521
+msgid "Fullscreen"
+msgstr ""
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr ""
diff --git a/po/ug.po b/po/ug.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/ug.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/ur.po b/po/ur.po
new file mode 100644
index 0000000..e6b28d0
--- /dev/null
+++ b/po/ur.po
@@ -0,0 +1,87 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-01 00:30-0500\n"
+"PO-Revision-Date: 2008-03-19 05:07-0400\n"
+"Last-Translator: salman minhas <sulmanminhas@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "پڑهیں"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "تدوین"
+
+#: readactivity.py:103
+msgid "View"
+msgstr "نظارہ"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "پچھلا"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "اگلا"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "پہلا ڈھونڈیں"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "پچھلا ڈھونڈیں"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "اگلا ڈھونڈیں"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "واپس"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "آگے"
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr "باہر زوم کریں"
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr "اندر زوم کریں"
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr "چوڑائی تک زوم کریں"
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr "فٹ کرنے کے لیے زوم کریں"
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr "اصل سائز"
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr "پوری سکرين"
+
+#~ msgid "Read Activity"
+#~ msgstr "پرھنے کی سرگرمی"
diff --git a/po/vi.po b/po/vi.po
new file mode 100644
index 0000000..7c181d4
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,147 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-09 00:33-0400\n"
+"PO-Revision-Date: 2009-09-24 10:44-0400\n"
+"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: vi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Read"
+msgstr "Đọc"
+
+#: readactivity.py:330
+msgid "Back"
+msgstr "Lùi"
+
+#: readactivity.py:333
+msgid "Previous page"
+msgstr "Trang trước"
+
+#: readactivity.py:336
+msgid "Previous bookmark"
+msgstr "Liên kết lưu trước"
+
+#: readactivity.py:346
+msgid "Forward"
+msgstr "Tiếp"
+
+#: readactivity.py:349
+msgid "Next page"
+msgstr "Trang sau"
+
+#: readactivity.py:352
+msgid "Next bookmark"
+msgstr "Liên kết lưu sau"
+
+#: readactivity.py:537
+msgid "Choose document"
+msgstr "Chọn tài liệu"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "Thôi"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "OK"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>Tên</b>:"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>Chi tiết</b>:"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "Liên kết được lưu bởi %(user)s %(time)s"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "Ghi chú về liên kết lưu : "
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "Liên kết lưu của %s"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "Liên kết lưu đến trang %d"
+
+#: readtoolbar.py:64
+msgid "Previous"
+msgstr "Lùi"
+
+#: readtoolbar.py:71
+msgid "Next"
+msgstr "Tiếp"
+
+#: readtoolbar.py:157
+msgid "Find first"
+msgstr "Tìm mục đầu"
+
+#: readtoolbar.py:163
+msgid "Find previous"
+msgstr "Tìm trước"
+
+#: readtoolbar.py:165
+msgid "Find next"
+msgstr "Tìm tiếp"
+
+#: readtoolbar.py:187
+msgid "Zoom out"
+msgstr "Thu nhỏ"
+
+#: readtoolbar.py:193
+msgid "Zoom in"
+msgstr "Phóng to"
+
+#: readtoolbar.py:199
+msgid "Zoom to width"
+msgstr "Phóng tới bề rộng"
+
+#: readtoolbar.py:205
+msgid "Zoom to fit"
+msgstr "Phóng vừa"
+
+#: readtoolbar.py:210
+msgid "Actual size"
+msgstr "Kích cỡ thật"
+
+#: readtoolbar.py:227
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:240
+msgid "Fullscreen"
+msgstr "Toàn màn hình"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "Trang %i trên %i"
+
+#~ msgid "Edit"
+#~ msgstr "Sửa"
+
+#~ msgid "View"
+#~ msgstr "Xem"
diff --git a/po/wa.po b/po/wa.po
new file mode 100644
index 0000000..d797e12
--- /dev/null
+++ b/po/wa.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-10-09 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2 readactivity.py:129
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:125
+msgid "Edit"
+msgstr ""
+
+#: readactivity.py:137
+msgid "View"
+msgstr ""
+
+#: readactivity.py:223
+msgid "Choose document"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:271
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:277
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:283
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:289
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:294
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:312
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:330
+msgid "Fullscreen"
+msgstr ""
diff --git a/po/yo.po b/po/yo.po
new file mode 100644
index 0000000..328f81a
--- /dev/null
+++ b/po/yo.po
@@ -0,0 +1,85 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: XbookActivity.py:49 XbookActivity.py:140
+msgid "Read Activity"
+msgstr ""
+
+#: readactivity.py:99
+msgid "View"
+msgstr ""
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr ""
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr ""
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr ""
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr ""
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr ""
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr ""
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr ""
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr ""
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr ""
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr ""
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr ""
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr ""
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr ""
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr ""
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 0000000..4d2e089
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,76 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: OLPC XBook\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-23 20:36+0000\n"
+"PO-Revision-Date: 2007-12-25 04:05+0000\n"
+"Last-Translator: Subo Dong <dsbalex@gmail.com>\n"
+"Language-Team: Yuan CHAO <yuanchao@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2 readactivity.py:95
+msgid "Read"
+msgstr "阅读"
+
+#: readactivity.py:91
+msgid "Edit"
+msgstr "编辑"
+
+#: readactivity.py:99
+msgid "View"
+msgstr "查看"
+
+#: readtoolbar.py:67
+msgid "Previous"
+msgstr "上一个"
+
+#: readtoolbar.py:74
+msgid "Next"
+msgstr "下一个"
+
+#: readtoolbar.py:160
+msgid "Back"
+msgstr "上一页"
+
+#: readtoolbar.py:167
+msgid "Forward"
+msgstr "下一页"
+
+#: readtoolbar.py:262
+msgid "Zoom out"
+msgstr "缩小"
+
+#: readtoolbar.py:268
+msgid "Zoom in"
+msgstr "放大"
+
+#: readtoolbar.py:274
+msgid "Zoom to width"
+msgstr "最适宽度"
+
+#: readtoolbar.py:280
+msgid "Zoom to fit"
+msgstr "页面大小"
+
+#: readtoolbar.py:285
+msgid "Actual size"
+msgstr "实际大小"
+
+#: readtoolbar.py:303
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:140
+msgid "Find first"
+msgstr "寻找第一个"
+
+#: readtoolbar.py:146
+msgid "Find previous"
+msgstr "寻找前一个"
+
+#: readtoolbar.py:148
+msgid "Find next"
+msgstr "寻找下一个"
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 0000000..45d656d
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,143 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: OLPC XBook\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-09 00:33-0400\n"
+"PO-Revision-Date: 2009-10-11 20:11-0400\n"
+"Last-Translator: Yuan Chao <yuanchao@gmail.com>\n"
+"Language-Team: Yuan CHAO <yuanchao@gmail.com>\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Read"
+msgstr "閱讀"
+
+#: readactivity.py:330
+msgid "Back"
+msgstr "後退"
+
+#: readactivity.py:333
+msgid "Previous page"
+msgstr "上一頁"
+
+#: readactivity.py:336
+msgid "Previous bookmark"
+msgstr "上一個書籤"
+
+#: readactivity.py:346
+msgid "Forward"
+msgstr "前進"
+
+#: readactivity.py:349
+msgid "Next page"
+msgstr "下一頁"
+
+#: readactivity.py:352
+msgid "Next bookmark"
+msgstr "下一個書籤"
+
+#: readactivity.py:537
+msgid "Choose document"
+msgstr "選擇文件"
+
+#: readdialog.py:49
+msgid "Cancel"
+msgstr "取消"
+
+#: readdialog.py:55
+msgid "Ok"
+msgstr "確定"
+
+#: readdialog.py:109
+msgid "<b>Title</b>:"
+msgstr "<b>標題</b>:"
+
+#: readdialog.py:136
+msgid "<b>Details</b>:"
+msgstr "<b>詳細說明</b>:"
+
+#. TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+#. TRANS: automatically)
+#: readsidebar.py:83
+#, python-format
+msgid "Bookmark added by %(user)s %(time)s"
+msgstr "書籤由 %(user)s 於 %(time)s 加入"
+
+#: readsidebar.py:124 readsidebar.py:164
+msgid "Add notes for bookmark: "
+msgstr "增加書籤註解:"
+
+#: readsidebar.py:161
+#, python-format
+msgid "%s's bookmark"
+msgstr "%s 的書籤"
+
+#: readsidebar.py:162
+#, python-format
+msgid "Bookmark for page %d"
+msgstr "第 %d 頁加入書籤"
+
+#: readtoolbar.py:64
+msgid "Previous"
+msgstr "上一個"
+
+#: readtoolbar.py:71
+msgid "Next"
+msgstr "下一個"
+
+#: readtoolbar.py:157
+msgid "Find first"
+msgstr "搜尋第一個"
+
+#: readtoolbar.py:163
+msgid "Find previous"
+msgstr "搜尋前一個"
+
+#: readtoolbar.py:165
+msgid "Find next"
+msgstr "搜尋下一個"
+
+#: readtoolbar.py:187
+msgid "Zoom out"
+msgstr "縮小"
+
+#: readtoolbar.py:193
+msgid "Zoom in"
+msgstr "放大"
+
+#: readtoolbar.py:199
+msgid "Zoom to width"
+msgstr "最適寬度"
+
+#: readtoolbar.py:205
+msgid "Zoom to fit"
+msgstr "頁面大小"
+
+#: readtoolbar.py:210
+msgid "Actual size"
+msgstr "實際大小"
+
+#: readtoolbar.py:227
+msgid "%"
+msgstr "%"
+
+#: readtoolbar.py:240
+msgid "Fullscreen"
+msgstr "全螢幕顯示"
+
+#. TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+#: readtopbar.py:201
+#, python-format
+msgid "Page %i of %i"
+msgstr "第 %i 頁 共 %i 頁"
+
+#~ msgid "Edit"
+#~ msgstr "編輯"
+
+#~ msgid "View"
+#~ msgstr "檢視"
diff --git a/readdb.py b/readdb.py
new file mode 100644
index 0000000..33571ae
--- /dev/null
+++ b/readdb.py
@@ -0,0 +1,881 @@
+# Copyright 2009 One Laptop Per Child
+# Author: Andreas Gros <info@andreasgros.net>, Sayamindu Dasgupta <sayamindu@laptop.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import logging
+
+import os, os.path
+import shutil
+import sqlite3
+import time
+import gconf
+import cjson
+import urllib, urllib2
+import re
+from xml.dom import minidom
+from sugar.datastore import datastore
+from sugar import mime
+from annobookmark import AnnoBookmark, Bookmark
+
+
+_logger = logging.getLogger('anno-activity')
+
+def _init_db():
+ dbdir = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'], 'data')
+ dbpath = os.path.join(dbdir, 'anno_v1.db')
+ olddbpath = os.path.join(dbdir, 'anno.db')
+
+ srcpath = os.path.join(os.environ['SUGAR_BUNDLE_PATH'], 'anno_v1.db')
+
+ #Situation 0: Db is existent
+ if os.path.exists(dbpath):
+ return dbpath
+
+ #Situation 1: DB is non-existent at all
+ if not os.path.exists(dbpath) and not os.path.exists(olddbpath):
+ try:
+ os.makedirs(dbdir)
+ except:
+ pass
+ shutil.copy(srcpath, dbpath)
+ return dbpath
+
+ #Situation 2: DB is outdated
+ if not os.path.exists(dbpath) and os.path.exists(olddbpath):
+ shutil.copy(olddbpath, dbpath)
+
+ conn = sqlite3.connect(dbpath)
+ conn.execute("CREATE TABLE temp_bookmarks AS SELECT md5, page, 'content', timestamp, user, color, local FROM bookmarks")
+ conn.execute("ALTER TABLE bookmarks RENAME TO bookmarks_old")
+ conn.execute("ALTER TABLE temp_bookmarks RENAME TO bookmarks")
+ conn.execute("DROP TABLE bookmarks_old")
+
+ #conn.execute("DROP TABLE annotations")
+ conn.execute("CREATE TABLE annotations (id INTEGER PRIMARY KEY, md5, page, title, content, bodyurl, context, created TIMESTAMP, modified TIMESTAMP, creator, annotates, rdf, color, local, mimetype, uuid, annotationurl, bodysvg)")
+ conn.execute("CREATE TABLE annuserid (username, userid)")
+ conn.commit()
+
+ conn.close()
+ return dbpath
+
+ # Should not reach this point
+ return None
+
+class BookmarkManager:
+ def __init__(self, filehash):
+ self._filehash = filehash
+
+ dbpath = _init_db()
+
+ assert dbpath != None
+
+ self._conn = sqlite3.connect(dbpath)
+ self._conn.text_factory = lambda x: unicode(x, "utf-8", "ignore")
+
+ self._bookmarks = []
+ self._populate_bookmarks()
+
+ def add_bookmark(self, page, content, local=1):
+ # locale = 0 means that this is a bookmark originally
+ # created by the person who originally shared the file
+ timestamp = time.time()
+ client = gconf.client_get_default()
+ user = client.get_string("/desktop/sugar/user/nick")
+ color = client.get_string("/desktop/sugar/user/color")
+
+ t = (self._filehash, page, content, timestamp, user, color, local)
+ self._conn.execute('insert into bookmarks values (?, ?, ?, ?, ?, ?, ?)', t)
+ self._conn.commit()
+
+ self._resync_bookmark_cache()
+
+
+
+ def del_bookmark(self, page):
+ client = gconf.client_get_default()
+ user = client.get_string("/desktop/sugar/user/nick")
+
+ # We delete only the locally made bookmark
+
+ t = (self._filehash, page, user)
+ self._conn.execute('delete from bookmarks where md5=? and page=? and user=?', t)
+ self._conn.commit()
+
+ self._resync_bookmark_cache()
+
+ def _populate_bookmarks(self):
+ # TODO: Figure out if caching the entire set of bookmarks is a good idea or not
+ rows = self._conn.execute('select * from bookmarks where md5=? order by page', (self._filehash,))
+
+ for row in rows:
+ self._bookmarks.append(Bookmark(row))
+
+ def get_bookmarks_for_page(self, page):
+ bookmarks = []
+ for bookmark in self._bookmarks:
+ if bookmark.belongstopage(page):
+ bookmarks.append(bookmark)
+
+ return bookmarks
+
+ def _resync_bookmark_cache(self):
+ # To be called when a new bookmark has been added/removed
+ self._bookmarks = []
+ self._populate_bookmarks()
+
+
+ def get_prev_bookmark_for_page(self, page, wrap = True):
+ if not len(self._bookmarks):
+ return None
+
+ if page <= self._bookmarks[0].page and wrap:
+ return self._bookmarks[-1]
+ else:
+ for i in range(page-1, -1, -1):
+ for bookmark in self._bookmarks:
+ if bookmark.belongstopage(i):
+ return bookmark
+
+ return None
+
+
+ def get_next_bookmark_for_page(self, page, wrap = True):
+ if not len(self._bookmarks):
+ return None
+
+ if page >= self._bookmarks[-1].page and wrap:
+ return self._bookmarks[0]
+ else:
+ for i in range(page+1, self._bookmarks[-1].page + 1):
+ for bookmark in self._bookmarks:
+ if bookmark.belongstopage(i):
+ return bookmark
+
+ return None
+
+
+#/////////////////////////////////////
+#working on: upon update of an annotation, all annotations are deleted and new one's created => needs to be fixed
+
+class AnnotationManager:
+ #Namespaces
+ #cnt http://www.w3.org/2008/content# Content in RDF [Content]
+ #dc http://purl.org/dc/elements/1.1/ Dublin Core elements [DC Elements]
+ #dcterms http://purl.org/dc/terms/ Dublin Core terms [DC Terms]
+ #foaf http://xmlns.com/foaf/0.1/ Friend of a Friend vocabulary terms [FOAF]
+ #oac http://www.openannotation.org/ns/ OAC vocabulary terms [OAC]
+ #ore http://www.openarchives.org/ore/terms/ ORE vocabulary terms
+ #rdf http://www.w3.org/1999/02/22-rdf-syntax-ns# RDF vocabulary terms [RDF Vocabulary]
+ #rdfs http://www.w3.org/2001/01/rdf-schema# RDF Schema vocabulary [RDF Vocabulary]
+ #bibo http://purl.org/ontology/bibo/ Bibliographic vocabulary
+ #oac:Annotation http://www.openannotation.org/ns/Annotation
+ #oac:hasTarget http://www.openannotation.org/ns/hasTarget
+ #oac:hasBody http://www.openannotation.org/ns/hasBody
+ #oac:Target http://www.openannotation.org/ns/Target
+ #oac:Body http://www.openannotation.org/ns/Body
+
+
+ def __init__(self, filehash, mimetype, sidebar):
+ self._sidebar = sidebar
+ self.current_annotation = None
+ self._userid = ''
+ self._filehash = filehash
+ self._uuid = filehash
+ self._mimetype = mimetype
+ self._annotitle = ''
+ self._content = ''
+ self._color = ''
+ self._local = ''
+ self._annotations = []
+ self._fileformat = 'image/svg+xml'
+ self._annotates = ''
+ self._creator = ''
+ self._created = ''
+ self._annotationurl = ''
+ self._bodyurl = ''
+ self._annotates = ''
+ self._context = ''
+ self._modified = ''
+ self._bodysvg = ''
+ self._id = ''
+ self._rdf = ''
+ self.modifiedtolerance = 10
+ #self._annotationserver='http://localhost/wordpress/wp-content/plugins/annotation/annotation.php'
+ self._annotationserver='http://www.andreasgros.net/wp-content/plugins/annotation/annotation.php'
+ self.get_etext_url()
+ self._to_delete = []
+ dbpath = _init_db()
+
+ assert dbpath != None
+
+ self._conn = sqlite3.connect(dbpath)
+ self._conn.text_factory = lambda x: unicode(x, 'utf-8', 'ignore')
+ self._annotations = []
+ self._populate_annotations()
+
+
+ def parse_userid(self, rdf):
+ userid = ''
+ dom = minidom.parseString(rdf)
+ userid = self.get_node_data(dom.getElementsByTagName("dcterms:identifier")[0])
+ _logger.debug('got this userid from the server: %s' % userid)
+ return userid
+
+
+ def get_userid_for_username(self, user):
+ userid = ''
+ rows = self._conn.execute('select userid from annuserid where username=?', (user, ))
+ if ( rows != None ):
+ r = rows.fetchone()
+ if r != None:
+ userid = r[0]
+ else:
+ url = self._annotationserver
+ values = {'getidforuser' : user}
+ try:
+ data = urllib.urlencode(values)
+ req = urllib2.Request(url, data)
+ response = urllib2.urlopen(req)
+ rdf = response.read()
+ _logger.debug("\n\ngot this userid rdf %s\n\n" % rdf)
+ userid = self.parse_userid(rdf)
+ _logger.debug("\nuserid is %s\n\n" % userid)
+ except Exception, detail:
+ _logger.debug("userid fetching failed; detail: %s ", detail)
+ self._conn.execute('insert into annuserid values (?, ?)', (user, userid))
+ self._conn.commit()
+ return userid
+
+
+ def add_annotation(self, page, content, local=1):
+ # locale = 0 means that this is a bookmark originally
+ # created by the person who originally shared the file
+ self._created = time.time()
+ self._modified = self._created
+ client = gconf.client_get_default()
+ user = client.get_string("/desktop/sugar/user/nick")
+ color = client.get_string("/desktop/sugar/user/color")
+
+ if self._userid == '':
+ self._userid = self.get_userid_for_username(user)
+
+ note = cjson.decode(content)
+ self._annotitle = note['title']
+ self._content = note['body']
+ self._creator = self._userid
+
+ _logger.debug('add_annotation content %s', self._content)
+ _logger.debug('annotation annotates %s', self._annotates)
+ #check what the url of the book is
+ #store annotation locally
+ #send annotation to server -> get url back, store url in body-url
+ #update annotation body url in local db
+
+ #url of the book?
+ #alter getBooks activity to add url to downloaded books' journal entry
+ #GetIABooksActivity.py
+ self._bodysvg = self.assembleSVG(self._annotitle, self._content)
+
+ #check the last id from the database store
+ row = self._conn.execute('select id from annotations where md5=? order by id desc limit 1', [self._filehash])
+ aid = 0
+ r = row.fetchone()
+ if r != None:
+ aid = int(r[0]) + 1
+
+ t = (aid, self._filehash, page, self._annotitle, self._content, self._bodyurl, self._context, self._created, self._modified, self._userid, self._annotates, '', self._color, self._local, self._mimetype, None, None, self._bodysvg)
+ annotation = AnnoBookmark(t)
+
+ self._rdf = self.create_rdf_representation(annotation)
+ #conn.execute("CREATE TABLE annotations (id INTEGER PRIMARY KEY, md5, page, title, content, bodyurl, context, created, modified, creator, annotates, rdf, color, local, mimetype, uuid)")
+
+ t = (aid, self._filehash, page, self._annotitle, self._content, self._bodyurl, self._context, self._created, self._modified, self._creator, self._annotates, self._rdf, self._color, self._local, self._mimetype, annotation.get_uuid(), None, self._bodysvg)
+ self._conn.execute('insert into annotations values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', t)
+ self._conn.commit()
+ self._resync_annotation_cache()
+ self.current_annotation = self._annotations[-1]
+ #self.sync_annotations()
+
+
+
+ def edit_annotation(self, page, content, annotation_id, local=1):
+ # local = 0 means that this is a bookmark originally
+ # created by the person who originally shared the file
+ print 'edit annotation called'
+ note = cjson.decode(content)
+ annotitle = note['title']
+ annocontent = note['body']
+
+ for a in self._annotations:
+ if a.get_id() == annotation_id:
+ a.set_modified(time.time())
+ a.set_note_title(annotitle)
+ a.set_note_body(annocontent)
+ a.set_bodysvg(self.assembleSVG(annotitle, annocontent))
+ a.set_rdf(self.create_rdf_representation(a))
+ self.update_annotation_db_record(a)
+ break
+
+ #self.sync_annotations()
+
+
+
+ def del_annotation(self, annotation_id):
+ client = gconf.client_get_default()
+ user = client.get_string("/desktop/sugar/user/nick")
+ #get the clientuuid to schedule its deletion on the annotation server
+ rows = self._conn.execute('select uuid from annotations where md5=? and id=?', [self._filehash, annotation_id])
+ row = rows.fetchone()
+ self._to_delete.append(row[0])
+ _logger.debug(str('schedule %s for deletion' % row[0]))
+ # We delete only the locally made annotation
+ t = (self._filehash, annotation_id, self._userid)
+ self._conn.execute('delete from annotations where md5=? and id=? and creator=?', t)
+ self._conn.commit()
+ self._resync_annotation_cache()
+
+
+
+
+ def _populate_annotations(self):
+ # TODO: Figure out if caching the entire set of annotations is a good idea or not
+ rows = self._conn.execute('select id, md5, page, title, content, bodyurl, context, created, modified, creator, annotates, rdf, color, local, mimetype, uuid, annotationurl, bodysvg from annotations where md5=? order by page', [self._filehash])
+ for row in rows:
+ self._annotations.append(AnnoBookmark(row))
+ _logger.debug('picked %s', self._annotations[-1].get_note_body())
+ _logger.debug('row content %s', row[4])
+ #self.sync_annotations()
+
+
+
+ def get_annotations_for_page(self, page):
+ annotations = []
+ for annotation in self._annotations:
+ if annotation.belongstopage(page):
+ annotations.append(annotation)
+ return annotations
+
+
+
+ def _resync_annotation_cache(self):
+ # To be called when a new bookmark has been added/removed
+ self._annotations = []
+ self._populate_annotations()
+
+
+
+ def get_pages_and_id_to_ann_map(self):
+ pages = {}
+ id_ann_map = {}
+ if len(self._annotations) == 0:
+ self._populate_annotations()
+ for a in self._annotations:
+ id_ann_map[a.id] = a
+ if a.page in pages.keys():
+ pages[a.page].append(a.id)
+ else:
+ pages[a.page] = [a.id]
+
+ _logger.debug('id_ann_map: %s' % str(id_ann_map))
+ return pages, id_ann_map
+
+
+ def get_prev_annotation(self, page):
+ pages, id_ann_map = self.get_pages_and_id_to_ann_map()
+ pages_with_annotations = sorted(pages.keys())
+ if not pages_with_annotations == None:
+ if self.current_annotation == None:
+ if not page in pages_with_annotations:
+ prevpages = [p for p in pages_with_annotations if p <= page]
+ if len(prevpages) > 0:
+ page = prevpages[-1]
+ else:
+ page = pages_with_annotations[-1]
+ self.current_annotation = id_ann_map[pages[page][0]]
+ t = pages[self.current_annotation.page]
+ tind = t.index(self.current_annotation.id)
+ if tind > 0: #prev annotation on the same page
+ self.current_annotation = id_ann_map[t[tind - 1]]
+ else:
+ self.current_annotation = id_ann_map[pages[pages_with_annotations[( pages_with_annotations.index(self.current_annotation.page) - 1 ) % len(pages_with_annotations)]][-1]]
+ return self.current_annotation
+ return None
+
+
+ def get_next_annotation(self, page):
+ pages, id_ann_map = self.get_pages_and_id_to_ann_map()
+ pages_with_annotations = sorted(pages.keys())
+ _logger.debug('pages with annotations: %s' % str(pages_with_annotations))
+ if not pages_with_annotations == None:
+ if self.current_annotation == None:
+ if not page in pages_with_annotations:
+ nextpages = [p for p in pages_with_annotations if p >= page]
+ if len(nextpages) > 0:
+ page = nextpages[0]
+ else:
+ page = pages_with_annotations[0]
+ self.current_annotation = id_ann_map[pages[page][0]]
+ t = pages[self.current_annotation.page]
+ _logger.debug('ids for current page %s' % str(t))
+ tind = t.index(self.current_annotation.id)
+ if tind < len(t) - 1: #next annotation on the same page
+ self.current_annotation = id_ann_map[t[tind + 1]]
+ else:
+ self.current_annotation = id_ann_map[pages[pages_with_annotations[( pages_with_annotations.index(self.current_annotation.page) + 1 ) % len(pages_with_annotations)]][0]]
+ return self.current_annotation
+ return None
+
+
+
+
+
+ def get_prev_annotation_for_page(self, page, wrap = True):
+ if not len(self._annotations):
+ return None
+
+ if page <= self._annotations[0].page and wrap:
+ return self._annotations[-1]
+ else:
+ for i in range(page-1, -1, -1):
+ for annotation in self._annotations:
+ if annotation.belongstopage(i):
+ return annotation
+
+ return None
+
+
+
+ def get_next_annotation_for_page(self, page, wrap = True):
+ if not len(self._annotations):
+ return None
+
+ if page >= self._annotations[-1].page and wrap:
+ return self._annotations[0]
+ else:
+ for i in range(page+1, self._annotations[-1].page + 1):
+ for annotation in self._annotations:
+ if annotation.belongstopage(i):
+ return annotation
+
+ return None
+
+
+
+ def get_node_data(self, domnode):
+ if domnode != None:
+ if domnode.firstChild != None:
+ return domnode.firstChild.data
+ return ''
+
+
+ def get_node_attribute(self, domnode, attributestr):
+ if ( domnode != None ) and ( attributestr in domnode.attributes.keys() ):
+ return domnode.attributes[attributestr].value
+ return ''
+
+
+
+ def parse_annotations(self, rdf):
+ remote_annotations = []
+ _logger.debug("parse_annotations: The RDF: %s", rdf)
+ dom = minidom.parseString(rdf)
+ annotations = dom.getElementsByTagName("oac:Annotation")
+ t1 = []
+ t2 = []
+ clientuuid = None
+ title = None
+ creator = None
+ page = None
+ created = None
+ annotates = None
+ contextabout = None
+ mimetype = None
+ contentnode = None
+ contentuuid = None
+ annourl = None
+ bodyurl = None
+ modified = None
+
+ for annotationdomelement in annotations:
+ _logger.debug(str('\n\nparsing annotation dom element xml %s\n\n' % annotationdomelement.toxml() ))
+ clientuuid = annotationdomelement.attributes[u'rdf:about'].value
+ title = self.get_node_data(annotationdomelement.getElementsByTagName("dc:title")[0])
+ creator = self.get_node_data(annotationdomelement.getElementsByTagName("dcterms:creator")[0])
+ page = self.get_node_data(annotationdomelement.getElementsByTagName("bibo:pageStart")[0])
+ if len(page) > 0:
+ page = int(page)
+ created = self.get_node_data(annotationdomelement.getElementsByTagName("oac:when")[0])
+ created = self.makeTimeStampFromDateTimeString(created)
+ annotates = self.get_node_attribute(annotationdomelement.getElementsByTagName("oac:hasTarget")[0], "rdf:resource")
+ contextabout = self.get_node_attribute(annotationdomelement.getElementsByTagName("oac:contextAbout")[0], "rdf:resource")
+ mimetype = self.get_node_data(annotationdomelement.getElementsByTagName("dc:type")[0])
+ context = self.get_node_attribute(annotationdomelement.getElementsByTagName("oac:Context")[0], "rdf:resource")
+ contentnodes = annotationdomelement.getElementsByTagName("oac:hasContent")
+ if ( contentnodes != None ) and ( len(contentnodes) > 0 ):
+ contentuuid = self.get_node_attribute(contentnodes[0], "rdf:about")
+ annourl = self.get_node_attribute(contentnodes[0].getElementsByTagName("rdf:type")[0], "rdf:resource")
+ bodyurl = self.get_node_data(contentnodes[0].getElementsByTagName("oac:body")[0])
+ modified = self.get_node_data(annotationdomelement.getElementsByTagName("dcterms:modified")[0])
+ modified = self.makeTimeStampFromDateTimeString(modified)
+ t1.append({'page' : page, 'bodyurl' : bodyurl, 'contextabout' : contextabout, 'created' : created, 'modified' : modified, 'creator' : creator, 'annotates' : annotates, 'mimetype' : mimetype, 'clientuuid' : clientuuid, 'annourl' : annourl })
+
+ descriptions = dom.getElementsByTagName("rdf:Description")
+ for desc in descriptions:
+ contentsvgnode = desc.getElementsByTagName("cnt:chars")[0]
+ contentsvg = contentsvgnode.toxml()
+ tspans = contentsvgnode.getElementsByTagName("svg:tspan")
+ notetitle = ''
+ notecontent = ''
+ for ts in tspans:
+ if ts.attributes["id"].value == 'notetitle':
+ notetitle = ts.firstChild.data
+ if ts.attributes["id"].value == 'notecontent':
+ notecontent = ts.firstChild.data
+ t2.append({'contentsvg' : contentsvg, 'notetitle' : notetitle, 'notecontent' : notecontent})
+ if (len(t1) > 0) and (len(t1) == len(t2)):
+ for i in range(len(t1)):
+ remote_annotations.append(AnnoBookmark((None, self._filehash, t1[i]['page'], t2[i]['notetitle'], t2[i]['notecontent'], t1[i]['bodyurl'], t1[i]['contextabout'], t1[i]['created'], t1[i]['modified'], t1[i]['creator'], t1[i]['annotates'], '', '', '', t1[i]['mimetype'], t1[i]['clientuuid'], t1[i]['annourl'], t2[i]['contentsvg'])))
+ else:
+ _logger.debug('Parse annotation error: RDF parsing went wrong: %s' % rdf)
+ return remote_annotations
+
+
+
+ def assemble_annotation(self, annotationdomelement):
+ _logger.debug("parse annotationdomelements %s ", annotationdomelement.toxml())
+ #clientuuid = annotationdomelement.firstChild.attributes["rdf:about"]
+ #_logger.debug("parse annotationdomelements: uuid: %s", clientuuid)
+ #title = annotationdomelement.getElementsByTagName("dc:title")[0].firstChild.data
+ #_logger.debug("parse annotationdomelements: title: %s", title)
+ #creator = annotationdomelement.getElementsByTagName("dcterms:creator")[0].firstChild.data
+ #_logger.debug("parse annotationdomelements: creator: %s", creator)
+ #created = annotationdomelement.getElementsByTagName("oac:when")[0].firstChild.data
+ #_logger.debug("parse annotationdomelements: created: %s", created)
+
+
+
+
+ def get_annotationurl_from_server_response(self, rdf):
+ annotationurl = ''
+ dom = minidom.parseString(rdf)
+ urlnodes = dom.getElementsByTagName("rdf:Description")
+ if ( urlnodes != None ):
+ node = urlnodes[0]
+ if "rdf:about" in node.attributes.keys():
+ annotationurl = node.attributes["rdf:about"].value
+ return annotationurl
+
+
+
+ #check for the uuid and pick the right one
+ def get_bodyurl_from_server_response(self, rdf):
+ bodyurl = ''
+ dom = minidom.parseString(rdf)
+ urlnodes = dom.getElementsByTagName("oac:body")
+ if ( urlnodes != None ):
+ node = urlnodes[0]
+ if "rdf:resource" in node.attributes.keys():
+ bodyurl = node.attributes["rdf:resource"].value
+ return bodyurl
+
+
+ #check for the uuid and pick the right one
+ def get_modified_from_server_response(self, rdf):
+ modified = ''
+ dom = minidom.parseString(rdf)
+ modified = self.get_node_data(dom.getElementsByTagName("dcterms:modified")[0])
+ if modified != None:
+ modified = self.makeTimeStampFromDateTimeString(modified)
+ return modified
+
+
+
+
+ def get_etext_url(self):
+ count = 0
+ (results,count) = datastore.find({'mime_type' : ['application/epub+zip', 'application/pdf', mime.GENERIC_TYPE_TEXT]}, ['mime_type', 'checksum', 'description'])
+ if count > 0:
+ for r in results:
+ m = r.get_metadata()
+ if m['checksum'] == self._filehash:
+ if len(m['description']) > 0:
+ url = m['description'].lstrip('From: ')
+ self._annotates = url
+ _logger.debug('found url %s - self._annotates' % self._annotates)
+
+
+
+ def insert_annotation_db_record(self, annotation):
+ t = (None, annotation.get_filehash(), annotation.get_page(), annotation.get_note_title(), annotation.get_note_body(), annotation.get_bodyurl(), annotation.get_context(), annotation.get_created(), annotation.get_modified(), annotation.get_creator(), annotation.get_annotates(), annotation.get_rdf(), annotation.get_color(), annotation.is_local(), annotation.get_mimetype(), annotation.get_uuid(), annotation.get_annotationurl(), annotation.get_bodysvg())
+ self._conn.execute('insert into annotations values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', t)
+ self._conn.commit()
+ self.current_annotation = annotation
+
+
+
+ def update_annotation_db_record(self, annotation):
+ t = (annotation.get_filehash(), annotation.get_page(), annotation.get_note_title(), annotation.get_note_body(), annotation.get_bodyurl(), annotation.get_context(), annotation.get_created(), annotation.get_modified(), annotation.get_creator(), annotation.get_annotates(), annotation.get_rdf(), annotation.get_color(), annotation.is_local(), annotation.get_mimetype(), annotation.get_uuid(), annotation.get_annotationurl(), annotation.get_bodysvg(), annotation.get_id())
+ self._conn.execute('update annotations set md5=?, page=?, title=?, content=?, bodyurl=?, context=?, created=?, modified=?, creator=?, annotates=?, rdf=?, color=?, local=?, mimetype=?, uuid=?, annotationurl=?, bodysvg=? where id=?', t)
+ self._conn.commit()
+ self.current_annotation = annotation
+
+ def makeDateTimeFromTimeStamp(self, tstamp):
+ return time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(tstamp))
+
+
+ def makeTimeStampFromDateTimeString(self, datetimestr):
+ return time.mktime(time.strptime(datetimestr, "%Y-%m-%d %H:%M:%S"))
+
+
+ def create_rdf_representation(self, annotation):
+ rstr = "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" "
+ rstr += "xmlns:rdfs=\"http://www.w3.org/2001/01/rdf-schema#\" "
+ rstr += "xmlns:cnt=\"http://www.w3.org/2008/content\" "
+ rstr += "xmlns:dc=\"http://purl.org/dc/elements/1.1/\" "
+ rstr += "xmlns:dcterms=\"http://purl.org/dc/terms/\" "
+ rstr += "xmlns:foaf=\"http://xmlns.com/foaf/0.1/\" "
+ rstr += "xmlns:oac=\"http://www.openannotation.org/ns/\" "
+ rstr += "xmlns:ore=\"http://www.openarchives.org/ore/terms/\" "
+ rstr += "xmlns:bibo=\"http://purl.org/ontology/bibo/\">"
+
+ rstr += "<oac:Annotation rdf:about=\"" + annotation.get_uuid() + "\">"
+ rstr += "<bibo:pageStart>" + str(annotation.get_page()) + "</bibo:pageStart>"
+ rstr += "<dc:title>" + annotation.get_note_title() + "</dc:title>"
+ rstr += "<oac:hasTarget rdf:resource=\"" + annotation.get_annotates() + "\" dcterms:isPartOf=\"" + annotation.get_annotates() + "\"/>"
+ rstr += "<oac:hasTargetContext>"
+ rstr += "<oac:TargetContext>"
+ rstr += "<oac:contextAbout rdf:resource=\"" + annotation.get_annotates() + "\"/>"
+ rstr += "<dc:type>" + annotation.get_mimetype() + "</dc:type>"
+ rstr += "</oac:TargetContext>"
+ rstr += "</oac:hasTargetContext>"
+
+ rstr += "<oac:hasContentContext>"
+ rstr += "<oac:Context rdf:resource=\"" + annotation.get_context() + "\">"
+ rstr += "<oac:contextAbout>"
+ rstr += annotation.get_annotates()
+ rstr += "</oac:contextAbout>"
+ rstr += '<oac:when>%s</oac:when>' % self.makeDateTimeFromTimeStamp(annotation.get_created())
+ rstr += "</oac:Context>"
+ rstr += "</oac:hasContentContext>"
+
+ rstr += "<rdf:type rdf:resource=\"http://www.w3.org/2000/10/annotation-ns#Annotation\"/>"
+ rstr += "<oac:predicate rdf:resource=\"http://www.openannotation.org/ns/annotates\"/>"
+ rstr += "<dcterms:creator>" + annotation.get_creator() + "</dcterms:creator>"
+
+ if (annotation.get_annotationurl() != None) and (len(annotation.get_annotationurl()) > 0) and (annotation.get_bodyurl() != None) and (len(annotation.get_bodyurl()) > 0):
+ rstr += "<oac:hasContent rdf:about=\"" + annotation.get_uuid() + "\">"
+ rstr += "<rdf:type rdf:resource=\"" + annotation.get_annotationurl() + "\"/>"
+ rstr += "<dc:title>" + annotation.get_note_title() + "</dc:title>"
+ rstr += "<oac:hasBody>"
+ rstr += "<rdf:type rdf:resource=\"http://www.openannotation.org/ns/Note\"/>"
+ rstr += "<oac:body>"
+ rstr += annotation.get_bodyurl()
+ rstr += "</oac:body>"
+ rstr += "</oac:hasBody>"
+ rstr += '<dcterms:modified> %s </dcterms:modified>' % self.makeDateTimeFromTimeStamp(annotation.get_modified())
+ rstr += "</oac:hasContent>"
+
+ rstr += "</oac:Annotation>"
+ rstr += "<rdf:Description rdf:about=\"" + annotation.get_annotates() + "\">"
+ rstr += "<ore:Proxy>"
+ rstr += "<ore:proxyIn rdf:nodeID=\"anno\" />"
+ rstr += "<ore:proxyFor rdf:resource=\"" + annotation.get_annotates() + "\">"
+ rstr += "<oac:hasSegmentDescription>"
+ rstr += "<oac:SegmentDescription dc:format=\"image/svg+xml\">"
+ rstr += "<cnt:ContentAsText>"
+ rstr += "<cnt:chars>"
+ rstr += annotation.get_bodysvg()
+ rstr += "</cnt:chars>"
+ rstr += "<cnt:characterEncoding>utf-8</cnt:characterEncoding>"
+ rstr += "</cnt:ContentAsText>"
+ rstr += "</oac:SegmentDescription>"
+ rstr += "</oac:hasSegmentDescription>"
+ rstr += "</ore:proxyFor>"
+ rstr += "</ore:Proxy>"
+ rstr += "</rdf:Description>"
+ rstr += "</rdf:RDF>"
+ return rstr
+
+
+
+ def assembleSVG(self, annotitle, annocontent):
+ #svg = "<?xml version=\"1.0\"?>"
+ svg = "<svg xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"500\" height=\"500\" id=\"svg2\">"
+ svg += "<g id=\"layer1\">"
+ svg += "<rect width=\"500\" height=\"500\" x=\"0\" y=\"0\" id=\"rect2816\" style=\"fill:none;stroke:#000000;stroke-opacity:1\"/>"
+ svg += "<text x=\"2\" y=\"2\" id=\"text2818\" xml:space=\"preserve\" style=\"font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans\">"
+ svg += "<tspan x=\"10\" y=\"50\" id=\"notetitle\">" + annotitle + "</tspan>"
+ svg += "</text>"
+
+ svg += "<text x=\"2\" y=\"150\" id=\"text2830\" xml:space=\"preserve\" style=\"font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans\">"
+ svg += "<tspan x=\"10\" y=\"150\" id=\"notecontent\">" + annocontent + "</tspan>"
+ svg += "</text>"
+ svg += "</g>"
+ svg += "</svg>"
+ return svg
+
+
+
+ def download_annotations(self):
+ url = self._annotationserver
+ annotations = []
+ annordf = ""
+ _logger.debug("contacting annotationserver %s", url)
+ if self._annotates == "":
+ self._annotates = "_"
+ values = {'w3c_hasTarget' : self._annotates}
+ _logger.debug('download annotations -- annotates is: %s ' % self._annotates)
+ try:
+ data = urllib.urlencode(values)
+ req = urllib2.Request(url, data)
+ response = urllib2.urlopen(req)
+ annordf = response.read()
+ except Exception, detail:
+ _logger.debug("readdb: failure at initial sync request f. annotations; detail: %s ", detail)
+
+ if (annordf != None) and (len(annordf) > 0):
+ anno_arr = self.parse_annotations(annordf)
+ _logger.debug('length anno_arr %d', len(anno_arr))
+ remote_uuids = []
+ if len(anno_arr) > 0:
+ remote_uuids = [a.get_uuid() for a in anno_arr]
+ _logger.debug('remote_uuids %s', remote_uuids)
+ #check the modified timestamps
+ localuuids = [la.get_uuid() for la in self._annotations]
+ for a in anno_arr:
+ uuid = a.get_uuid()
+ if uuid in localuuids:
+ _logger.debug('uuid exists locally')
+ ind = localuuids.index(uuid)
+ rmodifiedtstamp = a.get_modified()
+ _logger.debug(str('timestamps are remote: %d, local %d' % (rmodifiedtstamp, self._annotations[ind].get_modified())))
+ if self._annotations[ind].get_modified() < rmodifiedtstamp - self.modifiedtolerance:
+ _logger.debug('remote annotation is more recent than local annotation')
+ #take over the content
+ self._annotations[ind].set_note_title(a.get_note_title())
+ self._annotations[ind].set_note_body(a.get_note_body())
+ self._annotations[ind].set_modified(rmodifiedtstamp)
+ self.update_annotation_db_record(a)
+ _logger.debug(str('after update: timestamps are remote: %d, local %d' % (rmodifiedtstamp, self._annotations[ind].get_modified())))
+ else:
+ if self._annotations[ind].get_creator() == self._creator:
+ _logger.debug(str('remote annotation is outdated, sending %s' % self._annotations[ind]))
+ self.send_annotation_to_server(self._annotations[ind])
+ else:
+ self._annotations.append(a)
+ self.insert_annotation_db_record(a)
+ self._sidebar.update_for_page(a.page)
+
+
+
+
+ def sync_annotations(self):
+ url = self._annotationserver
+ annotations = []
+ annordf = ""
+ _logger.debug("contacting annotationserver %s", url)
+ if self._annotates == "":
+ self._annotates = "_"
+ #check if there are annotations to be deleted:
+ if len(self._to_delete) > 0:
+ for delete_anid in self._to_delete:
+ values = {'w3c_hasTarget' : self._annotates, 'delete_anid': delete_anid }
+ try:
+ data = urllib.urlencode(values)
+ req = urllib2.Request(url, data)
+ response = urllib2.urlopen(req)
+ annordf = response.read()
+ self._to_delete.remove(delete_anid)
+ _logger.debug("\nafter delete, rdf is: %s\n\n" % annordf)
+ except Exception, detail:
+ _logger.debug("readdb: failure at request f. deleting annotations; detail: %s ", detail)
+ else:
+ #get annotations from server
+ client = gconf.client_get_default()
+ user = client.get_string("/desktop/sugar/user/nick")
+
+ if self._userid == '':
+ self._userid = self.get_userid_for_username(user)
+ self._creator = self._userid
+
+ values = {'w3c_hasTarget' : self._annotates, 'creator' : self._creator }
+ _logger.debug('sync annotations -- annotates is: %s ' % self._annotates)
+ try:
+ data = urllib.urlencode(values)
+ req = urllib2.Request(url, data)
+ response = urllib2.urlopen(req)
+ annordf = response.read()
+ except Exception, detail:
+ _logger.debug("readdb: failure at initial sync request f. annotations; detail: %s ", detail)
+ if (annordf != None) and (len(annordf) > 0):
+ anno_arr = self.parse_annotations(annordf)
+ _logger.debug('length anno_arr %d', len(anno_arr))
+ remote_uuids = []
+ if len(anno_arr) > 0:
+ localuuids = [la.get_uuid() for la in self._annotations]
+ remote_uuids = [a.get_uuid() for a in anno_arr]
+ _logger.debug('remote_uuids %s', remote_uuids)
+ #check the modified timestamps
+ for a in anno_arr:
+ uuid = a.get_uuid()
+ if uuid in localuuids:
+ _logger.debug('uuid exists locally')
+ ind = localuuids.index(uuid)
+ rmodifiedtstamp = a.get_modified()
+ _logger.debug(str('timestamps are remote: %d, local %d' % (rmodifiedtstamp, self._annotations[ind].get_modified())))
+ if self._annotations[ind].get_modified() < rmodifiedtstamp - self.modifiedtolerance:
+ _logger.debug('remote annotation is more recent than local annotation')
+ #take over the content
+ self._annotations[ind].set_note_title(a.get_note_title())
+ self._annotations[ind].set_note_body(a.get_note_body())
+ self._annotations[ind].set_modified(rmodifiedtstamp)
+ _logger.debug(str('after update: timestamps are remote: %d, local %d' % (rmodifiedtstamp, self._annotations[ind].get_modified())))
+ self.update_annotation_db_record(a)
+ else:
+ _logger.debug(str('remote annotation is outdated, sending %s' % self._annotations[ind]))
+ self.send_annotation_to_server(self._annotations[ind])
+
+ if (len(self._annotations) > 0):
+ #send annotations if necessary
+ for annotation in self._annotations:
+ if not annotation.get_uuid() in remote_uuids:
+ self.send_annotation_to_server(annotation)
+
+
+
+ def send_annotation_to_server(self, annotation):
+ url = self._annotationserver
+ annordf = self.create_rdf_representation(annotation)
+ _logger.debug('it is a new or updated annotation, trying to send it to server, rdf: %s', annotation)
+ try:
+ req = urllib2.Request(url, annordf)
+ req.add_header('Content-Type', 'text/xml')
+ response = urllib2.urlopen(req)
+ re_rdf = response.read()
+ _logger.debug('rdf response from the server: %s', re_rdf)
+ annourl = self.get_annotationurl_from_server_response(re_rdf)
+ _logger.debug('got this annourl back from server: %s', annourl)
+ if annourl != None:
+ annotation.set_annotationurl(annourl)
+ bodyurl = self.get_bodyurl_from_server_response(re_rdf)
+ _logger.debug('got this bodyurl back from server: %s', bodyurl)
+ if bodyurl != None:
+ annotation.set_bodyurl(bodyurl)
+ self.update_annotation_db_record(annotation)
+ except Exception, detail:
+ _logger.debug("readdb: sending annotation failed: %s ", detail)
+
+
diff --git a/readdialog.py b/readdialog.py
new file mode 100644
index 0000000..65981ec
--- /dev/null
+++ b/readdialog.py
@@ -0,0 +1,289 @@
+#!/usr/bin/env python
+
+# Stolen from the PyGTK demo module by Maik Hertha <maik.hertha@berlin.de>
+
+import gtk
+import gobject
+
+from sugar.graphics import style
+from sugar.graphics.toolbutton import ToolButton
+
+from gettext import gettext as _
+import cjson
+
+class BaseReadDialog(gtk.Window):
+ def __init__(self, parent_xid, dialog_title):
+ gtk.Window.__init__(self)
+
+ self.connect('realize', self.__realize_cb)
+
+ self.set_decorated(False)
+ self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
+ self.set_border_width(style.LINE_WIDTH)
+
+ width = gtk.gdk.screen_width() - style.GRID_CELL_SIZE * 4
+ height = gtk.gdk.screen_height() - style.GRID_CELL_SIZE * 4
+ self.set_size_request(width, height)
+
+ self._parent_window_xid = parent_xid
+
+ _vbox = gtk.VBox(spacing=2)
+ self.add(_vbox)
+
+ self.toolbar = gtk.Toolbar()
+ label = gtk.Label()
+ label.set_markup('<b> %s</b>' % dialog_title)
+ label.set_alignment(0, 0.5)
+ tool_item = gtk.ToolItem()
+ tool_item.add(label)
+ label.show()
+ self.toolbar.insert(tool_item, -1)
+ tool_item.show()
+
+ separator = gtk.SeparatorToolItem()
+ separator.props.draw = False
+ separator.set_expand(True)
+ self.toolbar.insert(separator, -1)
+ separator.show()
+ stop = ToolButton(icon_name='dialog-cancel')
+ stop.set_tooltip(_('Cancel'))
+ stop.connect('clicked', lambda *w: self.destroy())
+ self.toolbar.insert(stop, -1)
+ stop.show()
+
+ delete = ToolButton(icon_name='edit-delete')
+ delete.set_tooltip(_('Delete'))
+ delete.connect('clicked', self.accept_clicked_delete_cb)
+ self.toolbar.insert(delete, -1)
+ delete.show()
+
+
+ accept = ToolButton(icon_name='dialog-ok')
+ accept.set_tooltip(_('Ok'))
+ accept.connect('clicked', self.accept_clicked_cb)
+ accept.show()
+ self.toolbar.insert(accept, -1)
+
+ _vbox.pack_start(self.toolbar, expand=False)
+ self.toolbar.show()
+
+ self._event_box = gtk.EventBox()
+ _vbox.pack_start(self._event_box, expand=True, fill = True)
+ self._canvas = None
+
+ def set_canvas(self, canvas):
+ if self._canvas is not None:
+ self._event_box.remove(self._canvas)
+ self._event_box.add(canvas)
+ self._canvas = canvas
+
+ def __realize_cb(self, widget):
+ self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
+ self.window.set_accept_focus(True)
+
+ parent = gtk.gdk.window_foreign_new(self._parent_window_xid)
+ self.window.set_transient_for(parent)
+
+ self.modify_bg(gtk.STATE_NORMAL,
+ style.COLOR_WHITE.get_gdk_color())
+
+ if self._canvas is not None:
+ self._canvas.modify_bg(gtk.STATE_NORMAL,
+ style.COLOR_WHITE.get_gdk_color())
+ self._canvas.grab_focus()
+
+ self._event_box.modify_bg(gtk.STATE_NORMAL,
+ style.COLOR_WHITE.get_gdk_color())
+
+ def accept_clicked_cb(self, widget):
+ raise NotImplementedError
+
+
+ def accept_clicked_delete_cb(self, widget):
+ raise NotImplementedError
+
+class BookmarkDialog(BaseReadDialog):
+ def __init__(self, parent_xid, dialog_title, bookmark_title, bookmark_content, page, sidebarinstance):
+ BaseReadDialog.__init__(self, parent_xid, dialog_title)
+
+ self._sidebarinstance = sidebarinstance
+ self._page = page
+
+ vbox = gtk.VBox()
+ thbox = gtk.HBox()
+ vbox.pack_start(thbox, expand = False, fill = False)
+ thbox.set_border_width(style.DEFAULT_SPACING * 2)
+ thbox.set_spacing(style.DEFAULT_SPACING)
+ thbox.show()
+
+ label_title = gtk.Label(_('<b>Title</b>:'))
+ label_title.set_use_markup(True)
+ label_title.set_alignment(1, 0.5)
+ label_title.modify_fg(gtk.STATE_NORMAL,
+ style.COLOR_SELECTION_GREY.get_gdk_color())
+ thbox.pack_start(label_title, expand=False, fill = False)
+ label_title.show()
+
+ self._title_entry = gtk.Entry()
+ self._title_entry.modify_bg(gtk.STATE_INSENSITIVE,
+ style.COLOR_WHITE.get_gdk_color())
+ self._title_entry.modify_base(gtk.STATE_INSENSITIVE,
+ style.COLOR_WHITE.get_gdk_color())
+ self._title_entry.set_size_request(int(gtk.gdk.screen_width() / 3), -1)
+
+ thbox.pack_start(self._title_entry, expand = False, fill = False)
+ self._title_entry.show()
+ if bookmark_title is not None:
+ self._title_entry.set_text(bookmark_title)
+
+
+ cvbox = gtk.VBox()
+ vbox.pack_start(cvbox, expand = True, fill = True)
+ cvbox.set_border_width(style.DEFAULT_SPACING * 2)
+ cvbox.set_spacing(style.DEFAULT_SPACING/2)
+ cvbox.show()
+
+ label_content = gtk.Label(_('<b>Details</b>:'))
+ label_content.set_use_markup(True)
+ label_content.set_alignment(0, 0)
+ label_content.modify_fg(gtk.STATE_NORMAL,
+ style.COLOR_SELECTION_GREY.get_gdk_color())
+ cvbox.pack_start(label_content, expand=False, fill = False)
+ label_content.show()
+
+ sw = gtk.ScrolledWindow()
+ sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+
+ self._content_entry = gtk.TextView()
+ self._content_entry.set_wrap_mode(gtk.WRAP_WORD)
+
+ sw.add(self._content_entry)
+ sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
+
+ cvbox.pack_start(sw, expand = True, fill = True)
+ self._content_entry.show()
+ if bookmark_content is not None:
+ buffer = self._content_entry.get_buffer()
+ buffer.set_text(bookmark_content)
+
+ self.set_canvas(vbox)
+
+class BookmarkAddDialog(BookmarkDialog):
+ def __init__(self, parent_xid, dialog_title, bookmark_title, bookmark_content, page, sidebarinstance):
+ BookmarkDialog.__init__(self, parent_xid, dialog_title, bookmark_title, bookmark_content, page, sidebarinstance)
+
+ def accept_clicked_cb(self, widget):
+ title = self._title_entry.get_text()
+ details = self._content_entry.get_buffer().props.text
+ content = {'title' : unicode(title), 'body' : unicode(details)}
+ self._sidebarinstance._real_add_bookmark(self._page, cjson.encode(content))
+ self.destroy()
+
+class BookmarkEditDialog(BookmarkDialog):
+ def __init__(self, parent_xid, dialog_title, bookmark_title, bookmark_content, page, sidebarinstance):
+ BookmarkDialog.__init__(self, parent_xid, dialog_title, bookmark_title, bookmark_content, page, sidebarinstance)
+
+ def accept_clicked_cb(self, widget):
+ title = self._title_entry.get_text()
+ details = self._content_entry.get_buffer().props.text
+ content = {'title' : unicode(title), 'body' : unicode(details)}
+ self._sidebarinstance.del_bookmark(self._page)
+ self._sidebarinstance._real_add_bookmark(self._page, cjson.encode(content))
+ self.destroy()
+
+
+class AnnotationDialog(BaseReadDialog):
+ def __init__(self, parent_xid, dialog_title, annotation_id, annotation_title, annotation_content, page, sidebarinstance):
+ BaseReadDialog.__init__(self, parent_xid, dialog_title)
+
+ self._sidebarinstance = sidebarinstance
+ self._page = page
+ self._annotation_id = annotation_id
+
+ vbox = gtk.VBox()
+ thbox = gtk.HBox()
+ vbox.pack_start(thbox, expand = False, fill = False)
+ thbox.set_border_width(style.DEFAULT_SPACING * 2)
+ thbox.set_spacing(style.DEFAULT_SPACING)
+ thbox.show()
+
+ label_title = gtk.Label(_('<b>Title</b>:'))
+ label_title.set_use_markup(True)
+ label_title.set_alignment(1, 0.5)
+ label_title.modify_fg(gtk.STATE_NORMAL,
+ style.COLOR_SELECTION_GREY.get_gdk_color())
+ thbox.pack_start(label_title, expand=False, fill = False)
+ label_title.show()
+
+ self._title_entry = gtk.Entry()
+ self._title_entry.modify_bg(gtk.STATE_INSENSITIVE,
+ style.COLOR_WHITE.get_gdk_color())
+ self._title_entry.modify_base(gtk.STATE_INSENSITIVE,
+ style.COLOR_WHITE.get_gdk_color())
+ self._title_entry.set_size_request(int(gtk.gdk.screen_width() / 3), -1)
+
+ thbox.pack_start(self._title_entry, expand = False, fill = False)
+ self._title_entry.show()
+ if annotation_title is not None:
+ self._title_entry.set_text(annotation_title)
+
+
+ cvbox = gtk.VBox()
+ vbox.pack_start(cvbox, expand = True, fill = True)
+ cvbox.set_border_width(style.DEFAULT_SPACING * 2)
+ cvbox.set_spacing(style.DEFAULT_SPACING/2)
+ cvbox.show()
+
+ label_content = gtk.Label(_('<b>Details</b>:'))
+ label_content.set_use_markup(True)
+ label_content.set_alignment(0, 0)
+ label_content.modify_fg(gtk.STATE_NORMAL,
+ style.COLOR_SELECTION_GREY.get_gdk_color())
+ cvbox.pack_start(label_content, expand=False, fill = False)
+ label_content.show()
+
+ sw = gtk.ScrolledWindow()
+ sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+
+ self._content_entry = gtk.TextView()
+ self._content_entry.set_wrap_mode(gtk.WRAP_WORD)
+
+ sw.add(self._content_entry)
+ sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
+
+ cvbox.pack_start(sw, expand = True, fill = True)
+ self._content_entry.show()
+ if annotation_content is not None:
+ buffer = self._content_entry.get_buffer()
+ buffer.set_text(annotation_content)
+
+ self.set_canvas(vbox)
+
+class AnnotationAddDialog(AnnotationDialog):
+ def __init__(self, parent_xid, dialog_title, annotation_id, annotation_title, annotation_content, page, sidebarinstance):
+ AnnotationDialog.__init__(self, parent_xid, dialog_title, annotation_id, annotation_title, annotation_content, page, sidebarinstance)
+
+ def accept_clicked_cb(self, widget):
+ title = self._title_entry.get_text()
+ details = self._content_entry.get_buffer().props.text
+ content = {'title' : unicode(title), 'body' : unicode(details)}
+ self._sidebarinstance._real_add_annotation(self._page, cjson.encode(content))
+ self.destroy()
+
+ def accept_clicked_delete_cb(self, widget):
+ pass
+
+class AnnotationEditDialog(AnnotationDialog):
+ def __init__(self, parent_xid, dialog_title, annotation_id, annotation_title, annotation_content, page, sidebarinstance):
+ AnnotationDialog.__init__(self, parent_xid, dialog_title, annotation_id, annotation_title, annotation_content, page, sidebarinstance)
+
+ def accept_clicked_cb(self, widget):
+ title = self._title_entry.get_text()
+ details = self._content_entry.get_buffer().props.text
+ content = {'title' : unicode(title), 'body' : unicode(details)}
+ self._sidebarinstance._real_edit_annotation(self._page, cjson.encode(content), self._annotation_id)
+ self.destroy()
+
+ def accept_clicked_delete_cb(self, widget):
+ self._sidebarinstance._real_delete_annotation(self._page, self._annotation_id)
+ self.destroy()
diff --git a/readsidebar.py b/readsidebar.py
new file mode 100644
index 0000000..40c8922
--- /dev/null
+++ b/readsidebar.py
@@ -0,0 +1,329 @@
+# Copyright 2009 One Laptop Per Child
+# Author: Sayamindu Dasgupta <sayamindu@laptop.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import logging
+import time
+
+import gtk
+
+from sugar.graphics.icon import Icon
+from sugar.graphics.xocolor import XoColor
+from sugar import profile
+from sugar.util import timestamp_to_elapsed_string
+
+from annobookmark import AnnoBookmark, Bookmark
+from readdb import BookmarkManager, AnnotationManager
+from readdialog import BookmarkAddDialog, BookmarkEditDialog, AnnotationAddDialog, AnnotationEditDialog
+
+from gettext import gettext as _
+
+_logger = logging.getLogger('anno-activity')
+
+#TODO: Add support for multiple bookmarks in a single page (required when sharing)
+
+class Sidebar(gtk.EventBox):
+ def __init__(self):
+ gtk.EventBox.__init__(self)
+ self.set_size_request(20, -1)
+ # Take care of the background first
+ white = gtk.gdk.color_parse("white")
+ self.modify_bg(gtk.STATE_NORMAL, white)
+
+ self._box = gtk.VButtonBox()
+ self._box.set_layout(gtk.BUTTONBOX_CENTER)
+ self.add(self._box)
+
+ self._box.show()
+ self.show()
+
+ self._bookmark_icon = None
+ self._annotation_icon = None
+ self._annotation_icons = []
+ self._annotation_event_ids = []
+ self._annotation_icon_query_tooltip_cb_ids = []
+ self._bookmark_manager = None
+ self._annotation_manager = None
+ self._is_showing_local_bookmark = False
+ self._is_showing_local_annotation = False
+
+ self.add_events(gtk.gdk.BUTTON_PRESS_MASK)
+
+
+
+
+ def _add_bookmark_icon(self, bookmark):
+ xocolor = XoColor(bookmark.color)
+ self._bookmark_icon = Icon(icon_name = 'emblem-favorite', \
+ pixel_size = 18, xo_color = xocolor)
+
+ self._bookmark_icon.props.has_tooltip = True
+ self.__bookmark_icon_query_tooltip_cb_id = \
+ self._bookmark_icon.connect('query_tooltip', self.__bookmark_icon_query_tooltip_cb, \
+ bookmark)
+
+ self.__event_cb_id = \
+ self.connect('event', self.__event_cb, bookmark)
+
+ self._box.pack_start(self._bookmark_icon ,expand=False,fill=False)
+ self._bookmark_icon.show_all()
+
+ if bookmark.is_local():
+ self._is_showing_local_bookmark = True
+
+ def __bookmark_icon_query_tooltip_cb(self, widget, x, y, keyboard_mode, tip, bookmark):
+ tooltip_header = bookmark.get_note_title()
+ tooltip_body = bookmark.get_note_body()
+ #TRANS: This goes like Bookmark added by User 5 days ago (the elapsed string gets translated
+ #TRANS: automatically)
+ tooltip_footer = (_('Bookmark added by %(user)s %(time)s') \
+ % {'user': bookmark.nick, 'time': timestamp_to_elapsed_string(bookmark.timestamp)})
+
+ vbox = gtk.VBox()
+
+ l = gtk.Label('<big>%s</big>' % tooltip_header)
+ l.set_use_markup(True)
+ l.set_width_chars(40)
+ l.set_line_wrap(True)
+ vbox.pack_start(l, expand = False, fill = False)
+ l.show()
+
+ l = gtk.Label('%s' % tooltip_body)
+ l.set_use_markup(True)
+ l.set_alignment(0, 0)
+ l.set_padding(2, 6)
+ l.set_width_chars(40)
+ l.set_line_wrap(True)
+ l.set_justify(gtk.JUSTIFY_FILL)
+ vbox.pack_start(l, expand = True, fill = True)
+ l.show()
+
+ l = gtk.Label('<small><i>%s</i></small>' % tooltip_footer)
+ l.set_use_markup(True)
+ l.set_width_chars(40)
+ l.set_line_wrap(True)
+ vbox.pack_start(l, expand = False, fill = False)
+ l.show()
+
+ tip.set_custom(vbox)
+
+ return True
+
+
+
+
+
+ def __event_cb(self, widget, event, annotation):
+ if event.type == gtk.gdk.BUTTON_PRESS and \
+ self._annotation_icons != []:
+
+ annotation_title = annotation.get_note_title()
+ annotation_content = annotation.get_note_body()
+ annotation_id = annotation.get_id()
+
+ dialog = AnnotationEditDialog(parent_xid = self.get_toplevel().window.xid, \
+ dialog_title = _("Edit notes for annotation: "), \
+ annotation_id = annotation_id, \
+ annotation_title = annotation_title, \
+ annotation_content = annotation_content, page = annotation.page, \
+ sidebarinstance = self)
+ dialog.show_all()
+
+ return False
+
+
+
+
+ def _clear_bookmarks(self):
+ if self._bookmark_icon is not None:
+ self._bookmark_icon.disconnect(self.__bookmark_icon_query_tooltip_cb_id)
+ self.disconnect(self.__event_cb_id)
+
+ self._bookmark_icon.hide() #XXX: Is this needed??
+ self._bookmark_icon.destroy()
+
+ self._bookmark_icon = None
+
+ self._is_showing_local_bookmark = False
+
+
+
+
+ def set_bookmarkmanager(self, filehash):
+ self._bookmark_manager = BookmarkManager(filehash)
+
+ def get_bookmarkmanager(self):
+ return (self._bookmark_manager)
+
+
+ def _clear_annotations(self):
+ if len(self._annotation_icons) > 0:
+ for i in range(len(self._annotation_icons)):
+ annotation_icon = self._annotation_icons[i]
+ annotation_icon.disconnect(self._annotation_icon_query_tooltip_cb_ids[i])
+ annotation_icon.hide()
+ annotation_icon.destroy()
+ _logger.debug('disconnecting icon: %d' % self._annotation_event_ids[i] )
+ self.disconnect(self._annotation_event_ids[i])
+ self._annotation_icons[i] = None
+
+ #self._annotation_icon = None
+ self._annotation_icons = []
+ self._annotation_icon_query_tooltip_cb_ids = []
+ self._annotation_event_ids = []
+ self._is_showing_local_annotation = False
+
+
+
+ def set_annotationmanager(self, filehash, mimetype):
+ self._annotation_manager = AnnotationManager(filehash, mimetype, self)
+
+
+ def get_annotationmanager(self):
+ return (self._annotation_manager)
+
+
+ def update_for_page(self, page):
+ self._clear_annotations()
+ annotations = self._annotation_manager.get_annotations_for_page(page)
+ for annotation in annotations:
+ self._add_annotation_icon(annotation)
+
+
+ def add_bookmark(self, page):
+ bookmark_title = (_("%s's bookmark") % profile.get_nick_name())
+ bookmark_content = (_("Bookmark for page %d") % page)
+ dialog = BookmarkAddDialog(parent_xid = self.get_toplevel().window.xid, \
+ dialog_title = _("Add notes for bookmark: "), \
+ bookmark_title = bookmark_title, \
+ bookmark_content = bookmark_content, page = page, \
+ sidebarinstance = self)
+ dialog.show_all()
+
+
+ def _real_add_bookmark(self, page, content):
+ self._bookmark_manager.add_bookmark(page, unicode(content))
+ self.update_for_page(page)
+
+
+ def del_bookmark(self, page):
+ self._bookmark_manager.del_bookmark(page)
+ self.update_for_page(page)
+
+
+ def is_showing_local_bookmark(self):
+ return self._is_showing_local_bookmark
+
+
+ def sync_annotations(self):
+ self._annotation_manager.sync_annotations()
+
+
+ def download_annotations(self):
+ self._annotation_manager.download_annotations()
+
+
+ def add_annotation(self, page):
+ annotation_title = (_("%s's annotation") % profile.get_nick_name())
+ annotation_content = (_("Annotation for page %d") % (page + 1))
+ dialog = AnnotationAddDialog(parent_xid = self.get_toplevel().window.xid, \
+ dialog_title = _("Add notes for annotation: "), \
+ annotation_id = 0, \
+ annotation_title = annotation_title, \
+ annotation_content = annotation_content, page = page, \
+ sidebarinstance = self)
+ dialog.show_all()
+
+ def _real_add_annotation(self, page, content):
+ self._annotation_manager.add_annotation(page, unicode(content))
+ self.update_for_page(page)
+
+
+
+ def _real_edit_annotation(self, page, content, annotation_id):
+ self._annotation_manager.edit_annotation(page, unicode(content), annotation_id)
+ self.update_for_page(page)
+
+
+ def _real_delete_annotation(self, page, annotation_id):
+ self.del_annotation(page, annotation_id)
+
+
+ def del_annotation(self, page, annotation_id):
+ self._annotation_manager.del_annotation(annotation_id)
+ self.update_for_page(page)
+
+
+
+ def _add_annotation_icon(self, annotation):
+ xocolor = XoColor(annotation.color)
+ annotation_icon = Icon(icon_name = 'emblem-favorite', \
+ pixel_size = 18, xo_color = xocolor)
+
+ annotation_icon.props.has_tooltip = True
+ self._annotation_icon_query_tooltip_cb_ids.append(annotation_icon.connect('query_tooltip', self.__annotation_icon_query_tooltip_cb, annotation))
+
+ self._annotation_event_ids.append(self.connect('event', self.__event_cb, annotation))
+
+ _logger.debug('connecting event %d' % self._annotation_event_ids[-1])
+ self._box.pack_start(annotation_icon ,expand=False,fill=False)
+ annotation_icon.show_all()
+ self._annotation_icons.append(annotation_icon)
+
+ if annotation.is_local():
+ self._is_showing_local_annotation = True
+
+
+
+ def __annotation_icon_query_tooltip_cb(self, widget, x, y, keyboard_mode, tip, annotation):
+ tooltip_header = annotation.get_note_title()
+ tooltip_body = annotation.get_note_body()
+ #TRANS: This goes like annotation added by User 5 days ago (the elapsed string gets translated
+ #TRANS: automatically)
+ #tooltip_footer = (_('annotation added by %(user)s %(time)s') \
+ # % {'user': annotation.creator, 'time': timestamp_to_elapsed_string(float(annotation.created))})
+
+ vbox = gtk.VBox()
+
+ l = gtk.Label('<big>%s</big>' % tooltip_header)
+ l.set_use_markup(True)
+ l.set_width_chars(40)
+ l.set_line_wrap(True)
+ vbox.pack_start(l, expand = False, fill = False)
+ l.show()
+
+ l = gtk.Label('%s' % tooltip_body)
+ l.set_use_markup(True)
+ l.set_alignment(0, 0)
+ l.set_padding(2, 6)
+ l.set_width_chars(40)
+ l.set_line_wrap(True)
+ l.set_justify(gtk.JUSTIFY_FILL)
+ vbox.pack_start(l, expand = True, fill = True)
+ l.show()
+
+ #l = gtk.Label('<small><i>%s</i></small>' % tooltip_footer)
+ #l.set_use_markup(True)
+ #l.set_width_chars(40)
+ #l.set_line_wrap(True)
+ #vbox.pack_start(l, expand = False, fill = False)
+ #l.show()
+
+ tip.set_custom(vbox)
+
+ return True
+
+
diff --git a/readtoolbar.py b/readtoolbar.py
new file mode 100644
index 0000000..53a756f
--- /dev/null
+++ b/readtoolbar.py
@@ -0,0 +1,320 @@
+# Copyright (C) 2006, Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+from gettext import gettext as _
+
+import gobject
+import gtk
+import evince
+
+try:
+ import epubadapter
+except:
+ pass
+
+from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.menuitem import MenuItem
+from sugar.graphics import iconentry
+from sugar.activity import activity
+
+class EditToolbar(activity.EditToolbar):
+ __gtype_name__ = 'EditToolbar'
+
+ def __init__(self):
+ activity.EditToolbar.__init__(self)
+
+ self._evince_view = None
+
+ self._document = None
+ self._find_job = None
+
+ search_item = gtk.ToolItem()
+
+ self._search_entry = iconentry.IconEntry()
+ self._search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY,
+ 'system-search')
+ self._search_entry.add_clear_button()
+ self._search_entry.connect('activate', self._search_entry_activate_cb)
+ self._search_entry.connect('changed', self._search_entry_changed_cb)
+ self._search_entry_changed = True
+
+ width = int(gtk.gdk.screen_width() / 3)
+ self._search_entry.set_size_request(width, -1)
+
+ search_item.add(self._search_entry)
+ self._search_entry.show()
+
+ self.insert(search_item, -1)
+ search_item.show()
+
+ self._prev = ToolButton('go-previous-paired')
+ self._prev.set_tooltip(_('Previous'))
+ self._prev.props.sensitive = False
+ self._prev.connect('clicked', self._find_prev_cb)
+ self.insert(self._prev, -1)
+ self._prev.show()
+
+ self._next = ToolButton('go-next-paired')
+ self._next.set_tooltip(_('Next'))
+ self._next.props.sensitive = False
+ self._next.connect('clicked', self._find_next_cb)
+ self.insert(self._next, -1)
+ self._next.show()
+
+ def set_view(self, view):
+ self._evince_view = view
+ self._evince_view.find_set_highlight_search(True)
+
+ def set_document(self, document):
+ self._document = document
+
+ def _clear_find_job(self):
+ if self._find_job is None:
+ return
+ if not self._find_job.is_finished():
+ self._find_job.cancel()
+ self._find_job.disconnect(self._find_updated_handler)
+ self._find_job = None
+
+ def _search_find_first(self):
+ self._clear_find_job()
+ text = self._search_entry.props.text
+ if text != "":
+ try:
+ self._find_job = evince.JobFind(document=self._document, start_page=0, n_pages=self._document.get_n_pages(), text=text, case_sensitive=False)
+ self._find_updated_handler = self._find_job.connect('updated', self._find_updated_cb)
+ evince.job_scheduler_push_job(self._find_job, evince.JOB_PRIORITY_NONE)
+ except TypeError:
+ self._find_job = epubadapter.JobFind(document=self._document, start_page=0, n_pages=self._document.get_n_pages(), text=text, case_sensitive=False)
+ self._find_updated_handler = self._find_job.connect('updated', self._find_updated_cb)
+ else:
+ # FIXME: highlight nothing
+ pass
+
+ self._search_entry_changed = False
+ self._update_find_buttons()
+
+ def _search_find_next(self):
+ self._evince_view.find_next()
+
+ def _search_find_last(self):
+ # FIXME: does Evince support find last?
+ return
+
+ def _search_find_prev(self):
+ self._evince_view.find_previous()
+
+ def _search_entry_activate_cb(self, entry):
+ if self._search_entry_changed:
+ self._search_find_first()
+ else:
+ self._search_find_next()
+
+ def _search_entry_changed_cb(self, entry):
+ self._search_entry_changed = True
+ self._update_find_buttons()
+
+# Automatically start search, maybe after timeout?
+# self._search_find_first()
+
+ def _find_changed_cb(self, page, spec):
+ self._update_find_buttons()
+
+ def _find_updated_cb(self, job, page = None):
+ self._evince_view.find_changed(job, page)
+
+ def _find_prev_cb(self, button):
+ if self._search_entry_changed:
+ self._search_find_last()
+ else:
+ self._search_find_prev()
+
+ def _find_next_cb(self, button):
+ if self._search_entry_changed:
+ self._search_find_first()
+ else:
+ self._search_find_next()
+
+ def _update_find_buttons(self):
+ if self._search_entry_changed:
+ if self._search_entry.props.text != "":
+ self._prev.props.sensitive = False
+# self._prev.set_tooltip(_('Find last'))
+ self._next.props.sensitive = True
+ self._next.set_tooltip(_('Find first'))
+ else:
+ self._prev.props.sensitive = False
+ self._next.props.sensitive = False
+ else:
+ self._prev.props.sensitive = True
+ self._prev.set_tooltip(_('Find previous'))
+ self._next.props.sensitive = True
+ self._next.set_tooltip(_('Find next'))
+
+
+class ViewToolbar(gtk.Toolbar):
+ __gtype_name__ = 'ViewToolbar'
+
+ __gsignals__ = {
+ 'needs-update-size': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([])),
+ 'go-fullscreen': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([]))
+ }
+
+ def __init__(self):
+ gtk.Toolbar.__init__(self)
+
+ self._evince_view = None
+ self._document = None
+
+ self._zoom_out = ToolButton('zoom-out')
+ self._zoom_out.set_tooltip(_('Zoom out'))
+ self._zoom_out.connect('clicked', self._zoom_out_cb)
+ self.insert(self._zoom_out, -1)
+ self._zoom_out.show()
+
+ self._zoom_in = ToolButton('zoom-in')
+ self._zoom_in.set_tooltip(_('Zoom in'))
+ self._zoom_in.connect('clicked', self._zoom_in_cb)
+ self.insert(self._zoom_in, -1)
+ self._zoom_in.show()
+
+ self._zoom_to_width = ToolButton('zoom-best-fit')
+ self._zoom_to_width.set_tooltip(_('Zoom to width'))
+ self._zoom_to_width.connect('clicked', self._zoom_to_width_cb)
+ self.insert(self._zoom_to_width, -1)
+ self._zoom_to_width.show()
+
+ palette = self._zoom_to_width.get_palette()
+ menu_item = MenuItem(_('Zoom to fit'))
+ menu_item.connect('activate', self._zoom_to_fit_menu_item_activate_cb)
+ palette.menu.append(menu_item)
+ menu_item.show()
+
+ menu_item = MenuItem(_('Actual size'))
+ menu_item.connect('activate', self._actual_size_menu_item_activate_cb)
+ palette.menu.append(menu_item)
+ menu_item.show()
+
+ tool_item = gtk.ToolItem()
+ self.insert(tool_item, -1)
+ tool_item.show()
+
+ self._zoom_spin = gtk.SpinButton()
+ self._zoom_spin.set_range(5.409, 400)
+ self._zoom_spin.set_increments(1, 10)
+ self._zoom_spin_notify_value_handler = self._zoom_spin.connect(
+ 'notify::value', self._zoom_spin_notify_value_cb)
+ tool_item.add(self._zoom_spin)
+ self._zoom_spin.show()
+
+ zoom_perc_label = gtk.Label(_("%"))
+ zoom_perc_label.show()
+ tool_item_zoom_perc_label = gtk.ToolItem()
+ tool_item_zoom_perc_label.add(zoom_perc_label)
+ self.insert(tool_item_zoom_perc_label, -1)
+ tool_item_zoom_perc_label.show()
+
+ spacer = gtk.SeparatorToolItem()
+ spacer.props.draw = False
+ self.insert(spacer, -1)
+ spacer.show()
+
+ self._fullscreen = ToolButton('view-fullscreen')
+ self._fullscreen.set_tooltip(_('Fullscreen'))
+ self._fullscreen.connect('clicked', self._fullscreen_cb)
+ self.insert(self._fullscreen, -1)
+ self._fullscreen.show()
+
+ self._view_notify_zoom_handler = None
+
+ def set_view(self, view):
+ self._evince_view = view
+ self._zoom_spin.props.value = self._evince_view.props.zoom * 100
+ self._view_notify_zoom_handler = self._evince_view.connect(
+ 'notify::zoom', self._view_notify_zoom_cb)
+
+ self._update_zoom_buttons()
+
+
+ def _zoom_spin_notify_value_cb(self, zoom_spin, pspec):
+ if not self._view_notify_zoom_handler:
+ return
+ self._evince_view.disconnect(self._view_notify_zoom_handler)
+ try:
+ if hasattr(self._evince_view.props, 'sizing_mode'):
+ self._evince_view.props.sizing_mode = evince.SIZING_FREE
+ self._evince_view.props.zoom = zoom_spin.props.value / 100.0
+ finally:
+ self._view_notify_zoom_handler = self._evince_view.connect(
+ 'notify::zoom', self._view_notify_zoom_cb)
+
+ def _view_notify_zoom_cb(self, evince_view, pspec):
+ self._zoom_spin.disconnect(self._zoom_spin_notify_value_handler)
+ try:
+ self._zoom_spin.props.value = round(evince_view.props.zoom * 100.0)
+ finally:
+ self._zoom_spin_notify_value_handler = self._zoom_spin.connect(
+ 'notify::value', self._zoom_spin_notify_value_cb)
+
+ def zoom_in(self):
+ if hasattr(self._evince_view.props, 'sizing_mode'):
+ self._evince_view.props.sizing_mode = evince.SIZING_FREE
+ self._evince_view.zoom_in()
+ self._update_zoom_buttons()
+
+ def _zoom_in_cb(self, button):
+ self.zoom_in()
+
+ def zoom_out(self):
+ if hasattr(self._evince_view.props, 'sizing_mode'):
+ self._evince_view.props.sizing_mode = evince.SIZING_FREE
+ self._evince_view.zoom_out()
+ self._update_zoom_buttons()
+
+ def _zoom_out_cb(self, button):
+ self.zoom_out()
+
+ def zoom_to_width(self):
+ if hasattr(self._evince_view.props, 'sizing_mode'):
+ self._evince_view.props.sizing_mode = evince.SIZING_FIT_WIDTH
+ self.emit('needs-update-size')
+ self._update_zoom_buttons()
+
+ def _zoom_to_width_cb(self, button):
+ self.zoom_to_width()
+
+ def _update_zoom_buttons(self):
+ self._zoom_in.props.sensitive = self._evince_view.can_zoom_in()
+ self._zoom_out.props.sensitive = self._evince_view.can_zoom_out()
+
+ def _zoom_to_fit_menu_item_activate_cb(self, menu_item):
+ if hasattr(self._evince_view.props, 'sizing_mode'): #XXX
+ self._evince_view.props.sizing_mode = evince.SIZING_BEST_FIT
+ self.emit('needs-update-size')
+ self._update_zoom_buttons()
+
+ def _actual_size_menu_item_activate_cb(self, menu_item):
+ if hasattr(self._evince_view.props, 'sizing_mode'):
+ self._evince_view.props.sizing_mode = evince.SIZING_FREE
+ self._evince_view.props.zoom = 1.0
+ self._update_zoom_buttons()
+
+ def _fullscreen_cb(self, button):
+ self.emit('go-fullscreen')
diff --git a/readtopbar.py b/readtopbar.py
new file mode 100644
index 0000000..3f338f5
--- /dev/null
+++ b/readtopbar.py
@@ -0,0 +1,204 @@
+# Copyright (C) 2006-2007, Red Hat, Inc.
+# Copyright (C) 2009 One Laptop Per Child
+# Author: Sayamindu Dasgupta <sayamindu@laptop.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import gtk, gobject
+import dbus
+
+from sugar.graphics import style
+from sugar.graphics.icon import Icon, get_icon_state
+
+from gettext import gettext as _
+
+_LEVEL_PROP = 'battery.charge_level.percentage'
+_CHARGING_PROP = 'battery.rechargeable.is_charging'
+_DISCHARGING_PROP = 'battery.rechargeable.is_discharging'
+_PRESENT_PROP = 'battery.present'
+
+_ICON_NAME = 'battery'
+
+# Taken from sugar/extensions/deviceicon/battery.py
+class BattMan(gobject.GObject):
+ __gproperties__ = {
+ 'level' : (int, None, None, 0, 100, 0,
+ gobject.PARAM_READABLE),
+ 'charging' : (bool, None, None, False,
+ gobject.PARAM_READABLE),
+ 'discharging' : (bool, None, None, False,
+ gobject.PARAM_READABLE),
+ 'present' : (bool, None, None, False,
+ gobject.PARAM_READABLE)
+ }
+
+ def __init__(self, udi):
+ gobject.GObject.__init__(self)
+
+ bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
+ proxy = bus.get_object('org.freedesktop.Hal', udi,
+ follow_name_owner_changes=True)
+ self._battery = dbus.Interface(proxy, 'org.freedesktop.Hal.Device')
+ bus.add_signal_receiver(self._battery_changed,
+ 'PropertyModified',
+ 'org.freedesktop.Hal.Device',
+ 'org.freedesktop.Hal',
+ udi)
+
+ self._level = self._get_level()
+ self._charging = self._get_charging()
+ self._discharging = self._get_discharging()
+ self._present = self._get_present()
+
+ def _get_level(self):
+ try:
+ return self._battery.GetProperty(_LEVEL_PROP)
+ except dbus.DBusException:
+ logging.error('Cannot access %s' % _LEVEL_PROP)
+ return 0
+
+ def _get_charging(self):
+ try:
+ return self._battery.GetProperty(_CHARGING_PROP)
+ except dbus.DBusException:
+ logging.error('Cannot access %s' % _CHARGING_PROP)
+ return False
+
+ def _get_discharging(self):
+ try:
+ return self._battery.GetProperty(_DISCHARGING_PROP)
+ except dbus.DBusException:
+ logging.error('Cannot access %s' % _DISCHARGING_PROP)
+ return False
+
+ def _get_present(self):
+ try:
+ return self._battery.GetProperty(_PRESENT_PROP)
+ except dbus.DBusException:
+ logging.error('Cannot access %s' % _PRESENT_PROP)
+ return False
+
+ def do_get_property(self, pspec):
+ if pspec.name == 'level':
+ return self._level
+ if pspec.name == 'charging':
+ return self._charging
+ if pspec.name == 'discharging':
+ return self._discharging
+ if pspec.name == 'present':
+ return self._present
+
+ def get_type(self):
+ return 'battery'
+
+ def _battery_changed(self, num_changes, changes_list):
+ for change in changes_list:
+ if change[0] == _LEVEL_PROP:
+ self._level = self._get_level()
+ self.notify('level')
+ elif change[0] == _CHARGING_PROP:
+ self._charging = self._get_charging()
+ self.notify('charging')
+ elif change[0] == _DISCHARGING_PROP:
+ self._discharging = self._get_discharging()
+ self.notify('discharging')
+ elif change[0] == _PRESENT_PROP:
+ self._present = self._get_present()
+ self.notify('present')
+
+
+class _TopBar(gtk.HBox):
+ __gproperties__ = {
+ 'completion-level' : (float, None, None, 0.0, 100.0, 0.0,
+ gobject.PARAM_READWRITE),
+ }
+
+ def __init__(self):
+ gtk.HBox.__init__(self)
+
+ self.set_border_width(int(style.DEFAULT_SPACING/2.0))
+ self.set_spacing(style.DEFAULT_SPACING * 4)
+
+ self._completion_level = 0
+ self._progressbar = None
+
+ bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
+ proxy = bus.get_object('org.freedesktop.Hal',
+ '/org/freedesktop/Hal/Manager')
+ hal_manager = dbus.Interface(proxy, 'org.freedesktop.Hal.Manager')
+ udis = hal_manager.FindDeviceByCapability('battery')
+ if len(udis) > 0:
+ self._battery = BattMan(udis[0]) # TODO: Support more than one battery
+ self._battery.connect('notify::level', \
+ self._battery_level_changed_cb)
+ else:
+ self._battery = None
+
+ self._icon = None
+
+ self._setup()
+
+ def do_get_property(self, property):
+ if property.name == 'completion-level':
+ return self._completion_level
+ else:
+ raise AttributeError, 'unknown property %s' % property.name
+
+ def do_set_property(self, property, value):
+ if property.name == 'completion-level':
+ self.set_completion_level(value)
+ else:
+ raise AttributeError, 'unknown property %s' % property.name
+
+ def set_completion_level(self, value):
+ self._completion_level = value
+ self._progressbar.set_fraction(self._completion_level/100.0)
+
+ def _setup(self):
+ self._progressbar = gtk.ProgressBar()
+ self._progressbar.props.discrete_blocks = 10
+ self._progressbar.set_fraction(self._completion_level/100.0)
+ self.pack_start(self._progressbar, expand = True, fill = True)
+ if self._battery is not None:
+ icon_name = get_icon_state(_ICON_NAME, self._battery.props.level, step=-5)
+ self._icon = Icon(icon_name=icon_name)
+ self.pack_start(self._icon, expand = False, fill = False)
+
+ def _battery_level_changed_cb(self, pspec, param):
+ icon_name = get_icon_state(_ICON_NAME, self._battery.props.level, step=-5)
+ self._icon.props.icon_name = icon_name
+
+class TopBar(_TopBar):
+ def __init__(self):
+ _TopBar.__init__(self)
+ self._document = None
+
+ def set_document(self, document):
+ self._document = document
+
+ page_cache = self._document.get_page_cache()
+ page_cache.connect('page-changed', self._page_changed_cb)
+
+ def _page_changed_cb(self, page, proxy = None):
+ current_page = self._document.get_page_cache().get_current_page()
+ n_pages = self._document.get_n_pages()
+
+ self.set_completion_level(current_page * 100/n_pages)
+
+ #TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+ self._progressbar.set_text(_("Page %i of %i") % (current_page, n_pages))
+
+
+
diff --git a/setup.py b/setup.py
new file mode 100755
index 0000000..d3ab3a3
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+
+# Copyright (C) 2006, Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+from sugar.activity import bundlebuilder
+
+bundlebuilder.start()