Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Ortiz <rafael@activitycentral.com>2013-03-07 05:38:50 (GMT)
committer Rafael Ortiz <rafael@activitycentral.com>2013-03-07 05:38:50 (GMT)
commitcc02fea1202a9dea2b5c57d4c501889447fa1b59 (patch)
tree5be075bccc887c04b2434c63b6bf23ede2fe98ee
Initial commit
-rw-r--r--GetIABooksActivity.py1256
-rw-r--r--GetIABooksActivity.pycbin0 -> 43827 bytes
-rw-r--r--NEWS3
-rw-r--r--activity/activity.info8
-rw-r--r--activity/get-ia-books.svg312
-rw-r--r--application-ogg.pngbin0 -> 15404 bytes
-rw-r--r--devicemanager.py75
-rw-r--r--devicemanager.pycbin0 -> 2280 bytes
-rw-r--r--extListview.py705
-rw-r--r--extListview.pycbin0 -> 22725 bytes
-rw-r--r--feedparser.py3909
-rw-r--r--feedparser.pycbin0 -> 137813 bytes
-rw-r--r--generic_cover.pngbin0 -> 29180 bytes
-rw-r--r--get-books.cfg34
-rw-r--r--icons/books.svg47
-rw-r--r--icons/catalogs.svg93
-rw-r--r--icons/internet-icon.svg15
-rw-r--r--languagenames.py53
-rw-r--r--languagenames.pycbin0 -> 1503 bytes
-rw-r--r--listview.py95
-rw-r--r--listview.pycbin0 -> 3218 bytes
-rw-r--r--locale/af/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/af/activity.linfo2
-rw-r--r--locale/ak/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ak/activity.linfo2
-rw-r--r--locale/am/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/am/activity.linfo2
-rw-r--r--locale/ar/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ar/activity.linfo2
-rw-r--r--locale/ar_SY/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ar_SY/activity.linfo2
-rw-r--r--locale/ay/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ay/activity.linfo2
-rw-r--r--locale/bg/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/bg/activity.linfo2
-rw-r--r--locale/bi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/bi/activity.linfo2
-rw-r--r--locale/bn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/bn/activity.linfo2
-rw-r--r--locale/bn_IN/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/bn_IN/activity.linfo2
-rw-r--r--locale/bs/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/bs/activity.linfo2
-rw-r--r--locale/ca/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ca/activity.linfo2
-rw-r--r--locale/cpp/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/cpp/activity.linfo2
-rw-r--r--locale/cs/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/cs/activity.linfo2
-rw-r--r--locale/da/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/da/activity.linfo2
-rw-r--r--locale/de/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 1866 bytes
-rw-r--r--locale/de/activity.linfo2
-rw-r--r--locale/dz/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/dz/activity.linfo2
-rw-r--r--locale/el/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 2432 bytes
-rw-r--r--locale/el/activity.linfo2
-rw-r--r--locale/en/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 2038 bytes
-rw-r--r--locale/en/activity.linfo2
-rw-r--r--locale/en_GB/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 2041 bytes
-rw-r--r--locale/en_GB/activity.linfo2
-rw-r--r--locale/en_US/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 2041 bytes
-rw-r--r--locale/en_US/activity.linfo2
-rw-r--r--locale/es/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 2504 bytes
-rw-r--r--locale/es/activity.linfo2
-rw-r--r--locale/fa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/fa/activity.linfo2
-rw-r--r--locale/fa_AF/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/fa_AF/activity.linfo2
-rw-r--r--locale/ff/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ff/activity.linfo2
-rw-r--r--locale/fi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/fi/activity.linfo2
-rw-r--r--locale/fil/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/fil/activity.linfo2
-rw-r--r--locale/fr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 1889 bytes
-rw-r--r--locale/fr/activity.linfo2
-rw-r--r--locale/gu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/gu/activity.linfo2
-rw-r--r--locale/ha/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ha/activity.linfo2
-rw-r--r--locale/he/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/he/activity.linfo2
-rw-r--r--locale/hi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/hi/activity.linfo2
-rw-r--r--locale/ht/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ht/activity.linfo2
-rw-r--r--locale/hu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 446 bytes
-rw-r--r--locale/hu/activity.linfo2
-rw-r--r--locale/hy/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 2527 bytes
-rw-r--r--locale/hy/activity.linfo2
-rw-r--r--locale/id/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/id/activity.linfo2
-rw-r--r--locale/ig/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ig/activity.linfo2
-rw-r--r--locale/is/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/is/activity.linfo2
-rw-r--r--locale/it/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 1852 bytes
-rw-r--r--locale/it/activity.linfo2
-rw-r--r--locale/ja/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ja/activity.linfo2
-rw-r--r--locale/km/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/km/activity.linfo2
-rw-r--r--locale/kn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/kn/activity.linfo2
-rw-r--r--locale/ko/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ko/activity.linfo2
-rw-r--r--locale/kos/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/kos/activity.linfo2
-rw-r--r--locale/ku/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ku/activity.linfo2
-rw-r--r--locale/lt/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/lt/activity.linfo2
-rw-r--r--locale/lv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/lv/activity.linfo2
-rw-r--r--locale/mg/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/mg/activity.linfo2
-rw-r--r--locale/mk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/mk/activity.linfo2
-rw-r--r--locale/ml/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ml/activity.linfo2
-rw-r--r--locale/mn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/mn/activity.linfo2
-rw-r--r--locale/mr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/mr/activity.linfo2
-rw-r--r--locale/ms/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ms/activity.linfo2
-rw-r--r--locale/mvo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/mvo/activity.linfo2
-rw-r--r--locale/na/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/na/activity.linfo2
-rw-r--r--locale/nah/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/nah/activity.linfo2
-rw-r--r--locale/nb/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/nb/activity.linfo2
-rw-r--r--locale/ne/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 503 bytes
-rw-r--r--locale/ne/activity.linfo2
-rw-r--r--locale/nl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 1807 bytes
-rw-r--r--locale/nl/activity.linfo2
-rw-r--r--locale/nn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/nn/activity.linfo2
-rw-r--r--locale/pa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/pa/activity.linfo2
-rw-r--r--locale/pap/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/pap/activity.linfo2
-rw-r--r--locale/pis/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/pis/activity.linfo2
-rw-r--r--locale/pl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/pl/activity.linfo2
-rw-r--r--locale/ps/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 499 bytes
-rw-r--r--locale/ps/activity.linfo2
-rw-r--r--locale/pt/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/pt/activity.linfo2
-rw-r--r--locale/pt_BR/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 1725 bytes
-rw-r--r--locale/pt_BR/activity.linfo2
-rw-r--r--locale/qu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/qu/activity.linfo2
-rw-r--r--locale/ro/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ro/activity.linfo2
-rw-r--r--locale/ru/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ru/activity.linfo2
-rw-r--r--locale/rw/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/rw/activity.linfo2
-rw-r--r--locale/sd/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/sd/activity.linfo2
-rw-r--r--locale/si/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/si/activity.linfo2
-rw-r--r--locale/sk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/sk/activity.linfo2
-rw-r--r--locale/sl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/sl/activity.linfo2
-rw-r--r--locale/sm/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 454 bytes
-rw-r--r--locale/sm/activity.linfo2
-rw-r--r--locale/sq/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 1864 bytes
-rw-r--r--locale/sq/activity.linfo2
-rw-r--r--locale/sr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/sr/activity.linfo2
-rw-r--r--locale/st/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/st/activity.linfo2
-rw-r--r--locale/sv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/sv/activity.linfo2
-rw-r--r--locale/sw/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/sw/activity.linfo2
-rw-r--r--locale/ta/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 2826 bytes
-rw-r--r--locale/ta/activity.linfo2
-rw-r--r--locale/te/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/te/activity.linfo2
-rw-r--r--locale/templates/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/templates/activity.linfo2
-rw-r--r--locale/th/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/th/activity.linfo2
-rw-r--r--locale/ton/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ton/activity.linfo2
-rw-r--r--locale/tpi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/tpi/activity.linfo2
-rw-r--r--locale/tr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/tr/activity.linfo2
-rw-r--r--locale/tvl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/tvl/activity.linfo2
-rw-r--r--locale/tyv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/tyv/activity.linfo2
-rw-r--r--locale/tzm/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/tzm/activity.linfo2
-rw-r--r--locale/tzo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/tzo/activity.linfo2
-rw-r--r--locale/ug/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ug/activity.linfo2
-rw-r--r--locale/uk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/uk/activity.linfo2
-rw-r--r--locale/ur/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/ur/activity.linfo2
-rw-r--r--locale/vi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 1937 bytes
-rw-r--r--locale/vi/activity.linfo2
-rw-r--r--locale/wa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/wa/activity.linfo2
-rw-r--r--locale/yo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/yo/activity.linfo2
-rw-r--r--locale/zh_CN/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/zh_CN/activity.linfo2
-rw-r--r--locale/zh_HK/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 404 bytes
-rw-r--r--locale/zh_HK/activity.linfo2
-rw-r--r--locale/zh_TW/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mobin0 -> 2008 bytes
-rw-r--r--locale/zh_TW/activity.linfo2
-rw-r--r--musica.svg7
-rw-r--r--opds.py602
-rw-r--r--opds.pycbin0 -> 23161 bytes
-rw-r--r--po/GetBooks.pot146
-rw-r--r--po/af.po112
-rw-r--r--po/ak.po110
-rw-r--r--po/am.po112
-rw-r--r--po/ar.po112
-rw-r--r--po/ar_SY.po142
-rw-r--r--po/ay.po112
-rw-r--r--po/bg.po112
-rw-r--r--po/bi.po112
-rw-r--r--po/bn.po112
-rw-r--r--po/bn_IN.po112
-rw-r--r--po/bs.po110
-rw-r--r--po/ca.po112
-rw-r--r--po/cpp.po112
-rw-r--r--po/cs.po112
-rw-r--r--po/da.po110
-rw-r--r--po/de.po112
-rw-r--r--po/dz.po112
-rw-r--r--po/el.po117
-rw-r--r--po/en.po189
-rw-r--r--po/en_GB.po174
-rw-r--r--po/en_US.po177
-rw-r--r--po/es.po298
-rw-r--r--po/fa.po112
-rw-r--r--po/fa_AF.po112
-rw-r--r--po/ff.po112
-rw-r--r--po/fi.po110
-rw-r--r--po/fil.po112
-rw-r--r--po/fr.po133
-rw-r--r--po/gu.po112
-rw-r--r--po/ha.po112
-rw-r--r--po/he.po112
-rw-r--r--po/hi.po112
-rw-r--r--po/ht.po112
-rw-r--r--po/hu.po112
-rw-r--r--po/hy.po174
-rw-r--r--po/id.po138
-rw-r--r--po/ig.po112
-rw-r--r--po/is.po112
-rw-r--r--po/it.po133
-rw-r--r--po/ja.po112
-rw-r--r--po/km.po112
-rw-r--r--po/kn.po110
-rw-r--r--po/ko.po112
-rw-r--r--po/kos.po112
-rw-r--r--po/ku.po139
-rw-r--r--po/lt.po110
-rw-r--r--po/lv.po110
-rw-r--r--po/messages.mobin0 -> 2500 bytes
-rw-r--r--po/mg.po112
-rw-r--r--po/mk.po112
-rw-r--r--po/ml.po112
-rw-r--r--po/mn.po112
-rw-r--r--po/mr.po112
-rw-r--r--po/ms.po112
-rw-r--r--po/mvo.po112
-rw-r--r--po/na.po112
-rw-r--r--po/nah.po139
-rw-r--r--po/nb.po112
-rw-r--r--po/ne.po113
-rw-r--r--po/nl.po136
-rw-r--r--po/nn.po110
-rw-r--r--po/pa.po112
-rw-r--r--po/pap.po112
-rw-r--r--po/pis.po112
-rw-r--r--po/pl.po112
-rw-r--r--po/ps.po113
-rw-r--r--po/pt.po112
-rw-r--r--po/pt_BR.po115
-rw-r--r--po/qu.po112
-rw-r--r--po/ro.po112
-rw-r--r--po/ru.po112
-rw-r--r--po/rw.po112
-rw-r--r--po/sd.po112
-rw-r--r--po/si.po112
-rw-r--r--po/sk.po112
-rw-r--r--po/sl.po112
-rw-r--r--po/sm.po123
-rw-r--r--po/sq.po148
-rw-r--r--po/sr.po130
-rw-r--r--po/st.po110
-rw-r--r--po/sv.po112
-rw-r--r--po/sw.po112
-rw-r--r--po/ta.po133
-rw-r--r--po/te.po112
-rw-r--r--po/templates.po126
-rw-r--r--po/th.po112
-rw-r--r--po/ton.po130
-rw-r--r--po/tpi.po112
-rw-r--r--po/tr.po112
-rw-r--r--po/tvl.po112
-rw-r--r--po/tyv.po110
-rw-r--r--po/tzm.po139
-rw-r--r--po/tzo.po112
-rw-r--r--po/ug.po112
-rw-r--r--po/uk.po126
-rw-r--r--po/ur.po112
-rw-r--r--po/vi.po119
-rw-r--r--po/wa.po112
-rw-r--r--po/yo.po112
-rw-r--r--po/zh_CN.po112
-rw-r--r--po/zh_HK.po118
-rw-r--r--po/zh_TW.po180
-rw-r--r--setup.py21
330 files changed, 19753 insertions, 0 deletions
diff --git a/GetIABooksActivity.py b/GetIABooksActivity.py
new file mode 100644
index 0000000..a1488d0
--- /dev/null
+++ b/GetIABooksActivity.py
@@ -0,0 +1,1256 @@
+#! /usr/bin/env python
+
+# Copyright (C) 2009 James D. Simmons
+# Copyright (C) 2009 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 os
+import logging
+import time
+
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import GObject
+from gi.repository import Pango
+
+from sugar3.graphics.toolbarbox import ToolbarBox
+from sugar3.activity.widgets import StopButton
+from sugar3.graphics import style
+from sugar3.graphics.toolbutton import ToolButton
+from sugar3.graphics.toggletoolbutton import ToggleToolButton
+from sugar3.graphics.toolcombobox import ToolComboBox
+from sugar3.graphics.combobox import ComboBox
+from sugar3.graphics import iconentry
+from sugar3 import profile
+from sugar3.activity import activity
+from sugar3.activity.widgets import ToolbarButton
+from sugar3.bundle.activitybundle import ActivityBundle
+from sugar3.datastore import datastore
+from sugar3.graphics.alert import NotifyAlert
+from sugar3.graphics.alert import Alert
+from sugar3.graphics.icon import Icon
+from gettext import gettext as _
+
+import dbus
+import ConfigParser
+import base64
+import urllib2
+import socket
+
+
+from listview import ListView
+import opds
+import languagenames
+import devicemanager
+
+_MIMETYPES = {'PDF': u'application/pdf', 'PDF BW': u'application/pdf-bw',
+ 'EPUB': u'application/epub+zip', 'DJVU': u'image/x.djvu', 'MP3': u'audio/mpeg', 'OGG': u'audio/ogg'}
+_SOURCES = {}
+_SOURCES_CONFIG = {}
+
+READ_STREAM_SERVICE = 'read-activity-http'
+
+# directory exists if powerd is running. create a file here,
+# named after our pid, to inhibit suspend.
+POWERD_INHIBIT_DIR = '/var/run/powerd-inhibit-suspend'
+
+
+class GetIABooksActivity(activity.Activity):
+
+ def __init__(self, handle):
+ "The entry point to the Activity"
+ activity.Activity.__init__(self, handle, False)
+ self.max_participants = 1
+
+ self.selected_book = None
+ self.queryresults = None
+ self._getter = None
+ self.show_images = True
+ self.languages = {}
+ self._lang_code_handler = languagenames.LanguageNames()
+ self.catalogs_configuration = {}
+ self.catalog_history = []
+
+ if os.path.exists('/etc/get-books.cfg'):
+ self._read_configuration('/etc/get-books.cfg')
+ else:
+ self._read_configuration()
+
+ toolbar_box = ToolbarBox()
+ activity_button = ToolButton()
+ color = profile.get_color()
+ bundle = ActivityBundle(activity.get_bundle_path())
+ icon = Icon(file=bundle.get_icon(), xo_color=color)
+ activity_button.set_icon_widget(icon)
+ activity_button.show()
+
+ toolbar_box.toolbar.insert(activity_button, 0)
+ self._add_search_controls(toolbar_box.toolbar)
+
+ separator = Gtk.SeparatorToolItem()
+ separator.props.draw = False
+ separator.set_expand(True)
+ toolbar_box.toolbar.insert(separator, -1)
+
+ toolbar_box.toolbar.insert(StopButton(self), -1)
+
+ self.set_toolbar_box(toolbar_box)
+ toolbar_box.show_all()
+ self._books_toolbar = toolbar_box.toolbar
+
+ self._create_controls()
+
+ if not self.powerd_running():
+ try:
+ bus = dbus.SystemBus()
+ proxy = bus.get_object('org.freedesktop.ohm',
+ '/org/freedesktop/ohm/Keystore')
+ self.ohm_keystore = dbus.Interface(proxy,
+ 'org.freedesktop.ohm.Keystore')
+ except dbus.DBusException, e:
+ logging.warning("Error setting OHM inhibit: %s", e)
+ self.ohm_keystore = None
+
+ def powerd_running(self):
+ self.using_powerd = os.access(POWERD_INHIBIT_DIR, os.W_OK)
+ logging.error("using_powerd: %d", self.using_powerd)
+ return self.using_powerd
+
+ def _inhibit_suspend(self):
+ if self.using_powerd:
+ fd = open(POWERD_INHIBIT_DIR + "/%u" % os.getpid(), 'w')
+ logging.error("inhibit_suspend file is %s", (POWERD_INHIBIT_DIR \
+ + "/%u" % os.getpid()))
+ fd.close()
+ return True
+
+ if self.ohm_keystore is not None:
+ try:
+ self.ohm_keystore.SetKey('suspend.inhibit', 1)
+ return self.ohm_keystore.GetKey('suspend.inhibit')
+ except dbus.exceptions.DBusException:
+ logging.debug("failed to inhibit suspend")
+ return False
+ else:
+ return False
+
+ def _allow_suspend(self):
+ if self.using_powerd:
+ if os.path.exists(POWERD_INHIBIT_DIR + "/%u" % os.getpid()):
+ os.unlink(POWERD_INHIBIT_DIR + "/%u" % os.getpid())
+ logging.error("allow_suspend unlinking %s", (POWERD_INHIBIT_DIR \
+ + "/%u" % os.getpid()))
+ return True
+
+ if self.ohm_keystore is not None:
+ try:
+ self.ohm_keystore.SetKey('suspend.inhibit', 0)
+ return self.ohm_keystore.GetKey('suspend.inhibit')
+ except dbus.exceptions.DBusException:
+ logging.error("failed to allow suspend")
+ return False
+ else:
+ return False
+
+ def _read_configuration(self, file_name='get-books.cfg'):
+ logging.error('Reading configuration from file %s', file_name)
+ config = ConfigParser.ConfigParser()
+ config.readfp(open(file_name))
+ if config.has_option('GetBooks', 'show_images'):
+ self.show_images = config.getboolean('GetBooks', 'show_images')
+ self.languages = {}
+ if config.has_option('GetBooks', 'languages'):
+ languages_param = config.get('GetBooks', 'languages')
+ for language in languages_param.split(','):
+ lang_code = language.strip()
+ if len(lang_code) > 0:
+ self.languages[lang_code] = \
+ self._lang_code_handler.get_full_language_name(lang_code)
+
+ for section in config.sections():
+ if section != 'GetBooks' and not section.startswith('Catalogs'):
+ name = config.get(section, 'name')
+ _SOURCES[section] = name
+ repo_config = {}
+ repo_config['query_uri'] = config.get(section, 'query_uri')
+ repo_config['opds_cover'] = config.get(section, 'opds_cover')
+ if config.has_option(section, 'summary_field'):
+ repo_config['summary_field'] = \
+ config.get(section, 'summary_field')
+ else:
+ repo_config['summary_field'] = None
+ if config.has_option(section, 'blacklist'):
+ blacklist = config.get(section, 'blacklist')
+ repo_config['blacklist'] = blacklist.split(',')
+ # TODO strip?
+ else:
+ repo_config['blacklist'] = []
+
+ _SOURCES_CONFIG[section] = repo_config
+
+ logging.error('_SOURCES %s', _SOURCES)
+ logging.error('_SOURCES_CONFIG %s', _SOURCES_CONFIG)
+
+ for section in config.sections():
+ if section.startswith('Catalogs'):
+ catalog_source = section.split('_')[1]
+ if not catalog_source in _SOURCES_CONFIG:
+ logging.error('There are not a source for the catalog ' +
+ 'section %s', section)
+ break
+ source_config = _SOURCES_CONFIG[catalog_source]
+ opds_cover = source_config['opds_cover']
+ for catalog in config.options(section):
+ catalog_config = {}
+ catalog_config['query_uri'] = config.get(section, catalog)
+ catalog_config['opds_cover'] = opds_cover
+ catalog_config['source'] = catalog_source
+ catalog_config['name'] = catalog
+ catalog_config['summary_field'] = \
+ source_config['summary_field']
+ self.catalogs_configuration[catalog] = catalog_config
+
+ self.source = _SOURCES_CONFIG.keys()[0]
+
+ self.filter_catalogs_by_source()
+
+ logging.error('languages %s', self.languages)
+ logging.error('catalogs %s', self.catalogs)
+
+ def _add_search_controls(self, toolbar):
+ book_search_item = Gtk.ToolItem()
+ toolbar.search_entry = iconentry.IconEntry()
+ toolbar.search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY,
+ 'system-search')
+ toolbar.search_entry.add_clear_button()
+ toolbar.search_entry.connect('activate',
+ self.__search_entry_activate_cb)
+ width = int(Gdk.Screen.width() / 4)
+ toolbar.search_entry.set_size_request(width, -1)
+ book_search_item.add(toolbar.search_entry)
+ toolbar.search_entry.show()
+ toolbar.insert(book_search_item, -1)
+ book_search_item.show()
+
+ toolbar.source_combo = ComboBox()
+ toolbar.source_combo.props.sensitive = True
+ toolbar.source_changed_cb_id = \
+ toolbar.source_combo.connect('changed', self.__source_changed_cb)
+ combotool = ToolComboBox(toolbar.source_combo)
+ combotool.set_size_request(width, -1)
+ toolbar.insert(combotool, -1)
+ combotool.show()
+
+ self.bt_catalogs = ToggleToolButton('books')
+ self.bt_catalogs.set_tooltip(_('Catalogs'))
+ toolbar.insert(self.bt_catalogs, -1)
+ self.bt_catalogs.connect('toggled', self.__toggle_cats_cb)
+ if len(self.catalogs) > 0:
+ self.bt_catalogs.show()
+
+ if len(self.languages) > 0:
+ toolbar.config_toolbarbutton = ToolbarButton()
+ toolbar.config_toolbarbutton.props.icon_name = 'preferences-system'
+ toolbar.config_toolbarbox = Gtk.Toolbar()
+ toolbar.config_toolbarbutton.props.page = toolbar.config_toolbarbox
+ toolbar.language_combo = ComboBox()
+ toolbar.language_combo.props.sensitive = True
+ combotool = ToolComboBox(toolbar.language_combo)
+ toolbar.language_combo.append_item('all', _('Any language'))
+ for key in self.languages.keys():
+ toolbar.language_combo.append_item(key, self.languages[key])
+ toolbar.language_combo.set_active(0)
+ toolbar.config_toolbarbutton.props.page.insert(combotool, -1)
+ toolbar.insert(toolbar.config_toolbarbutton, -1)
+ toolbar.config_toolbarbutton.show()
+ combotool.show()
+ toolbar.language_changed_cb_id = \
+ toolbar.language_combo.connect('changed',
+ self.__language_changed_cb)
+
+ self.bt_catalogs = ToggleToolButton('books')
+ self.bt_catalogs.set_tooltip(_('Catalogs'))
+ toolbar.insert(self.bt_catalogs, -1)
+ self.bt_catalogs.connect('toggled', self.__toggle_cats_cb)
+ if len(self.catalogs) > 0:
+ self.bt_catalogs.show()
+
+ self._device_manager = devicemanager.DeviceManager()
+ self._refresh_sources(toolbar)
+ self._device_manager.connect('device-changed',
+ self.__device_changed_cb)
+
+ toolbar.search_entry.grab_focus()
+ return toolbar
+
+ def __bt_catalogs_clicked_cb(self, button):
+ palette = button.get_palette()
+ palette.popup(immediate=True, state=palette.SECONDARY)
+
+ def __switch_catalog_cb(self, catalog_name):
+ catalog_config = self.catalogs[catalog_name.decode('utf-8')]
+ self.__activate_catalog_cb(None, catalog_config)
+
+ def __activate_catalog_cb(self, menu, catalog_config):
+ query_language = self.get_query_language()
+
+ self.enable_button(False)
+ self.clear_downloaded_bytes()
+ self.book_selected = False
+ self.listview.clear()
+ logging.error('SOURCE %s', catalog_config['source'])
+ self._books_toolbar.search_entry.props.text = ''
+ self.source = catalog_config['source']
+ position = _SOURCES_CONFIG[self.source]['position']
+ self._books_toolbar.source_combo.set_active(position)
+
+ if self.queryresults is not None:
+ self.queryresults.cancel()
+ self.queryresults = None
+ #arch = open("/home/olpc/Activities/BibliotecaCeibal.activity/prueba","w")
+ #arch.write(query_language)
+ #arch.close()
+ query_language = 'all'
+ self.queryresults = opds.RemoteQueryResult(catalog_config,
+ '', query_language)
+ self.show_message(_('Performing lookup, please wait...'))
+ # README: I think we should create some global variables for
+ # each cursor that we are using to avoid the creation of them
+ # every time that we want to change it
+ self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
+
+ self.queryresults.connect('updated', self.__query_updated_cb)
+
+ def update_format_combo(self, links):
+ self.format_combo.handler_block(self.__format_changed_cb_id)
+ self.format_combo.remove_all()
+ for key in _MIMETYPES.keys():
+ if _MIMETYPES[key] in links.keys():
+ self.format_combo.append_item(_MIMETYPES[key], key)
+ self.format_combo.set_active(0)
+ self.format_combo.handler_unblock(self.__format_changed_cb_id)
+
+ def get_search_terms(self):
+ return self._books_toolbar.search_entry.props.text
+
+ def __device_changed_cb(self, mgr):
+ logging.debug('Device was added/removed')
+ self._refresh_sources(self._books_toolbar)
+
+ def _refresh_sources(self, toolbar):
+ toolbar.source_combo.handler_block(toolbar.source_changed_cb_id)
+
+ #TODO: Do not blindly clear this
+ toolbar.source_combo.remove_all()
+
+ position = 0
+ for key in _SOURCES.keys():
+ toolbar.source_combo.append_item(_SOURCES[key], key,
+ icon_name='internet-icon')
+ _SOURCES_CONFIG[key]['position'] = position
+ position = position + 1
+
+ # Add menu for local books
+ if len(_SOURCES) > 0:
+ toolbar.source_combo.append_separator()
+ toolbar.source_combo.append_item('local_books', _('My books'),
+ icon_name='activity-journal')
+
+ devices = self._device_manager.get_devices()
+
+ first_device = True
+ for device_name in devices:
+ device = devices[device_name]
+ logging.debug('device %s', device)
+ if device['removable']:
+ mount_point = device['mount_path']
+ label = device['label']
+ if label == '' or label is None:
+ capacity = device['size']
+ label = (_('%.2f GB Volume') % (capacity / (1024.0 ** 3)))
+ logging.debug('Adding device %s', (label))
+ if first_device:
+ toolbar.source_combo.append_separator()
+ first_device = False
+ toolbar.source_combo.append_item(mount_point, label)
+
+ toolbar.source_combo.set_active(0)
+ toolbar.source_combo.handler_unblock(toolbar.source_changed_cb_id)
+
+ def __format_changed_cb(self, combo):
+ self.show_book_data(False)
+
+ def __language_changed_cb(self, combo):
+ self.find_books(self.get_search_terms())
+
+ def __search_entry_activate_cb(self, entry):
+ self.find_books(self.get_search_terms())
+
+ def __get_book_cb(self, button):
+ self.get_book()
+
+ def enable_button(self, state):
+ self._download.props.sensitive = state
+ self.format_combo.props.sensitive = state
+
+ def move_up_catalog(self, treeview):
+ len_cat = len(self.catalog_history)
+ if len_cat == 1:
+ return
+ else:
+ # move a level up the tree
+ self.catalog_listview.handler_block(self._catalog_changed_id)
+ self.catalog_history.pop()
+ len_cat -= 1
+ if(len_cat == 1):
+ title = self.catalog_history[0]['title']
+ self.bt_move_up_catalog.set_label(title)
+ self.bt_move_up_catalog.hide_image()
+ else:
+ title = self.catalog_history[len_cat - 1]['title']
+ self.bt_move_up_catalog.set_label(title)
+ self.bt_move_up_catalog.show_image()
+ self.catalogs = self.catalog_history[len_cat - 1]['catalogs']
+ if len(self.catalogs) > 0:
+ self.path_iter = {}
+ self.categories = []
+ for key in self.catalogs.keys():
+ self.categories.append({'text': key, 'dentro': []})
+ self.treemodel.clear()
+ for p in self.categories:
+ self.path_iter[p['text']] = \
+ self.treemodel.append([p['text']])
+ self.catalog_listview.handler_unblock(self._catalog_changed_id)
+
+ def move_down_catalog(self, treeview):
+ treestore, coldex = \
+ self.catalog_listview.get_selection().get_selected()
+ len_cat = len(self.catalog_history)
+ if len_cat > 0 and self.catalog_history[len_cat - 1]['catalogs'] == []:
+ self.catalog_history.pop()
+ len_cat = len(self.catalog_history)
+
+ # README: when the Activity starts by default there is nothing
+ # selected and this signal is called, so we have to avoid this
+ # 'append' because it fails
+ if coldex is not None:
+ self.catalog_history.append(
+ {'title': treestore.get_value(coldex, 0), 'catalogs': []})
+ self.__switch_catalog_cb(treestore.get_value(coldex, 0))
+
+ def _sort_logfile(self, treemodel, itera, iterb):
+ a = treemodel.get_value(itera, 0)
+ b = treemodel.get_value(iterb, 0)
+ if a == None or b == None:
+ return 0
+ a = a.lower()
+ b = b.lower()
+ if a > b:
+ return 1
+ if a < b:
+ return -1
+ return 0
+
+ def __toggle_cats_cb(self, button):
+ if button.get_active():
+ self.tree_scroller.show_all()
+ self.separa.show()
+ else:
+ self.tree_scroller.hide()
+ self.separa.hide()
+
+ def _create_controls(self):
+ self._download_content_length = 0
+ self._download_content_type = None
+ self.progressbox = Gtk.Box(spacing=20,
+ orientation=Gtk.Orientation.HORIZONTAL)
+ self.progressbar = Gtk.ProgressBar()
+ self.progressbar.set_fraction(0.0)
+ self.progressbox.pack_start(self.progressbar, expand=True, fill=True,
+ padding=0)
+ self.cancel_btn = Gtk.Button(stock=Gtk.STOCK_CANCEL)
+ self.cancel_btn.connect('clicked', self.__cancel_btn_clicked_cb)
+ self.progressbox.pack_start(self.cancel_btn, expand=False,
+ fill=False, padding=0)
+
+ self.msg_label = Gtk.Label()
+
+ self.list_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
+
+ # Catalogs treeview
+ self.catalog_listview = Gtk.TreeView()
+ self.catalog_listview.headers_clickble = True
+ self.catalog_listview.hover_expand = True
+ self.catalog_listview.rules_hint = True
+ self._catalog_changed_id = self.catalog_listview.connect(
+ 'cursor-changed', self.move_down_catalog)
+ self.catalog_listview.set_enable_search(False)
+
+ self.treemodel = Gtk.ListStore(str)
+ self.treemodel.set_sort_column_id(0, Gtk.SortType.ASCENDING)
+ self.catalog_listview.set_model(self.treemodel)
+
+ renderer = Gtk.CellRendererText()
+ renderer.set_property('wrap-mode', Pango.WrapMode.WORD)
+ self.treecol = Gtk.TreeViewColumn(_('Catalogs'), renderer, text=0)
+ self.treecol.set_property('clickable', True)
+ self.treecol.connect('clicked', self.move_up_catalog)
+ self.catalog_listview.append_column(self.treecol)
+ self.bt_move_up_catalog = ButtonWithImage(_('Catalogs'))
+ self.bt_move_up_catalog.hide_image()
+ self.treecol.set_widget(self.bt_move_up_catalog)
+
+ self.load_source_catalogs()
+
+ self.tree_scroller = Gtk.ScrolledWindow(hadjustment=None,
+ vadjustment=None)
+ self.tree_scroller.set_policy(Gtk.PolicyType.NEVER,
+ Gtk.PolicyType.AUTOMATIC)
+ self.tree_scroller.add(self.catalog_listview)
+ self.list_box.pack_start(self.tree_scroller, expand=False,
+ fill=False, padding=0)
+ self.separa = Gtk.VSeparator()
+ self.list_box.pack_start(self.separa, expand=False,
+ fill=False, padding=0)
+
+ # books listview
+ self.listview = ListView(self._lang_code_handler)
+ self.listview.connect('selection-changed', self.selection_cb)
+ self.listview.set_enable_search(False)
+
+ self.list_scroller = Gtk.ScrolledWindow(hadjustment=None,
+ vadjustment=None)
+ self.list_scroller.set_policy(Gtk.PolicyType.AUTOMATIC,
+ Gtk.PolicyType.AUTOMATIC)
+ vadjustment = self.list_scroller.get_vadjustment()
+ vadjustment.connect('value-changed',
+ self.__vadjustment_value_changed_cb)
+ self.list_scroller.add(self.listview)
+ self.list_box.pack_start(self.list_scroller, expand=True,
+ fill=True, padding=0)
+
+ self.scrolled = Gtk.ScrolledWindow()
+ self.scrolled.set_policy(Gtk.PolicyType.NEVER,
+ Gtk.PolicyType.AUTOMATIC)
+ self.scrolled.props.shadow_type = Gtk.ShadowType.NONE
+ self.textview = Gtk.TextView()
+ self.textview.set_editable(False)
+ self.textview.set_cursor_visible(False)
+ self.textview.set_wrap_mode(Gtk.WrapMode.WORD)
+ self.textview.set_justification(Gtk.Justification.LEFT)
+ self.textview.set_left_margin(20)
+ self.textview.set_right_margin(20)
+ self.scrolled.add(self.textview)
+ self.list_box.show_all()
+ self.separa.hide()
+ self.tree_scroller.hide()
+
+ vbox_download = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
+
+ hbox_format = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
+ format_label = Gtk.Label(label=_('Format:'))
+ self.format_combo = ComboBox()
+ for key in _MIMETYPES.keys():
+ self.format_combo.append_item(_MIMETYPES[key], key)
+ self.format_combo.set_active(0)
+ self.format_combo.props.sensitive = False
+ self.__format_changed_cb_id = \
+ self.format_combo.connect('changed', self.__format_changed_cb)
+
+ hbox_format.pack_start(format_label, False, False, 10)
+ hbox_format.pack_start(self.format_combo, False, False, 10)
+ vbox_download.pack_start(hbox_format, False, False, 10)
+
+ self._download = Gtk.Button(_('Get Book'))
+ self._download.props.sensitive = False
+ self._download.connect('clicked', self.__get_book_cb)
+ vbox_download.pack_start(self._download, False, False, 10)
+
+ bottom_hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
+
+ if self.show_images:
+ self.__image_downloader = None
+ self.image = Gtk.Image()
+ self.add_default_image()
+ bottom_hbox.pack_start(self.image, False, False, 10)
+ bottom_hbox.pack_start(self.scrolled, True, True, 10)
+ bottom_hbox.pack_start(vbox_download, False, False, 10)
+ bottom_hbox.show_all()
+
+ vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
+ vbox.pack_start(self.msg_label, False, False, 10)
+ vbox.pack_start(self.progressbox, False, False, 10)
+ vbox.pack_start(self.list_box, True, True, 0)
+ vbox.pack_start(bottom_hbox, False, False, 10)
+ self.set_canvas(vbox)
+ self.listview.show()
+ vbox.show()
+ self.list_scroller.show()
+ self.progressbox.hide()
+ self.show_message(
+ _('Enter words from the Author or Title to begin search.'))
+
+ self._books_toolbar.search_entry.grab_focus()
+ if len(self.catalogs) > 0:
+ self.bt_catalogs.set_active(True)
+
+ def filter_catalogs_by_source(self):
+ self.catalogs = {}
+ for catalog_key in self.catalogs_configuration:
+ catalog = self.catalogs_configuration[catalog_key]
+ if catalog['source'] == self.source:
+ self.catalogs[catalog_key] = catalog
+
+ def load_source_catalogs(self):
+ self.filter_catalogs_by_source()
+
+ if len(self.catalogs) > 0:
+ self.categories = []
+ self.path_iter = {}
+ self.catalog_history = []
+ self.catalog_history.append({'title': _('Catalogs'),
+ 'catalogs': self.catalogs})
+ for key in self.catalogs.keys():
+ self.categories.append({'text': key, 'dentro': []})
+ self.treemodel.clear()
+
+ for p in self.categories:
+ self.path_iter[p['text']] = self.treemodel.append([p['text']])
+
+ def can_close(self):
+ self._lang_code_handler.close()
+ if self.queryresults is not None:
+ self.queryresults.cancel()
+ self.queryresults = None
+ return True
+
+ def selection_cb(self, widget):
+ # Testing...
+ selected_book = self.listview.get_selected_book()
+ if self.source == 'local_books':
+ if selected_book:
+ self.download_url = ''
+ self.selected_book = selected_book
+ self._download.hide()
+ self.show_book_data()
+ self._object_id = selected_book.get_object_id()
+ self._show_journal_alert(_('Selected book'),
+ self.selected_title)
+ else:
+ self.clear_downloaded_bytes()
+ if selected_book:
+ self.update_format_combo(selected_book.get_download_links())
+ self.selected_book = selected_book
+ self._download.show()
+ self.show_book_data()
+
+ def show_message(self, text):
+ self.msg_label.set_text(text)
+ self.msg_label.show()
+
+ def hide_message(self):
+ self.msg_label.hide()
+
+ def show_book_data(self, load_image=True):
+ self.selected_title = self.selected_book.get_title()
+ book_data = _('Title:\t\t') + self.selected_title + '\n'
+ self.selected_author = self.selected_book.get_author()
+ book_data += _('Author:\t\t') + self.selected_author + '\n'
+ self.selected_publisher = self.selected_book.get_publisher()
+ self.selected_summary = self.selected_book.get_summary()
+ if (self.selected_summary is not 'Unknown'):
+ book_data += _('Summary:\t') + self.selected_summary + '\n'
+ self.selected_language_code = self.selected_book.get_language()
+ if self.selected_language_code != '':
+ try:
+ self.selected_language = \
+ self._lang_code_handler.get_full_language_name(
+ self.selected_book.get_language())
+ except:
+ self.selected_language = self.selected_book.get_language()
+ book_data += _('Language:\t') + self.selected_language + '\n'
+ book_data += _('Publisher:\t') + self.selected_publisher + '\n'
+ if self.source != 'local_books':
+ try:
+ self.download_url = self.selected_book.get_download_links()[\
+ self.format_combo.props.value]
+ except:
+ pass
+ textbuffer = self.textview.get_buffer()
+ textbuffer.set_text('\n' + book_data)
+ self.enable_button(True)
+
+ # Cover Image
+ self.exist_cover_image = False
+ if self.show_images and load_image:
+ if self.source == 'local_books':
+ cover_image_buffer = self.get_journal_entry_cover_image(
+ self.selected_book.get_object_id())
+ if (cover_image_buffer):
+ self.add_image_buffer(
+ self.get_pixbuf_from_buffer(cover_image_buffer))
+ else:
+ self.add_default_image()
+ else:
+ url_image = self.selected_book.get_image_url()
+ self.add_default_image()
+ if url_image:
+ self.download_image(url_image.values()[0])
+
+ def get_pixbuf_from_buffer(self, image_buffer):
+ """Buffer To Pixbuf"""
+ pixbuf_loader = GdkPixbuf.PixbufLoader()
+ pixbuf_loader.write(image_buffer)
+ pixbuf_loader.close()
+ pixbuf = pixbuf_loader.get_pixbuf()
+ return pixbuf
+
+ def get_journal_entry_cover_image(self, object_id):
+ ds_object = datastore.get(object_id)
+ if 'cover_image' in ds_object.metadata:
+ cover_data = ds_object.metadata['cover_image']
+ return base64.b64decode(cover_data)
+ elif 'preview' in ds_object.metadata:
+ return ds_object.metadata['preview']
+ else:
+ return ""
+
+ def download_image(self, url):
+ self._inhibit_suspend()
+ if self.__image_downloader is not None:
+ self.__image_downloader.stop_download()
+ self.__image_downloader = opds.ImageDownloader(self, url)
+ self.__image_downloader.connect('updated', self.__image_updated_cb)
+
+ def __image_updated_cb(self, downloader, file_name):
+ if file_name is not None:
+ self.add_image(file_name)
+ self.exist_cover_image = True
+ os.remove(file_name)
+ else:
+ self.add_default_image()
+ self.__image_downloader = None
+ self._allow_suspend()
+
+ def add_default_image(self):
+ if self.format_combo.props.value == 'audio/mpeg':
+ file_path = os.path.join(activity.get_bundle_path(), 'musica.svg')
+ self.add_image(file_path)
+ elif self.format_combo.props.value == 'audio/ogg':
+ file_path = os.path.join(activity.get_bundle_path(), 'application-ogg.png')
+ self.add_image(file_path)
+ else:
+ file_path = os.path.join(activity.get_bundle_path(),'generic_cover.png')
+ self.add_image(file_path)
+
+ def add_image(self, file_path):
+ pixbuf = GdkPixbuf.Pixbuf.new_from_file(file_path)
+ self.add_image_buffer(pixbuf)
+
+ def add_image_buffer(self, pixbuf):
+ image_height = int(Gdk.Screen.height() / 4)
+ image_width = image_height / 3 * 2
+ width, height = pixbuf.get_width(), pixbuf.get_height()
+ scale = 1
+ if (width > image_width) or (height > image_height):
+ scale_x = image_width / float(width)
+ scale_y = image_height / float(height)
+ scale = min(scale_x, scale_y)
+
+ pixbuf2 = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB,
+ pixbuf.get_has_alpha(), pixbuf.get_bits_per_sample(),
+ image_width, image_height)
+
+ pixbuf2.fill(style.COLOR_PANEL_GREY.get_int())
+
+ margin_x = int((image_width - (width * scale)) / 2)
+ margin_y = int((image_height - (height * scale)) / 2)
+
+ pixbuf.scale(pixbuf2, margin_x, margin_y,
+ image_width - (margin_x * 2), image_height - (margin_y * 2),
+ margin_x, margin_y, scale, scale,
+ GdkPixbuf.InterpType.BILINEAR)
+
+ self.image.set_from_pixbuf(pixbuf2)
+
+ def get_query_language(self):
+ query_language = None
+ if len(self.languages) > 0:
+ query_language = self._books_toolbar.language_combo.props.value
+ return query_language
+
+ def find_books(self, search_text=''):
+ self._inhibit_suspend()
+ self.source = self._books_toolbar.source_combo.props.value
+
+ query_language = self.get_query_language()
+
+ self.enable_button(False)
+ self.clear_downloaded_bytes()
+ self.book_selected = False
+ self.listview.clear()
+
+ if self.queryresults is not None:
+ self.queryresults.cancel()
+ self.queryresults = None
+
+ if self.source == 'local_books':
+ self.listview.populate_with_books(
+ self.get_entrys_info(search_text))
+ else:
+ aux = 0 #Arreglado que si apretas ENTER aparezcan TODOS los libros de Ceibal
+ if self.source == 'Ceibal' and search_text == '':
+ aux = 1
+ #if self.source == 'local_books' and search_text == '':
+ # aux = 1
+ if search_text == '' and aux == 0:
+ return
+ if len(search_text) < 3 and aux == 0:
+ self.show_message(_('You must enter at least 3 letters.'))
+ self._books_toolbar.search_entry.grab_focus()
+ return
+ if self.source == 'Internet Archive':
+ self.queryresults = \
+ opds.InternetArchiveQueryResult(search_text,
+ query_language, self)
+ elif self.source in _SOURCES_CONFIG:
+ #if self.source in _SOURCES_CONFIG:
+ repo_configuration = _SOURCES_CONFIG[self.source]
+ self.queryresults = opds.RemoteQueryResult(repo_configuration,
+ search_text, query_language)
+ else:
+ self.queryresults = opds.LocalVolumeQueryResult(self.source,
+ search_text, query_language)
+
+ self.show_message(_('Performing lookup, please wait...'))
+ self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
+ self.queryresults.connect('updated', self.__query_updated_cb)
+
+ def __query_updated_cb(self, query, midway):
+ self.listview.populate(self.queryresults)
+ if 'bozo_exception' in self.queryresults._feedobj:
+ # something went wrong and we have to inform about this
+ bozo_exception = self.queryresults._feedobj.bozo_exception
+ if isinstance(bozo_exception, urllib2.URLError):
+ if isinstance(bozo_exception.reason, socket.gaierror):
+ if bozo_exception.reason.errno == -2:
+ self.show_message(_('Could not reach the server. '
+ 'Maybe you are not connected to the network'))
+ self.window.set_cursor(None)
+ return
+ self.show_message(_('There was an error downloading the list.'))
+ elif (len(self.queryresults.get_catalog_list()) > 0):
+ self.show_message(_('New catalog list %s was found') \
+ % self.queryresults._configuration["name"])
+ self.catalogs_updated(query, midway)
+ elif len(self.queryresults) == 0:
+ self.show_message(_('Sorry, no books could be found.'))
+ if not midway and len(self.queryresults) > 0:
+ self.hide_message()
+ query_language = self.get_query_language()
+ if query_language != 'all' and query_language != 'en':
+ # the bookserver send english books if there are not books in
+ # the requested language
+ only_english = True
+ for book in self.queryresults.get_book_list():
+ if book.get_language() == query_language:
+ only_english = False
+ break
+ if only_english:
+ self.show_message(
+ _('Sorry, we only found english books.'))
+ self.get_window().set_cursor(None)
+ self._allow_suspend()
+
+ def catalogs_updated(self, query, midway):
+ self.catalogs = {}
+ i = 0
+ for catalog_item in self.queryresults.get_catalog_list():
+ logging.debug('Add catalog %s', catalog_item.get_title())
+ catalog_config = {}
+ download_link = ''
+ download_links = catalog_item.get_download_links()
+ for link in download_links.keys():
+ download_link = download_links[link]
+ break
+ catalog_config['query_uri'] = download_link
+ catalog_config['opds_cover'] = \
+ catalog_item._configuration['opds_cover']
+ catalog_config['source'] = catalog_item._configuration['source']
+ source_config = _SOURCES_CONFIG[catalog_config['source']]
+ catalog_config['name'] = catalog_item.get_title()
+ catalog_config['summary_field'] = \
+ catalog_item._configuration['summary_field']
+ catalog_config['index'] = i
+ if catalog_item.get_title() in source_config['blacklist']:
+ logging.debug('Catalog "%s" is in blacklist',
+ catalog_item.get_title())
+ else:
+ self.catalogs[catalog_item.get_title().strip()] = \
+ catalog_config
+ i = i + 1
+ if len(self.catalogs) > 0:
+ len_cat = len(self.catalog_history)
+ self.catalog_history[len_cat - 1]['catalogs'] = self.catalogs
+ self.path_iter = {}
+ self.categories = []
+ for key in self.catalogs.keys():
+ self.categories.append({'text': key, 'dentro': []})
+ self.treemodel.clear()
+ for p in self.categories:
+ self.path_iter[p['text']] = \
+ self.treemodel.append([p['text']])
+
+ title = self.catalog_history[len_cat - 1]['title']
+ self.bt_move_up_catalog.set_label(title)
+ self.bt_move_up_catalog.show_image()
+
+ else:
+ self.catalog_history.pop()
+
+ def __source_changed_cb(self, widget):
+ search_terms = self.get_search_terms()
+ if search_terms == '':
+ self.find_books(None)
+ else:
+ self.find_books(search_terms)
+ # enable/disable catalogs button if configuration is available
+ self.source = self._books_toolbar.source_combo.props.value
+
+ # Get catalogs for this source
+ self.load_source_catalogs()
+
+ if len(self.catalogs) > 0:
+ self.bt_catalogs.show()
+ self.bt_catalogs.set_active(True)
+ else:
+ self.bt_catalogs.set_active(False)
+ self.bt_catalogs.hide()
+
+ def __vadjustment_value_changed_cb(self, vadjustment):
+
+ if not self.queryresults.is_ready():
+ return
+ try:
+ # Use various tricks to update resultset as user scrolls down
+ if ((vadjustment.props.upper - vadjustment.props.lower) > 1000 \
+ and (vadjustment.props.upper - vadjustment.props.value - \
+ vadjustment.props.page_size) / (vadjustment.props.upper - \
+ vadjustment.props.lower) < 0.3) or ((vadjustment.props.upper \
+ - vadjustment.props.value
+ - vadjustment.props.page_size) < 200):
+ if self.queryresults.has_next():
+ self.show_message(_('Tiene mas resultados, espere por favor...'))
+ self.queryresults.update_with_next()
+ finally:
+ return
+
+ def __cancel_btn_clicked_cb(self, btn):
+ if self._getter is not None:
+ try:
+ self._getter.cancel()
+ except:
+ logging.debug('Got an exception while trying' + \
+ 'to cancel download')
+ self.progressbox.hide()
+ self.listview.props.sensitive = True
+ self._books_toolbar.search_entry.set_sensitive(True)
+ logging.debug('Download was canceled by the user.')
+ self._allow_suspend()
+
+ def get_book(self):
+ self.enable_button(False)
+ self.progressbox.show_all()
+ GObject.idle_add(self.download_book, self.download_url)
+
+ def download_book(self, url):
+ self._inhibit_suspend()
+ logging.error('DOWNLOAD BOOK %s', url)
+ self.listview.props.sensitive = False
+ self._books_toolbar.search_entry.set_sensitive(False)
+ path = os.path.join(self.get_activity_root(), 'instance',
+ 'tmp%i' % time.time())
+ self._getter = opds.ReadURLDownloader(url)
+ self._getter.connect("finished", self._get_book_result_cb)
+ self._getter.connect("progress", self._get_book_progress_cb)
+ self._getter.connect("error", self._get_book_error_cb)
+ logging.debug("Starting download from %s to %s", url, path)
+ try:
+ self._getter.start(path)
+ except:
+ self.show_error_alert(_('Error'), _('Connection timed out for ') +
+ self.selected_title)
+
+ self._download_content_length = self._getter.get_content_length()
+ self._download_content_type = self._getter.get_content_type()
+
+ def _get_book_result_cb(self, getter, tempfile, suggested_name):
+ self.listview.props.sensitive = True
+ self._books_toolbar.search_entry.set_sensitive(True)
+ if self._download_content_type.startswith('text/html'):
+ # got an error page instead
+ self._get_book_error_cb(getter, 'HTTP Error')
+ return
+ self.process_downloaded_book(tempfile, suggested_name)
+
+ def _get_book_progress_cb(self, getter, bytes_downloaded):
+ if self._download_content_length > 0:
+ logging.debug("Downloaded %u of %u bytes...",
+ bytes_downloaded, self._download_content_length)
+ else:
+ logging.debug("Downloaded %u bytes...",
+ bytes_downloaded)
+ total = self._download_content_length
+ self.set_downloaded_bytes(bytes_downloaded, total)
+ while Gtk.events_pending():
+ Gtk.main_iteration()
+
+ def _get_book_error_cb(self, getter, err):
+ self.listview.props.sensitive = True
+ self.enable_button(True)
+ self.progressbox.hide()
+ logging.debug("Error getting document: %s", err)
+ self._download_content_length = 0
+ self._download_content_type = None
+ self._getter = None
+ if self.source == 'Internet Archive' and \
+ getter._url.endswith('_text.pdf'):
+ # in the IA server there are files ending with _text.pdf
+ # smaller and better than the .pdf files, but not for all
+ # the books. We try to download them and if is not present
+ # download the .pdf file
+ self.download_url = self.download_url.replace('_text.pdf', '.pdf')
+ self.get_book()
+ else:
+ self._allow_suspend()
+ self._show_error_alert(_('Error: Could not download %s. ' +
+ 'The path in the catalog seems to be incorrect') %
+ self.selected_title)
+
+ def set_downloaded_bytes(self, downloaded_bytes, total):
+ fraction = float(downloaded_bytes) / float(total)
+ self.progressbar.set_fraction(fraction)
+
+ def clear_downloaded_bytes(self):
+ self.progressbar.set_fraction(0.0)
+
+ def process_downloaded_book(self, tempfile, suggested_name):
+ logging.debug("Got document %s (%s)", tempfile, suggested_name)
+ self.create_journal_entry(tempfile)
+ self._getter = None
+ self._allow_suspend()
+
+ def create_journal_entry(self, tempfile):
+ journal_entry = datastore.create()
+ journal_title = self.selected_title
+ if self.selected_author != '':
+ journal_title = journal_title + ', by ' + self.selected_author
+ journal_entry.metadata['title'] = journal_title
+ journal_entry.metadata['title_set_by_user'] = '1'
+ journal_entry.metadata['keep'] = '0'
+ journal_entry.metadata['mime_type'] = \
+ self.format_combo.props.value
+ # Fix fake mime type for black&white pdfs
+ if journal_entry.metadata['mime_type'] == _MIMETYPES['PDF BW']:
+ journal_entry.metadata['mime_type'] = _MIMETYPES['PDF']
+
+ journal_entry.metadata['buddies'] = ''
+ journal_entry.metadata['icon-color'] = profile.get_color().to_string()
+ textbuffer = self.textview.get_buffer()
+ journal_entry.metadata['description'] = \
+ textbuffer.get_text(textbuffer.get_start_iter(),
+ textbuffer.get_end_iter(), True)
+ if self.exist_cover_image:
+ image_buffer = self._get_preview_image_buffer()
+ journal_entry.metadata['preview'] = dbus.ByteArray(image_buffer)
+ image_buffer = self._get_cover_image_buffer()
+ journal_entry.metadata['cover_image'] = \
+ dbus.ByteArray(base64.b64encode(image_buffer))
+ else:
+ journal_entry.metadata['cover_image'] = ""
+
+ journal_entry.metadata['tags'] = self.source
+ journal_entry.metadata['source'] = self.source
+ journal_entry.metadata['author'] = self.selected_author
+ journal_entry.metadata['publisher'] = self.selected_publisher
+ journal_entry.metadata['summary'] = self.selected_summary
+ journal_entry.metadata['language'] = self.selected_language_code
+
+ journal_entry.file_path = tempfile
+ datastore.write(journal_entry)
+ os.remove(tempfile)
+ self.progressbox.hide()
+ self._object_id = journal_entry.object_id
+ self._show_journal_alert(_('Download completed'), self.selected_title)
+
+ def _show_journal_alert(self, title, msg):
+ _stop_alert = Alert()
+ _stop_alert.props.title = title
+ _stop_alert.props.msg = msg
+ open_icon = Icon(icon_name='zoom-activity')
+ _stop_alert.add_button(Gtk.ResponseType.APPLY,
+ _('Show in Journal'), open_icon)
+ open_icon.show()
+ ok_icon = Icon(icon_name='dialog-ok')
+ _stop_alert.add_button(Gtk.ResponseType.OK, _('Ok'), ok_icon)
+ ok_icon.show()
+ # Remove other alerts
+ for alert in self._alerts:
+ self.remove_alert(alert)
+
+ self.add_alert(_stop_alert)
+ _stop_alert.connect('response', self.__stop_response_cb)
+ _stop_alert.show()
+
+ def __stop_response_cb(self, alert, response_id):
+ if response_id is Gtk.ResponseType.APPLY:
+ activity.show_object_in_journal(self._object_id)
+ self.remove_alert(alert)
+
+ def _get_preview_image_buffer(self):
+ preview_width, preview_height = style.zoom(300), style.zoom(225)
+
+ pixbuf = self.image.get_pixbuf()
+ width, height = pixbuf.get_width(), pixbuf.get_height()
+
+ scale = 1
+ if (width > preview_width) or (height > preview_height):
+ scale_x = preview_width / float(width)
+ scale_y = preview_height / float(height)
+ scale = min(scale_x, scale_y)
+
+ pixbuf2 = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB,
+ pixbuf.get_has_alpha(), pixbuf.get_bits_per_sample(),
+ preview_width, preview_height)
+ pixbuf2.fill(style.COLOR_WHITE.get_int())
+
+ margin_x = int((preview_width - (width * scale)) / 2)
+ margin_y = int((preview_height - (height * scale)) / 2)
+
+ pixbuf.scale(pixbuf2, margin_x, margin_y,
+ preview_width - (margin_x * 2),
+ preview_height - (margin_y * 2),
+ margin_x, margin_y, scale, scale,
+ GdkPixbuf.InterpType.BILINEAR)
+
+ succes, data = pixbuf2.save_to_bufferv('png', [], [])
+ return data
+
+ def _get_cover_image_buffer(self):
+ pixbuf = self.image.get_pixbuf()
+ succes, data = pixbuf.save_to_bufferv('png', [], [])
+ return data
+
+ def _show_error_alert(self, title, text=None):
+ alert = NotifyAlert(timeout=20)
+ alert.props.title = title
+ alert.props.msg = text
+ self.add_alert(alert)
+ alert.connect('response', self._alert_cancel_cb)
+ alert.show()
+
+ def _alert_cancel_cb(self, alert, response_id):
+ self.remove_alert(alert)
+ self.textview.grab_focus()
+
+ def get_entrys_info(self, query):
+ books = []
+ for key in _MIMETYPES.keys():
+ books.extend(self.get_entry_info_format(query, _MIMETYPES[key]))
+ return books
+
+ def get_entry_info_format(self, query, mime):
+ books = []
+ if query is not None and len(query) > 0:
+ ds_objects, num_objects = datastore.find(
+ {'mime_type': '%s' % mime,
+ 'query': '*%s*' % query})
+ else:
+ ds_objects, num_objects = datastore.find(
+ {'mime_type': '%s' % mime})
+
+ logging.error('Local search %d books found %s format', num_objects,
+ mime)
+ for i in range(0, num_objects):
+ entry = {}
+ entry['title'] = ds_objects[i].metadata['title']
+ entry['mime'] = ds_objects[i].metadata['mime_type']
+ entry['object_id'] = ds_objects[i].object_id
+
+ if 'author' in ds_objects[i].metadata:
+ entry['author'] = ds_objects[i].metadata['author']
+ else:
+ entry['author'] = ''
+
+ if 'publisher' in ds_objects[i].metadata:
+ entry['dcterms_publisher'] = \
+ ds_objects[i].metadata['publisher']
+ else:
+ entry['dcterms_publisher'] = ''
+
+ if 'language' in ds_objects[i].metadata:
+ entry['dcterms_language'] = \
+ ds_objects[i].metadata['language']
+ else:
+ entry['dcterms_language'] = ''
+
+ if 'source' in ds_objects[i].metadata:
+ entry['source'] = \
+ ds_objects[i].metadata['source']
+ else:
+ entry['source'] = ''
+
+ if entry['source'] in _SOURCES_CONFIG:
+ repo_configuration = _SOURCES_CONFIG[entry['source']]
+ summary_field = repo_configuration['summary_field']
+ if 'summary' in ds_objects[i].metadata:
+ entry[summary_field] = ds_objects[i].metadata['summary']
+ else:
+ entry[summary_field] = ''
+ else:
+ repo_configuration = None
+ books.append(opds.Book(repo_configuration, entry, ''))
+ return books
+
+ def close(self, skip_save=False):
+ "Override the close method so we don't try to create a Journal entry."
+ activity.Activity.close(self, True)
+
+ def save(self):
+ pass
+
+
+class ButtonWithImage(Gtk.Button):
+
+ def __init__(self, label_text):
+ GObject.GObject.__init__(self,)
+ self.icon_move_up = Icon(icon_name='go-up')
+ # self.remove(self.get_children()[0])
+ self.hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
+ self.add(self.hbox)
+ self.hbox.add(self.icon_move_up)
+ self.label = Gtk.Label(label=label_text)
+ self.hbox.add(self.label)
+ self.show_all()
+
+ def hide_image(self):
+ self.icon_move_up.hide()
+
+ def show_image(self):
+ self.icon_move_up.show()
+
+ def set_label(self, text):
+ self.label.set_text(text)
diff --git a/GetIABooksActivity.pyc b/GetIABooksActivity.pyc
new file mode 100644
index 0000000..6ca6624
--- /dev/null
+++ b/GetIABooksActivity.pyc
Binary files differ
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..83a5bdf
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,3 @@
+5
+
+* Spanish translations (Rafael Ortiz)
diff --git a/activity/activity.info b/activity/activity.info
new file mode 100644
index 0000000..d8ca7bc
--- /dev/null
+++ b/activity/activity.info
@@ -0,0 +1,8 @@
+[Activity]
+name = EBook Reader
+bundle_id = uy.ceibal.GetBooksCeibalActivity
+icon = get-ia-books
+exec = sugar-activity GetIABooksActivity.GetIABooksActivity
+show_launcher = yes
+activity_version = 5.4
+license = GPLv2+
diff --git a/activity/get-ia-books.svg b/activity/get-ia-books.svg
new file mode 100644
index 0000000..33cb4d4
--- /dev/null
+++ b/activity/get-ia-books.svg
@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="55px" height="55px" viewBox="0 0 55 55" enable-background="new 0 0 55 55" xml:space="preserve">
+<rect y="0" fill="#FFFFFF" width="55" height="55"/>
+<g>
+ <path fill="#FFFFFF" d="M52.708,18.149c0,0.41-0.038,0.835-0.114,1.279c-0.159,0.939-0.545,3.078-1.093,5.768
+ s-1.262,5.93-2.077,9.073c-0.409,1.571-0.84,3.122-1.291,4.562c-0.451,1.442-0.919,2.774-1.393,3.919
+ c-0.235,0.57-0.475,1.094-0.71,1.557c-0.237,0.463-0.474,0.865-0.701,1.194c-0.227,0.336-0.448,0.583-0.642,0.751
+ c-0.194,0.17-0.358,0.261-0.466,0.275c-1.335,0.31-7.109,0.673-13.86,0.673h-0.155c-2.838,0-5.854-0.06-8.825-0.207
+ c-2.971-0.146-5.891-0.378-8.526-0.719c-1.318-0.17-2.565-0.372-3.709-0.6c-1.148-0.229-2.189-0.484-3.098-0.774
+ c-0.913-0.284-1.685-0.611-2.286-0.953c-0.603-0.337-1.034-0.691-1.267-1.033c-0.185-0.216-0.401-1.17-0.401-2.498v-0.148v-0.023
+ c0-4.452,1.63-12.95,4.391-20.312c0.69-1.843,1.451-3.62,2.272-5.246c0.82-1.625,1.701-3.101,2.627-4.345
+ c1.857-2.5,3.872-4.005,5.87-4.124c0.421-0.028,0.92-0.054,1.486-0.071c0.565-0.018,1.198-0.026,1.885-0.026
+ c2.551,0,5.862,0.128,9.386,0.483c3.525,0.355,7.265,0.937,10.668,1.843c1.7,0.452,3.317,0.988,4.777,1.613
+ c1.459,0.625,2.763,1.337,3.843,2.141c1.082,0.81,1.931,1.696,2.513,2.676C52.396,15.861,52.704,16.943,52.708,18.149"/>
+ <path fill="#96BE3D" d="M52.594,19.428c0.076-0.443,0.113-0.869,0.113-1.279c-0.004-1.207-0.311-2.288-0.896-3.271
+ c-0.581-0.98-1.43-1.866-2.513-2.676c-1.079-0.803-2.383-1.516-3.842-2.141C43.997,9.437,42.38,8.9,40.68,8.449
+ c-3.401-0.907-7.143-1.489-10.667-1.844c-3.525-0.355-6.837-0.483-9.387-0.483c-0.688,0-1.32,0.009-1.885,0.026
+ s-1.065,0.042-1.486,0.071c-2,0.119-4.013,1.625-5.87,4.124c-0.926,1.243-1.807,2.72-2.627,4.345
+ c-0.821,1.625-1.583,3.402-2.273,5.246c-2.761,7.361-4.391,15.859-4.391,20.312v0.022v0.148c0,1.329,0.216,2.282,0.401,2.498
+ c0.232,0.342,0.665,0.696,1.267,1.034c0.603,0.34,1.374,0.667,2.286,0.952c0.909,0.289,1.951,0.546,3.098,0.774
+ c1.145,0.228,2.392,0.43,3.71,0.6c2.635,0.341,5.555,0.573,8.526,0.72c2.97,0.147,5.986,0.206,8.824,0.206h0.155
+ c6.75,0,12.525-0.363,13.86-0.674c0.107-0.014,0.271-0.104,0.466-0.274c0.193-0.168,0.415-0.415,0.642-0.75
+ c0.228-0.33,0.464-0.732,0.701-1.195c0.235-0.463,0.475-0.985,0.71-1.557c0.474-1.145,0.941-2.477,1.393-3.919
+ c0.451-1.44,0.882-2.991,1.291-4.562c0.815-3.145,1.529-6.384,2.077-9.074S52.435,20.368,52.594,19.428 M54.006,18.133v0.017
+ c0,0.486-0.042,0.983-0.128,1.495c-0.143,0.837-0.458,2.587-0.903,4.825c-0.448,2.238-1.025,4.959-1.695,7.74
+ c-0.68,2.785-1.435,5.617-2.253,8.089c-0.818,2.474-1.698,4.586-2.627,5.944c-0.272,0.385-0.552,0.727-0.856,0.994
+ c-0.308,0.266-0.646,0.465-1.035,0.562c-0.826,0.181-2.675,0.357-5.181,0.484c-2.505,0.131-5.665,0.217-9.121,0.219
+ c-4.286-0.002-8.975-0.137-13.317-0.496c-4.343-0.361-8.34-0.952-11.235-1.867c-1.935-0.624-3.411-1.359-4.221-2.473
+ c-0.255-0.383-0.409-0.855-0.503-1.418c-0.093-0.562-0.125-1.219-0.133-1.979c0.011-3.533,0.932-9.228,2.582-15.027
+ c1.65-5.803,4.031-11.713,6.964-15.675c0.979-1.314,2.037-2.431,3.172-3.24c1.136-0.813,2.352-1.315,3.652-1.406
+ c0.44-0.032,0.955-0.054,1.534-0.071c0.579-0.017,1.228-0.025,1.925-0.025c3.894,0.011,9.481,0.284,14.981,1.21
+ c5.502,0.926,10.92,2.502,14.471,5.124C52.438,12.907,54.006,15.236,54.006,18.133"/>
+ <path fill="#010101" d="M25.03,35.971h0.243c0.384,0,0.519,0.125,0.519,0.474c0,0.337-0.14,0.461-0.519,0.461H25.03V35.971z
+ M25.273,35.443H25.03v-0.84h0.243c0.312,0,0.428,0.103,0.428,0.376C25.701,35.323,25.588,35.443,25.273,35.443 M25.931,35.686
+ c0.323-0.113,0.481-0.358,0.481-0.743c0-0.616-0.342-0.882-1.14-0.882h-1.369v0.501h0.415v2.384h-0.415v0.501h1.369
+ c0.886,0,1.232-0.275,1.232-0.979C26.505,35.947,26.232,35.769,25.931,35.686"/>
+ <path fill="#010101" d="M27.841,36.945v-1.916h-1.126v0.5h0.414v1.416h-0.414v0.501h1.541v-0.501H27.841z M27.484,34.772
+ c0.229,0,0.417-0.19,0.417-0.425c0-0.233-0.187-0.425-0.417-0.425s-0.415,0.191-0.415,0.425
+ C27.069,34.582,27.255,34.772,27.484,34.772"/>
+ <path fill="#010101" d="M30.17,36.225c0,0.501-0.149,0.754-0.444,0.754c-0.101,0-0.258-0.016-0.318-0.024l-0.013-1.3
+ c0.002-0.001,0.157-0.126,0.371-0.126C30.017,35.528,30.17,35.576,30.17,36.225 M29.951,34.984c-0.263,0-0.454,0.114-0.544,0.178
+ v-1.1h-1.125v0.498h0.413v2.819l0.027,0.005c0.004,0.001,0.539,0.107,0.988,0.107c0.788,0,1.17-0.415,1.17-1.268
+ C30.881,35.4,30.567,34.984,29.951,34.984"/>
+ <polygon fill="#010101" points="32.263,36.947 32.263,34.062 31.138,34.062 31.138,34.562 31.554,34.562 31.554,36.947
+ 31.138,36.947 31.138,37.445 32.679,37.445 32.679,36.947 "/>
+ <path fill="#010101" d="M34.014,36.945V35.03h-1.125v0.498h0.414v1.417h-0.414v0.5h1.539v-0.5H34.014z M33.658,34.772
+ c0.229,0,0.415-0.189,0.415-0.425c0-0.233-0.186-0.425-0.415-0.425c-0.229,0-0.416,0.191-0.416,0.425
+ C33.242,34.583,33.43,34.772,33.658,34.772"/>
+ <path fill="#010101" d="M35.741,36.966c-0.188,0-0.438-0.076-0.438-0.728c0-0.677,0.215-0.733,0.438-0.733
+ c0.237,0,0.436,0.056,0.436,0.733C36.177,36.89,35.929,36.966,35.741,36.966 M35.741,34.984c-0.523,0-1.148,0.218-1.148,1.254
+ c0,0.818,0.397,1.254,1.148,1.254c0.761,0,1.147-0.422,1.147-1.254C36.889,35.404,36.502,34.984,35.741,34.984"/>
+ <path fill="#010101" d="M38.737,36.832c-0.003,0-0.333,0.083-0.435,0.083c-0.084,0-0.124-0.02-0.124-0.123v-1.266h0.536V35.03
+ h-0.536v-0.737h-0.711v0.737h-0.413v0.496h0.413v1.274c0,0.611,0.375,0.691,0.702,0.691c0.301,0,0.575-0.104,0.608-0.14v-0.529
+ L38.737,36.832z"/>
+ <path fill="#010101" d="M40.011,35.469c0.196,0,0.308,0.088,0.326,0.542h-0.686C39.68,35.552,39.79,35.469,40.011,35.469
+ M40.011,34.985c-0.32,0-1.068,0.121-1.068,1.253c0,0.843,0.381,1.254,1.162,1.254c0.396,0,0.743-0.12,0.779-0.158v-0.556
+ l-0.043,0.014c-0.002,0.001-0.419,0.123-0.736,0.123c-0.271,0-0.42-0.143-0.452-0.433h1.379v-0.244
+ C41.031,35.417,40.68,34.985,40.011,34.985"/>
+ <path fill="#010101" d="M42.629,35.966h0.499v-0.033l-0.02-0.839c-0.01-0.005-0.25-0.109-0.621-0.109
+ c-0.255,0-1.084,0.091-1.084,1.268c0,1.111,0.631,1.24,1.106,1.24c0.298,0,0.585-0.103,0.618-0.14v-0.557l-0.041,0.014
+ c-0.005,0.001-0.34,0.105-0.532,0.105c-0.222,0-0.441-0.053-0.441-0.663c0-0.468,0.134-0.704,0.396-0.704
+ c0.042,0,0.09,0.003,0.119,0.005V35.966z"/>
+ <path fill="#010101" d="M44.164,36.698c0-0.247,0.126-0.332,0.498-0.332h0.129l0.014,0.466c-0.001,0-0.179,0.113-0.393,0.113
+ C44.248,36.945,44.164,36.862,44.164,36.698 M45.5,36.945v-1.127c0-0.74-0.486-0.834-0.913-0.834c-0.46,0-0.886,0.146-0.912,0.179
+ v0.558l0.044-0.015c0.003-0.001,0.423-0.137,0.759-0.137c0.215,0,0.312,0.034,0.312,0.243v0.125h-0.382
+ c-0.357,0-0.954,0.104-0.954,0.797c0,0.683,0.506,0.758,0.724,0.758c0.319,0,0.537-0.148,0.626-0.221l0.032,0.148l0.007,0.025
+ h1.073v-0.5H45.5z"/>
+ <path fill="#59595B" d="M31.125,38.555h-0.152v0.94c0.467,0,0.633-0.127,0.633-0.479C31.605,38.658,31.469,38.555,31.125,38.555
+ M30.973,39.703v0.582h0.331v0.208h-0.875v-0.208h0.271v-1.757h-0.271V38.32h0.715c0.441,0,0.733,0.137,0.733,0.685
+ C31.877,39.516,31.563,39.703,30.973,39.703"/>
+ <polygon fill="#59595B" points="32.059,40.493 32.059,40.285 32.332,40.285 32.332,38.528 32.059,38.528 32.059,38.32
+ 32.603,38.32 32.603,40.285 32.875,40.285 32.875,40.493 "/>
+ <path fill="#59595B" d="M34.008,39.745h-0.194c-0.238,0-0.411,0.051-0.411,0.313c0,0.175,0.1,0.244,0.237,0.244
+ c0.198,0,0.368-0.175,0.368-0.175V39.745z M34.037,40.493l-0.029-0.175c0,0-0.146,0.205-0.43,0.205
+ c-0.179,0-0.447-0.084-0.447-0.432c0-0.443,0.342-0.531,0.612-0.531h0.265v-0.166c0-0.22-0.118-0.24-0.303-0.24
+ c-0.146,0-0.377,0.062-0.438,0.08v-0.229c0,0,0.229-0.081,0.479-0.081c0.291,0,0.532,0.078,0.532,0.519v0.843h0.271v0.208H34.037z"
+ />
+ <path fill="#59595B" d="M35.969,40.493v-1.101c0-0.206-0.111-0.221-0.256-0.221c-0.205,0-0.438,0.168-0.438,0.168v0.945h0.271
+ v0.208h-0.814v-0.208h0.273v-1.122h-0.273v-0.208h0.515l0.029,0.192c0,0,0.232-0.224,0.508-0.224c0.265,0,0.459,0.109,0.459,0.477
+ v0.885h0.271v0.208H35.969z"/>
+ <path fill="#59595B" d="M38.121,40.524c-0.354,0-0.747-0.142-0.747-1.117c0-0.979,0.488-1.117,0.758-1.117s0.449,0.09,0.449,0.09
+ v0.532h-0.285v-0.263c0,0-0.06-0.015-0.145-0.015c-0.181,0-0.356,0.152-0.356,0.772c0,0.553,0.131,0.77,0.356,0.77
+ c0.193,0,0.43-0.091,0.43-0.091v0.341C38.581,40.427,38.39,40.524,38.121,40.524"/>
+ <path fill="#59595B" d="M39.442,39.199c-0.182,0-0.246,0.099-0.26,0.398h0.494C39.668,39.284,39.595,39.199,39.442,39.199
+ M39.183,39.863c0.02,0.278,0.187,0.325,0.32,0.325c0.213,0,0.487-0.081,0.487-0.081v0.334c0,0-0.228,0.083-0.487,0.083
+ c-0.333,0-0.74-0.101-0.74-0.801c0-0.631,0.355-0.8,0.68-0.8c0.3,0,0.646,0.137,0.646,0.8v0.14H39.183z"/>
+ <path fill="#59595B" d="M40.768,38.742c-0.141,0-0.25-0.116-0.25-0.256c0-0.139,0.109-0.256,0.25-0.256
+ c0.142,0,0.25,0.117,0.25,0.256C41.018,38.626,40.909,38.742,40.768,38.742 M40.285,40.493V40.21h0.271v-0.974h-0.271v-0.281h0.693
+ v1.255h0.271v0.283H40.285z"/>
+ <path fill="#59595B" d="M42.262,39.237c-0.15,0-0.257,0.088-0.257,0.088v0.888c0,0,0.146,0.018,0.229,0.018
+ c0.151,0,0.314-0.097,0.314-0.516C42.549,39.308,42.458,39.237,42.262,39.237 M42.226,40.524c-0.296,0-0.643-0.07-0.643-0.07v-1.85
+ h-0.271V38.32h0.692v0.745c0,0,0.147-0.142,0.378-0.142c0.221,0,0.59,0.076,0.59,0.791C42.973,40.448,42.52,40.524,42.226,40.524"
+ />
+ <path fill="#59595B" d="M44.135,39.787h-0.105c-0.232,0-0.348,0.049-0.348,0.238c0,0.13,0.075,0.185,0.184,0.185
+ c0.148,0,0.27-0.078,0.27-0.078V39.787z M44.164,40.493l-0.029-0.133c0,0-0.157,0.163-0.424,0.163
+ c-0.196,0-0.452-0.087-0.452-0.474c0-0.414,0.336-0.502,0.604-0.502h0.271v-0.103c0-0.156-0.083-0.179-0.227-0.179
+ c-0.227,0-0.506,0.09-0.506,0.09v-0.336c0,0,0.276-0.097,0.578-0.097c0.312,0,0.577,0.085,0.577,0.525v0.761h0.271v0.283H44.164z"
+ />
+ <polygon fill="#59595B" points="44.949,40.493 44.949,40.21 45.223,40.21 45.223,38.604 44.949,38.604 44.949,38.32 45.644,38.32
+ 45.644,40.21 45.916,40.21 45.916,40.493 "/>
+ <path fill="#87AC3F" d="M16.433,42.058L16.433,42.058c0.572-0.103,0.5-1.419,0.56-1.482c0.077-0.404,1.611,0.919,2.02,0.696
+ C17.261,42.464,16.433,42.058,16.433,42.058"/>
+ <path fill="#49612C" d="M19.006,41.271c-1.15,0.518-2.564,0.781-2.564,0.781s0.231,0.819,1.05,1.001c0,0,0.136,0.063,0.291-0.112
+ C18.759,42.024,19.006,41.271,19.006,41.271"/>
+ <path fill="#87AC3F" d="M16.433,42.058L16.433,42.058c0.572-0.103,0.5-1.419,0.56-1.482c0.077-0.404,1.611,0.919,2.02,0.696
+ C17.261,42.464,16.433,42.058,16.433,42.058"/>
+ <path fill="#49612C" d="M19.006,41.271c-1.15,0.518-2.564,0.781-2.564,0.781s0.231,0.819,1.05,1.001c0,0,0.136,0.063,0.291-0.112
+ C18.759,42.024,19.006,41.271,19.006,41.271"/>
+ <path fill="#96BE3D" d="M22.365,36.19c-0.215,0.368-0.45,0.725-0.68,1.082c-1.242,1.921-2.495,3.981-4.041,5.678
+ c-0.162,0.178-0.718-0.382-1.157-0.826c-1.035-1.441-2.787-3.27-5.713-2.73c2.038-1.732,4.076-3.464,6.115-5.195
+ c2.213-0.942,3.606,1.029,5.414,1.833c0.056,0.023,0.102,0.038,0.142,0.046C22.42,36.108,22.393,36.144,22.365,36.19
+ M14.838,33.023c0.562,0.062,1.072,0.273,1.463,0.845c-2.117,1.797-4.232,3.597-6.349,5.396c-1.634-2.875-3.711-1.786-5.603-1.977
+ c1.714-1.201,3.605-2.508,5.319-3.708c0.437-0.305,0.873-0.609,1.308-0.914c0.035-0.024,0.07-0.049,0.104-0.074
+ c0.144,0.1,0.296,0.184,0.461,0.244c0.041,0.021,0.081,0.039,0.123,0.055c0-0.04,0.159-0.622,0.159-0.622
+ c-0.188-0.066-0.361-0.16-0.514-0.289c-0.104-0.087-0.261-0.134-0.384-0.049c-2.499,1.748-4.998,3.497-7.497,5.245
+ c-0.013,0.008-0.268,0.14-0.268,0.482s0.146,0.425,0.146,0.425c4.771,0.499,5.369,2.236,5.37,2.241h0.012
+ c0,0,0.91-0.332,1.14-0.245c0.231,0.086,0.535,0.672,0.662,0.955c1.462-0.752,5.08,1.659,6.358,2.469
+ c0.346,0.199,0.57,0.292,0.868,0.164c0.39-0.166,0.695-0.638,0.939-0.949c0.664-0.846,1.277-1.732,1.891-2.617
+ c0.667-0.961,1.319-1.936,1.952-2.922c0.206-0.322,0.694-0.862,0.686-1.279c-0.002-0.146-0.096-0.262-0.232-0.306
+ c-1.28-0.409-2.179-1.533-3.46-1.989c-0.932-0.331-1.75-0.372-2.64-0.061c-0.435-0.649-1.076-1.024-1.875-1.135
+ C14.978,32.408,14.854,33.023,14.838,33.023"/>
+ <path fill="#E22F35" d="M26.545,9.928c-3.467,0.226-6.526,11.742-6.89,16.434c-1.124-0.374-2.68-0.406-3.229-0.369
+ c-1.153,0.076-2.166,4.095-2.198,5.42c-0.38-0.13-0.877-0.168-1.194-0.171c0.233-0.486,0.51-1.896,0.543-2.092
+ c0.14-0.821-1.753-0.889-2.213-0.858c-0.655,0.043-1.218,2.657-1.062,2.879c0.198,0.279,1.553,0.3,2.234,0.27
+ c-0.364,0.46-0.646,1.631-0.669,2.117c-0.29-0.206-0.943-0.224-1.14-0.21c-0.378,0.023-0.703,1.532-0.613,1.659
+ c0.132,0.186,1.158,0.172,1.441,0.145c-0.129,0.236-0.231,0.616-0.271,0.875c-0.158-0.145-0.586-0.159-0.712-0.149
+ c-0.228,0.016-0.424,0.925-0.368,1.002c0.086,0.123,0.821,0.101,0.906,0.082c0.064-0.014,0.159-0.415,0.205-0.641
+ c0.201,0.137,1.085,0.112,1.195,0.087c0.116-0.026,0.298-0.956,0.317-1.066c0.066-0.39-0.829-0.422-1.046-0.407
+ c-0.018,0.001-0.033,0.008-0.049,0.016c0.123-0.335,0.251-0.994,0.271-1.104c0.461,0.217,1.971,0.171,2.163,0.128
+ c0.198-0.047,0.503-1.529,0.574-1.906c1.24,0.412,4.378,0.31,4.8,0.216c0.346-0.079,0.835-2.062,1.122-3.398
+ c3.462,1.724,14.649,2.187,16.848,1.27c2.455-1.024,4.288-13.681,4.54-15.163C42.943,9.761,29.477,9.73,26.545,9.928"/>
+ <path fill="#FFFFFF" d="M34.715,18.167c0.063-0.022,0.146-0.098,0.234-0.134c0.043,0.005,0.075-0.008,0.11-0.028
+ c0.175-0.006,0.351-0.038,0.526-0.045c0.081,0.033,0.167,0.021,0.252,0.018c-0.017-0.102-0.011-0.193-0.029-0.303
+ c-0.07,0.011-0.152-0.05-0.211-0.025c0.005-0.023,0.004-0.007-0.022-0.01c-0.022-0.002-0.03-0.001-0.05-0.004
+ c-0.055-0.005-0.127-0.007-0.178,0.015c-0.114-0.024-0.236,0.021-0.354,0.026c-0.136,0.078-0.3,0.118-0.417,0.231
+ c-0.012,0.004-0.022,0.001-0.036,0.017c0.015,0.108,0.042,0.234,0.076,0.333C34.653,18.231,34.711,18.197,34.715,18.167"/>
+ <path fill="#FFFFFF" d="M35.382,18.208c-0.118-0.028-0.205-0.002-0.315,0.029c-0.131,0.038-0.269,0.21-0.405,0.247
+ c0.017,0.083,0.033,0.165,0.061,0.249c0.112,0.03,0.084,0.172,0.161,0.257c0.079,0.004,0.156-0.032,0.229-0.048
+ c0.048-0.01,0.102-0.014,0.151-0.021c0.088-0.009,0.165-0.033,0.255-0.052c0.044-0.01,0.088-0.021,0.13-0.041
+ c0.082,0.007,0.163-0.005,0.244-0.009c-0.01-0.126,0.021-0.248-0.023-0.377c0.008-0.069-0.015-0.141-0.022-0.211
+ C35.69,18.191,35.535,18.203,35.382,18.208"/>
+ <path fill="#FFFFFF" d="M27.047,19.559c-0.123,0.013-0.252-0.002-0.375,0.016c-0.053,0.008-0.102,0.04-0.15,0.045
+ c-0.069,0.009-0.139-0.012-0.209,0c-0.195,0.03-0.426,0.133-0.57,0.208c-0.246,0.135-0.358,0.254-0.508,0.496
+ c-0.091,0.146-0.265,0.326-0.279,0.449c-0.014,0.121,0.005,0.328,0.011,0.42c0.007,0.126,0.093,0.274,0.149,0.404
+ c0.06,0.14,0.127,0.266,0.21,0.344c0.322,0.304,1.058,0.522,1.646,0.36c0.058-0.017,0.109-0.053,0.135-0.061
+ c0.108-0.029,0.221-0.028,0.313-0.075c0.27-0.386,0.496-0.84,0.735-1.229c0.246-0.393,0.448-0.785,0.63-1.227
+ c-0.521-0.141-1.081-0.196-1.617-0.298C27.122,19.437,27.105,19.545,27.047,19.559"/>
+ <path fill="#FFFFFF" d="M34.632,14.576c0.031,0.33,0.099,0.635,0.152,0.966c0.056,0.186,0.06,0.357,0.116,0.534
+ c-0.01,0.056,0.044,0.118,0.021,0.174c0.018,0.035,0.02,0.051,0.023,0.087c0.01,0.08,0.035,0.148,0.044,0.221
+ c0.009,0.059,0.019,0.09,0.026,0.137c0.003,0.034,0.019,0.082,0.021,0.12c0.007,0.045,0.003,0.087,0.005,0.131
+ c0.033,0.033,0.015,0.12,0.034,0.151c-0.01,0.067,0.014,0.137,0.014,0.205c0.084-0.013,0.194-0.047,0.291-0.068
+ c-0.001-0.107-0.004-0.184-0.052-0.272c-0.01-0.167-0.095-0.339-0.1-0.505c-0.04-0.043-0.021-0.142-0.073-0.215
+ c-0.016-0.117-0.054-0.22-0.091-0.347c0.02-0.159-0.113-0.362-0.129-0.52c-0.008-0.018-0.018-0.008-0.025-0.022
+ c0.004-0.071-0.041-0.124-0.052-0.19c-0.005-0.013,0.009-0.028,0.003-0.044c-0.025-0.113-0.111-0.227-0.131-0.346
+ c0.001,0.005,0.009-0.047,0.005-0.063c-0.035-0.195-0.147-0.4-0.173-0.584c-0.009,0.057,0.011,0.116,0.028,0.174
+ C34.577,14.39,34.601,14.483,34.632,14.576"/>
+ <path fill="#FFFFFF" d="M35.62,19.721c-0.037,0.114-0.053,0.258,0.008,0.359c-0.048-0.009-0.032,0.047-0.034,0.077
+ c0.018-0.01,0.032-0.001,0.047-0.002c-0.003-0.016-0.019-0.033,0.011-0.045c0.02,0.061,0.04,0.15-0.06,0.147
+ c0.03,0.028,0.051,0.036,0.07,0.041c-0.024,0.016-0.045,0.009-0.068,0.032c0.021,0.043-0.014,0.084,0.009,0.126
+ c0.01-0.005,0.04-0.036,0.065-0.006c-0.006,0.04-0.053,0.039-0.078,0.052c0.013,0.079,0.054,0.208,0.128,0.258
+ c-0.014,0.022-0.026,0.046-0.053,0.067c0.017,0.19,0.087,0.357,0.121,0.549c-0.016,0.018-0.02,0.074,0.015,0.074
+ c-0.01-0.279,0.09-0.55,0.1-0.828c-0.022,0.008-0.046,0.014-0.066-0.005c-0.005-0.047,0.043-0.098,0.097-0.104
+ c-0.008-0.053,0.027-0.104,0.012-0.158c-0.019-0.01-0.042,0.032-0.062,0.014c-0.007-0.01-0.016-0.019-0.023-0.028
+ c0.009-0.026,0.033-0.047,0.04-0.071c0.032-0.013,0.066,0.03,0.083-0.019c-0.017-0.023-0.036,0-0.052-0.019
+ c0.019-0.012-0.009-0.027,0.003-0.039c0.008,0.012,0.053-0.026,0.043-0.037c-0.017,0.018-0.033,0.01-0.045-0.011
+ c-0.008-0.021,0.005-0.044,0.03-0.063c-0.062-0.044,0.049-0.071,0.004-0.114c-0.029,0.007-0.059,0.034-0.087,0
+ c0.055-0.024,0.033-0.083,0.075-0.101c-0.037-0.032-0.075-0.05-0.115-0.036C35.86,19.799,35.637,19.751,35.62,19.721"/>
+ <path fill="#FFFFFF" d="M36.858,24.864c-0.015,0.042-0.071,0.074-0.053,0.142c-0.031,0.014,0.015-0.008,0.006,0.012
+ c-0.075,0.133-0.089,0.333-0.115,0.458c-0.064,0.059-0.081,0.122-0.158,0.162c0.058,0.103-0.085,0.21-0.113,0.303
+ c-0.021,0.072-0.014,0.156-0.029,0.231c-0.131,0.617-0.539,1.113-0.84,1.499c0.017,0.032,0.003,0.073,0.01,0.112
+ c0.014,0.099,0.047,0.187,0.024,0.301c-0.02,0.104-0.059,0.236-0.119,0.301c-0.009,0.136-0.039,0.093-0.125,0.168
+ c-0.081,0.072-0.13,0.091-0.236,0.135c-0.095,0.038-0.203,0.081-0.325,0.094c-0.087,0.008-0.268-0.03-0.317-0.052
+ c-0.133-0.059-0.23-0.161-0.3-0.276c-0.061-0.104-0.088-0.188-0.101-0.338c-0.01-0.118-0.035-0.064-0.004-0.2
+ c0.022-0.098,0.044-0.178,0.081-0.254c0.103-0.212,0.257-0.303,0.459-0.374c0.091-0.03,0.213-0.055,0.334-0.046
+ c0.049,0.004,0.128,0.018,0.19,0.048c0.043,0.021,0.059,0.062,0.091,0.078c0.015,0.007,0.209,0.126,0.232,0.164
+ c0.135-0.072,0.203-0.246,0.282-0.397c0.125-0.244,0.233-0.516,0.284-0.752c0.021-0.101,0.036-0.183,0.045-0.282
+ c0.001-0.028,0.018-0.059,0.02-0.087c0.001-0.03-0.009-0.059-0.005-0.084c0.01-0.072-0.115-0.26-0.103-0.312
+ c-0.083-0.064-0.159-0.049-0.249-0.071c-0.274-0.067-0.539-0.176-0.831-0.271c-0.145-0.046-0.325-0.079-0.494-0.16
+ c-0.059-0.027-0.12-0.07-0.201-0.113c-0.079-0.042-0.202-0.152-0.263-0.15c-0.107,0.002-0.165,0.265-0.191,0.398
+ c-0.107,0.557-0.364,1.079-0.629,1.424c0.073,0.125,0.155,0.33,0.13,0.534c-0.018,0.146-0.052,0.296-0.131,0.379
+ c-0.002,0.217-0.14,0.198-0.257,0.303c-0.021,0.007-0.048,0.01-0.071,0.02c-0.013,0.006-0.02,0.023-0.032,0.028
+ c-0.053,0.021-0.135,0.033-0.186,0.074c-0.09-0.009-0.198,0.045-0.302,0.035c-0.072-0.007-0.15-0.05-0.205-0.023
+ c-0.032-0.036-0.086-0.036-0.133-0.062c-0.116-0.06-0.172-0.125-0.245-0.234c-0.076-0.117-0.11-0.201-0.132-0.354
+ c-0.013-0.083-0.021-0.143-0.014-0.243c0.008-0.078,0.052-0.155,0.033-0.239c0.012-0.012,0.018-0.016,0.021-0.018
+ c0.002-0.004,0.003-0.012,0.009-0.03c0.008-0.021,0.025-0.046,0.038-0.073c0.073-0.165,0.213-0.29,0.364-0.359
+ c0.013-0.007,0.035-0.004,0.059-0.014c0.034-0.015,0.101-0.054,0.144-0.064c0.015-0.003,0.038,0.007,0.055,0.005
+ c0.014-0.004,0.021-0.019,0.031-0.02c0.038-0.003,0.078,0.004,0.12,0.002c0.062-0.002,0.119-0.02,0.191,0.001
+ c0.048,0.015,0.104,0.057,0.146,0.082c0.047,0.029,0.191,0.131,0.229,0.165c0.047-0.029,0.07-0.083,0.097-0.132
+ c0.062-0.119,0.115-0.241,0.161-0.428c0.021-0.09,0.044-0.162,0.053-0.253c0.007-0.064,0.029-0.143,0.035-0.212
+ c0.004-0.031-0.009-0.063-0.004-0.093c0.007-0.037,0.033-0.083,0.038-0.12c0.005-0.045-0.009-0.092-0.002-0.138
+ c0.008-0.081,0.044-0.159,0.061-0.241c0.023-0.125-0.076-0.313-0.071-0.43c0.002-0.075,0.018-0.136,0.019-0.225
+ c0-0.006-0.011-0.027-0.01-0.029c0-0.008,0.017-0.017,0.017-0.033c0-0.025-0.01-0.051-0.009-0.075
+ c0.007-0.123,0.03-0.243,0.022-0.353c-0.002-0.053-0.03-0.103,0-0.183c0.078-0.202,0.312-0.183,0.506-0.067
+ c0.046,0.028,0.085,0.077,0.13,0.096c0.044,0.02,0.09-0.001,0.139,0.034c0.03,0.024,0.01,0.023,0.048,0.031
+ c0.022,0.005,0.022,0.022,0.039,0.028c0.056,0.022,0.137,0.033,0.218,0.082c0.064-0.015,0.055,0.023,0.123,0.021
+ c0.031,0.032,0.088,0.05,0.128,0.077c0.043,0.021,0.005-0.021,0.039-0.008c0.035,0.04,0.108,0.034,0.137,0.042
+ c0.039,0.015,0.09,0.031,0.145,0.045c0.037,0.011,0.075,0.028,0.11,0.037c0.011,0.002,0.019-0.013,0.03-0.012
+ c0.02,0.002,0.12,0.032,0.107,0.046c0.018-0.007,0.08-0.005,0.079,0.02c0.028-0.015,0.06,0.011,0.088-0.023
+ c0.066,0.035,0.131,0.03,0.183,0.036c0.019,0.009-0.001-0.036,0.013-0.007c0.053,0.019,0.093,0.001,0.137-0.002
+ c0.019-0.001,0.039,0.006,0.055,0.004c0.019-0.002,0.037-0.023,0.054-0.023c0.018-0.002,0.053,0.017,0.076,0.019
+ c0.016,0.001,0.021-0.012,0.039-0.008c0.078,0.01,0.144-0.004,0.229,0c0.074-0.006,0.125-0.052,0.194-0.043
+ c0.025,0.004,0.119,0.039,0.168,0.069c0.003,0.002-0.006,0.015,0.004,0.019c0.011,0.005,0.018,0.004,0.039,0.029
+ c0.024,0.029,0.059,0.068,0.092,0.069c0.029,0.05,0.054,0.111,0.078,0.166c0.008,0.015,0.024,0.022,0.029,0.034
+ c0.015,0.04,0.011,0.088,0.045,0.113c-0.008,0.061-0.001,0.113,0.003,0.167C36.852,24.765,36.874,24.82,36.858,24.864"/>
+ <path fill="#FFFFFF" d="M31.166,18.87c-0.021,0.048-0.054,0.091-0.077,0.135c-0.022,0.055-0.021,0.109-0.044,0.165
+ c-0.033,0.091-0.089,0.188-0.135,0.27c-0.193,0.357-0.402,0.702-0.612,1.034c-0.22,0.344-0.414,0.696-0.615,1.033
+ c-0.159,0.271-0.297,0.514-0.434,0.808c-0.068,0.153-0.099,0.309-0.195,0.435c-0.025,0.208-0.124,0.493-0.06,0.734
+ c0.042,0.148,0.134,0.355,0.225,0.39c0.053,0.02,0.042-0.007,0.076-0.015c0.009-0.003,0.024,0.022,0.045,0.015
+ c0.006-0.003,0.011-0.028,0.015-0.031c0.063-0.017,0.131-0.021,0.179-0.043c0.132-0.062,0.221-0.182,0.344-0.225
+ c0.031-0.062,0.07-0.107,0.105-0.166c0.061-0.098,0.07-0.141,0.15-0.209c0.109-0.091,0.345-0.068,0.496,0.015
+ c0.027,0.016,0.027,0.052,0.059,0.074c0.028,0.022,0.064,0.026,0.089,0.045c0.071,0.056,0.128,0.093,0.134,0.134
+ c0.023,0.115-0.083,0.228-0.148,0.3c-0.08,0.085-0.168,0.144-0.226,0.225c-0.138,0.154-0.296,0.292-0.435,0.449
+ c-0.14,0.056-0.242,0.18-0.374,0.255c-0.138,0.077-0.292,0.111-0.418,0.209c-0.273,0.014-0.569,0.183-0.75,0.015
+ c-0.103,0.04-0.18-0.041-0.314-0.015c-0.197-0.101-0.37-0.281-0.569-0.405c-0.066-0.042-0.114-0.138-0.18-0.209
+ c-0.054-0.058-0.136-0.087-0.182-0.135c-0.052-0.058-0.09-0.166-0.147-0.254c-0.055-0.082-0.138-0.157-0.166-0.225
+ c-0.064-0.158-0.025-0.347-0.03-0.539c-0.153-0.039-0.309-0.024-0.465-0.015c-0.167,0.01-0.297,0.059-0.509,0.044
+ c-0.068-0.005-0.139-0.035-0.208-0.044c-0.204-0.031-0.365-0.05-0.541-0.105c-0.058-0.02-0.104-0.06-0.165-0.076
+ c-0.081-0.02-0.164-0.011-0.239-0.029c-0.071-0.018-0.124-0.048-0.195-0.075c-0.154-0.057-0.313-0.081-0.448-0.149
+ c-0.114-0.058-0.169-0.183-0.302-0.196c-0.124-0.125-0.255-0.249-0.375-0.419c-0.022-0.032-0.033-0.071-0.058-0.104
+ c-0.025-0.031-0.053-0.056-0.074-0.09c-0.045-0.064-0.071-0.141-0.106-0.224c-0.035-0.078-0.148-0.099-0.164-0.166
+ c-0.017-0.071,0.057-0.214,0.042-0.298c-0.008-0.058-0.04-0.123-0.043-0.181c-0.008-0.102,0.026-0.224,0.029-0.345
+ c0.006-0.125-0.01-0.257,0.014-0.359c0.053-0.204,0.219-0.36,0.242-0.569c0.375-0.443,0.85-0.788,1.363-1.094
+ c1.032-0.185,2.383,0.166,3.4,0.3c0.283,0.038,0.687,0.042,0.897-0.104c0.104-0.072,0.136-0.196,0.241-0.285
+ c0.071-0.215,0.139-0.416,0.224-0.631c0.048-0.119,0.076-0.199,0.122-0.357c0.038-0.144,0.039-0.269,0.013-0.465
+ c-0.035-0.264-0.098-0.402-0.283-0.584c-0.07-0.067-0.077-0.071-0.166-0.135c-0.064-0.046-0.119-0.064-0.225-0.118
+ c-0.047-0.026-0.092-0.071-0.134-0.091c-0.068-0.031-0.151-0.037-0.225-0.06c-0.191-0.061-0.404-0.127-0.63-0.076
+ c-0.021,0.106,0.013,0.231,0,0.345c-0.012,0.106-0.099,0.333-0.165,0.464c-0.055,0.11-0.121,0.201-0.195,0.299
+ c-0.127,0.174-0.257,0.251-0.525,0.315c-0.068,0.017-0.16,0.03-0.224,0.045c-0.07,0.015-0.146,0.001-0.225,0.03
+ c-0.244-0.086-0.5-0.16-0.689-0.3c-0.081-0.186-0.223-0.304-0.241-0.524c-0.005-0.085,0.01-0.243,0.032-0.33
+ c0.065-0.268,0.328-0.653,0.538-0.809c0.14-0.103,0.323-0.122,0.525-0.193c0.106-0.04,0.219-0.102,0.314-0.122
+ c0.046-0.008,0.121,0.008,0.18,0c0.156-0.018,0.334-0.05,0.524-0.044c0.179,0.007,0.411,0.038,0.584,0.076
+ c0.023,0.005,0.035,0.026,0.06,0.03c0.17,0.025,0.409,0.143,0.6,0.224c0.178,0.077,0.357,0.163,0.523,0.241
+ c0.354,0.162,0.624,0.435,0.884,0.613c0.14,0.015,0.25,0.131,0.361,0.224c0.184,0.157,0.298,0.313,0.401,0.569
+ c0.02,0.046,0.111,0.1,0.13,0.149C31.581,17.811,31.361,18.421,31.166,18.87"/>
+ <path fill="#E22F35" d="M27.047,19.559c-0.123,0.013-0.252-0.002-0.375,0.016c-0.053,0.008-0.102,0.04-0.15,0.045
+ c-0.069,0.009-0.139-0.012-0.209,0c-0.195,0.03-0.426,0.133-0.57,0.208c-0.246,0.135-0.358,0.254-0.508,0.496
+ c-0.091,0.146-0.265,0.326-0.279,0.449c-0.014,0.121,0.005,0.328,0.011,0.42c0.007,0.126,0.093,0.274,0.149,0.404
+ c0.06,0.14,0.127,0.266,0.21,0.344c0.322,0.304,1.058,0.522,1.646,0.36c0.058-0.017,0.109-0.053,0.135-0.061
+ c0.108-0.029,0.221-0.028,0.313-0.075c0.27-0.386,0.496-0.84,0.735-1.229c0.246-0.393,0.448-0.785,0.63-1.227
+ c-0.521-0.141-1.081-0.196-1.617-0.298C27.122,19.437,27.105,19.545,27.047,19.559"/>
+ <path fill="#FFFFFF" d="M34.106,14.423c0.029-0.075,0.016-0.153,0.031-0.229c-0.015-0.085-0.006-0.17,0.012-0.252
+ c-0.027-0.092-0.001-0.196-0.001-0.3c0.001-0.075-0.024-0.152-0.025-0.222c0-0.03,0.009-0.064,0.009-0.099
+ c0-0.115,0.024-0.235,0.029-0.356c-0.044-0.091,0.002-0.174-0.027-0.264c0.013-0.047,0.009-0.095-0.002-0.145
+ c0.007-0.095,0.032-0.206,0.023-0.296c-0.005-0.005,0.001-0.006,0.003-0.004c0.014-0.078,0.016-0.159,0.028-0.24
+ c-0.02,0.004-0.01-0.013-0.017-0.027c-0.028-0.051-0.079-0.097-0.048-0.148c0.079-0.039,0.117-0.172,0.243-0.176
+ c0.04,0.024,0.063,0.046,0.094,0.069c0,0.049-0.017,0.097-0.033,0.146c0.021,0.046,0.039,0.088,0.058,0.114
+ C34.485,12,34.473,11.999,34.473,12c0.031,0.051,0.084,0.069,0.073,0.127c0.069,0.104,0.104,0.239,0.157,0.362
+ c-0.017,0.008,0,0.019-0.016,0.026c0.054,0.1,0.086,0.197,0.141,0.308c0.048,0.099,0.077,0.211,0.119,0.31
+ c0.027,0.063,0.062,0.125,0.084,0.188c0.024,0.081,0.021,0.167,0.07,0.234c0.012,0.081,0.052,0.214,0.086,0.296
+ c0.002,0.089,0.046,0.192,0.068,0.263c-0.006,0.027-0.002,0.076,0.021,0.093c0.028,0.084,0.001,0.152,0.062,0.232
+ c0.009,0.13,0.088,0.265,0.079,0.393c0.009,0.015,0.009,0.016,0.021,0.024c-0.001,0.035,0.018,0.049,0.016,0.085
+ c0.041,0.067,0.026,0.155,0.055,0.232c0.057,0.079,0.07,0.188,0.069,0.275c0.009,0.008,0.016,0.016,0.022,0.026
+ c-0.001,0.024-0.004,0.061,0.016,0.076c0.002,0.047,0.015,0.095,0.025,0.14c0.007,0.033,0.039,0.079,0.044,0.109
+ c0.007,0.047,0.018,0.115,0.03,0.169c0.021,0.089,0.032,0.207,0.078,0.317c0.008,0.113,0.044,0.228,0.045,0.33
+ c0.032,0.07,0.03,0.133,0.029,0.193c0.004,0.004,0.008-0.003,0.012-0.003c0,0.074,0.05,0.136,0.04,0.204
+ c0.023,0.02,0.001,0.029,0.021,0.043c-0.001,0.005-0.005,0.012-0.012,0.018c0.027,0.14,0.043,0.276,0.045,0.414
+ c0.029,0.025,0.041,0.062,0.037,0.101c-0.023,0.003-0.002,0.019-0.021,0.033c0.011,0.028-0.006,0.07,0.02,0.088
+ c-0.016,0.073,0.024,0.149,0.002,0.22c0.017,0.011,0.009,0.021,0.021,0.032c-0.025-0.001-0.003,0.027-0.007,0.041
+ c0.014,0.009,0.009,0.019,0.027,0.018c0.009,0.027,0.031,0.052,0.031,0.078c0.002,0.052-0.049,0.083-0.045,0.129
+ c0.001,0.031-0.003,0.072,0.005,0.107c0.015,0.058,0.014,0.128,0.032,0.181c-0.013,0.023-0.005,0.047,0.006,0.072
+ c-0.036,0.099,0.021,0.208-0.036,0.308c-0.012,0.016-0.025,0.016-0.038,0.026c-0.011,0.037,0.021,0.098,0.056,0.126
+ c0,0.015,0.005,0.028,0,0.042c0.049,0.071,0.042,0.167,0.077,0.25c-0.004,0.091,0.049,0.19,0.081,0.286l0.091,0.202
+ c-0.011-0.001-0.021-0.001-0.033,0c0.011,0.027,0.046,0.038,0.06,0.062c-0.02,0.015-0.02,0.01-0.033,0.027
+ c0.005,0.01,0.012,0.012,0.019,0.005c-0.005,0.016,0,0.034-0.008,0.049c0.078,0.278,0.04,0.547,0.059,0.82
+ c-0.007,0.015-0.002,0.032-0.014,0.047c0.004,0.005,0.01,0.01,0.013,0.018c-0.029,0.025-0.008,0.064-0.012,0.102
+ c-0.002,0.022-0.014,0.065-0.02,0.092c-0.009,0.04-0.031,0.079-0.023,0.123c-0.014,0.021-0.011,0.041-0.025,0.062
+ c0,0.056-0.026,0.109-0.021,0.166c-0.072,0.192-0.1,0.422-0.246,0.603c-0.027,0.034-0.062,0.061-0.09,0.095
+ c-0.042,0.052-0.095,0.125-0.156,0.168c-0.035-0.011-0.07,0.014-0.103-0.014c-0.004,0.003,0.001,0.009,0.004,0.012
+ c-0.054,0.002-0.1-0.032-0.147-0.067c-0.012-0.065-0.086-0.084-0.126-0.124c-0.118-0.044-0.224-0.165-0.343-0.269
+ c-0.016-0.033-0.034-0.084-0.068-0.09c-0.045-0.069-0.072-0.137-0.108-0.207c-0.029-0.047-0.07-0.081-0.09-0.121
+ c-0.015-0.036-0.02-0.08-0.035-0.118c-0.035-0.089-0.09-0.181-0.089-0.28c-0.079-0.23-0.097-0.456-0.102-0.679
+ c0.022-0.072,0.007-0.148,0.008-0.223c0-0.044,0.03-0.093-0.003-0.144c0.021-0.159,0.017-0.319,0.062-0.478
+ c0.009-0.127-0.001-0.259,0.054-0.383c-0.018-0.189-0.126-0.375-0.165-0.571c-0.013-0.015-0.025-0.018-0.037-0.02
+ c-0.019-0.037-0.024-0.073,0.003-0.105c-0.046-0.138-0.063-0.248-0.107-0.385c0.006-0.052-0.008-0.106-0.031-0.163
+ c0.006-0.024,0.001-0.049-0.016-0.077c-0.043-0.327-0.093-0.635-0.155-0.965c-0.011-0.271-0.02-0.543-0.052-0.818
+ c0.007-0.014,0.003-0.028,0.015-0.041c-0.028-0.04-0.001-0.074-0.032-0.113c-0.002-0.209-0.053-0.424-0.012-0.63
+ c-0.018-0.104-0.003-0.204,0.001-0.308c-0.011-0.114-0.041-0.231-0.001-0.34C34.098,14.506,34.126,14.466,34.106,14.423"/>
+ <path fill="#E22F35" d="M34.715,18.167c0.063-0.022,0.146-0.098,0.234-0.134c0.043,0.005,0.075-0.008,0.11-0.028
+ c0.175-0.006,0.351-0.038,0.526-0.045c0.081,0.033,0.167,0.021,0.252,0.018c-0.017-0.102-0.011-0.193-0.029-0.303
+ c-0.07,0.011-0.152-0.05-0.211-0.025c0.005-0.023,0.004-0.007-0.022-0.01c-0.022-0.002-0.03-0.001-0.05-0.004
+ c-0.055-0.005-0.127-0.007-0.178,0.015c-0.114-0.024-0.236,0.021-0.354,0.026c-0.136,0.078-0.3,0.118-0.417,0.231
+ c-0.012,0.004-0.022,0.001-0.036,0.017c0.015,0.108,0.042,0.234,0.076,0.333C34.653,18.231,34.711,18.197,34.715,18.167"/>
+ <path fill="#E22F35" d="M35.382,18.208c-0.118-0.028-0.205-0.002-0.315,0.029c-0.131,0.038-0.269,0.21-0.405,0.247
+ c0.017,0.083,0.033,0.165,0.061,0.249c0.112,0.03,0.084,0.172,0.161,0.257c0.079,0.004,0.156-0.032,0.229-0.048
+ c0.048-0.01,0.102-0.014,0.151-0.021c0.088-0.009,0.165-0.033,0.255-0.052c0.044-0.01,0.088-0.021,0.13-0.041
+ c0.082,0.007,0.163-0.005,0.244-0.009c-0.01-0.126,0.021-0.248-0.023-0.377c0.008-0.069-0.015-0.141-0.022-0.211
+ C35.69,18.191,35.535,18.203,35.382,18.208"/>
+ <path fill="#E22F35" d="M34.632,14.576c0.031,0.33,0.099,0.635,0.152,0.966c0.056,0.186,0.06,0.357,0.116,0.534
+ c-0.01,0.056,0.044,0.118,0.021,0.174c0.018,0.035,0.02,0.051,0.023,0.087c0.01,0.08,0.035,0.148,0.044,0.221
+ c0.009,0.059,0.019,0.09,0.026,0.137c0.003,0.034,0.019,0.082,0.021,0.12c0.007,0.045,0.003,0.087,0.005,0.131
+ c0.033,0.033,0.015,0.12,0.034,0.151c-0.01,0.067,0.014,0.137,0.014,0.205c0.084-0.013,0.194-0.047,0.291-0.068
+ c-0.001-0.107-0.004-0.184-0.052-0.272c-0.01-0.167-0.095-0.339-0.1-0.505c-0.04-0.043-0.021-0.142-0.073-0.215
+ c-0.016-0.117-0.054-0.22-0.091-0.347c0.02-0.159-0.113-0.362-0.129-0.52c-0.008-0.018-0.018-0.008-0.025-0.022
+ c0.004-0.071-0.041-0.124-0.052-0.19c-0.005-0.013,0.009-0.028,0.003-0.044c-0.025-0.113-0.111-0.227-0.131-0.346
+ c0.001,0.005,0.009-0.047,0.005-0.063c-0.035-0.195-0.147-0.4-0.173-0.584c-0.009,0.057,0.011,0.116,0.028,0.174
+ C34.577,14.39,34.601,14.483,34.632,14.576"/>
+ <path fill="#E22F35" d="M35.62,19.721c-0.037,0.114-0.053,0.258,0.008,0.359c-0.048-0.009-0.032,0.047-0.034,0.077
+ c0.018-0.01,0.032-0.001,0.047-0.002c-0.003-0.016-0.019-0.033,0.011-0.045c0.02,0.061,0.04,0.15-0.06,0.147
+ c0.03,0.028,0.051,0.036,0.07,0.041c-0.024,0.016-0.045,0.009-0.068,0.032c0.021,0.043-0.014,0.084,0.009,0.126
+ c0.01-0.005,0.04-0.036,0.065-0.006c-0.006,0.04-0.053,0.039-0.078,0.052c0.013,0.079,0.054,0.208,0.128,0.258
+ c-0.014,0.022-0.026,0.046-0.053,0.067c0.017,0.19,0.087,0.357,0.121,0.549c-0.016,0.018-0.02,0.074,0.015,0.074
+ c-0.01-0.279,0.09-0.55,0.1-0.828c-0.022,0.008-0.046,0.014-0.066-0.005c-0.005-0.047,0.043-0.098,0.097-0.104
+ c-0.008-0.053,0.027-0.104,0.012-0.158c-0.019-0.01-0.042,0.032-0.062,0.014c-0.007-0.01-0.016-0.019-0.023-0.028
+ c0.009-0.026,0.033-0.047,0.04-0.071c0.032-0.013,0.066,0.03,0.083-0.019c-0.017-0.023-0.036,0-0.052-0.019
+ c0.019-0.012-0.009-0.027,0.003-0.039c0.008,0.012,0.053-0.026,0.043-0.037c-0.017,0.018-0.033,0.01-0.045-0.011
+ c-0.008-0.021,0.005-0.044,0.03-0.063c-0.062-0.044,0.049-0.071,0.004-0.114c-0.029,0.007-0.059,0.034-0.087,0
+ c0.055-0.024,0.033-0.083,0.075-0.101c-0.037-0.032-0.075-0.05-0.115-0.036C35.86,19.799,35.637,19.751,35.62,19.721"/>
+</g>
+</svg>
diff --git a/application-ogg.png b/application-ogg.png
new file mode 100644
index 0000000..9498758
--- /dev/null
+++ b/application-ogg.png
Binary files differ
diff --git a/devicemanager.py b/devicemanager.py
new file mode 100644
index 0000000..c86c8eb
--- /dev/null
+++ b/devicemanager.py
@@ -0,0 +1,75 @@
+#! /usr/bin/env python
+
+# Copyright (C) 2009 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 os
+import logging
+
+from gi.repository import GObject
+from gi.repository import Gio
+
+
+class DeviceManager(GObject.GObject):
+
+ __gsignals__ = {
+ 'device-changed': (GObject.SignalFlags.RUN_FIRST,
+ None,
+ ([])),
+ }
+
+ def __init__(self):
+ GObject.GObject.__init__(self)
+
+ self._devices = {}
+
+ self.volume_monitor = Gio.VolumeMonitor.get()
+ self.volume_monitor.connect('mount-added', self._mount_added_cb)
+ self.volume_monitor.connect('mount-removed', self._mount_removed_cb)
+
+ self._populate_devices()
+
+ def _populate_devices(self):
+ for mount in self.volume_monitor.get_mounts():
+ props = self._get_props_from_device(mount)
+ if mount.can_eject() and props['have_catalog']:
+ self._devices[mount] = props
+
+ def _get_props_from_device(self, mount):
+ props = {}
+ props['removable'] = True
+ props['mounted'] = True
+ props['mount_path'] = mount.get_default_location().get_path()
+ props['label'] = mount.get_name()
+ # FIXME: get the proper size here
+ props['size'] = 0
+ props['have_catalog'] = os.path.exists(\
+ os.path.join(props['mount_path'], 'catalog.xml'))
+ return props
+
+ def _mount_added_cb(self, volume_monitor, device):
+ props = self._get_props_from_device(device)
+ self._devices[device] = props
+ logging.debug('Device added: %s', props)
+ if props['have_catalog']:
+ self.emit('device-changed')
+
+ def _mount_removed_cb(self, volume_monitor, device):
+ del self._devices[device]
+ self.emit('device-changed')
+
+ def get_devices(self):
+ return self._devices
diff --git a/devicemanager.pyc b/devicemanager.pyc
new file mode 100644
index 0000000..90d9ad0
--- /dev/null
+++ b/devicemanager.pyc
Binary files differ
diff --git a/extListview.py b/extListview.py
new file mode 100644
index 0000000..060eddc
--- /dev/null
+++ b/extListview.py
@@ -0,0 +1,705 @@
+# -*- coding: utf-8 -*-
+#
+# Author: Ingelrest François (Francois.Ingelrest@gmail.com)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Library General Public License for more details.
+#
+# You 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
+#
+# ExtListView v1.6
+#
+# v1.6:
+# * Added a context menu to column headers allowing users to show/hide
+# columns
+# * Improved sorting a bit
+#
+# v1.5:
+# * Fixed intermittent improper columns resizing
+#
+# v1.4:
+# * Replaced TYPE_INT by TYPE_PYOBJECT as the fifth parameter type of
+# extListview-dnd
+# (see http://www.daa.com.au/pipermail/pygtk/2007-October/014311.html)
+# * Prevent sorting rows when the list is empty
+#
+# v1.3:
+# * Greatly improved speed when sorting a lot of rows
+# * Added support for Gtk.CellRendererToggle
+# * Improved replaceContent() method
+# * Added a call to set_cursor() when removing selected row(s)
+# * Added getFirstSelectedRow(), appendRows(), addColumnAttribute(),
+# unselectAll() and selectAll() methods
+# * Set expand to False when calling pack_start(, True, True, 0)
+#
+# v1.2:
+# * Fixed D'n'D reordering bugs
+# * Improved code for testing the state of the keys for mouse clicks
+# * Added quite a few new methods (replaceContent, hasMarkAbove,
+# hasMarkUnder, __len__, iterSelectedRows, iterAllRows)
+#
+# v1.1:
+# * Added a call to set_cursor() when unselecting all rows upon clicking on
+# the empty area
+# * Sort indicators are now displayed whenever needed
+
+import random
+import logging
+
+from gi.repository import Gtk
+from gi.repository import GObject
+from gi.repository import Gdk
+
+
+# Internal d'n'd (reordering)
+DND_REORDERING_ID = 1024
+DND_INTERNAL_TARGET = ('extListview-internal',
+ Gtk.TargetFlags.SAME_WIDGET, DND_REORDERING_ID)
+
+
+class ExtListViewColumn(Gtk.TreeViewColumn):
+ """
+ TreeViewColumn does not signal right-click events, and we need them
+ This subclass is equivalent to TreeViewColumn, but it signals these
+ events
+
+ Most of the code of this class comes from Quod Libet
+ (http://www.sacredchao.net/quodlibet)
+ """
+
+ __gsignals__ = {
+ 'button-press-event': (GObject.SignalFlags.RUN_LAST, None,
+ (object,)),
+ }
+
+ def __init__(self, title=None, cell_renderer=None, **args):
+ """ Constructor, see Gtk.TreeViewColumn """
+ GObject.GObject.__init__(self)
+ label = Gtk.Label(label=title)
+ self.set_widget(label)
+ label.show()
+ label.__realize = label.connect('realize', self.onRealize)
+
+ def onRealize(self, widget):
+ widget.disconnect(widget.__realize)
+ del widget.__realize
+ button = widget.get_ancestor(Gtk.Button)
+ if button is not None:
+ button.connect('button-press-event', self.onButtonPressed)
+
+ def onButtonPressed(self, widget, event):
+ self.emit('button-press-event', event)
+
+
+class ExtListView(Gtk.TreeView):
+
+ __gsignals__ = {
+ 'extlistview-modified': (GObject.SignalFlags.RUN_LAST, None,
+ ()),
+
+ # README: I had to change gdk.Event to object on the arguments
+ # sent to the callback because with Gdk.Event it didn't work
+ # 'extlistview-button-pressed': (GObject.SignalFlags.RUN_LAST, None,
+ # (object, bool)),
+ }
+
+ def __init__(self, columns, sortable=True, dndTargets=[], useMarkup=False,
+ canShowHideColumns=True):
+ """
+ If sortable is True, the user can click on headers to sort
+ the contents of the list
+
+ The d'n'd targets are the targets accepted by the list
+ (e.g., [('text/uri-list', 0, 0)])
+ Note that for the latter, the identifier 1024 must not be used
+ (internally used for reordering)
+
+ If useMarkup is True, the 'markup' attributes is used instead of
+ 'text' for CellRendererTexts
+ """
+ GObject.GObject.__init__(self)
+
+ self.selection = self.get_selection()
+
+ # Sorting rows
+ self.sortLastCol = None # The last column used for sorting
+ # (needed to switch between ascending/descending)
+ self.sortAscending = True # Ascending or descending order
+ self.sortColCriteria = {} # For each column, store the tuple of
+ # indexes used to sort the rows
+
+ # Default configuration for this list
+ self.set_rules_hint(True)
+ self.set_headers_visible(True)
+
+ self.selection.set_mode(Gtk.SelectionMode.MULTIPLE)
+
+ # Create the columns
+ nbEntries = 0
+ dataTypes = []
+ for (title, renderers, sortIndexes, expandable, visible) in columns:
+ if title is None:
+ nbEntries += len(renderers)
+ dataTypes += [renderer[1] for renderer in renderers]
+ else:
+ column = ExtListViewColumn(title)
+ column.set_resizable(True)
+ # column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
+ column.set_expand(expandable)
+ column.set_visible(visible)
+ if canShowHideColumns:
+ column.connect('button-press-event',
+ self.onColumnHeaderClicked)
+ self.append_column(column)
+
+ if sortable:
+ column.set_clickable(True)
+ column.connect('clicked', self.__sortRows)
+ self.sortColCriteria[column] = sortIndexes
+
+ for (renderer, type) in renderers:
+ nbEntries += 1
+ dataTypes.append(type)
+ column.pack_start(renderer, False)
+ if isinstance(renderer, Gtk.CellRendererToggle):
+ column.add_attribute(renderer, 'active', nbEntries - 1)
+ elif isinstance(renderer, Gtk.CellRendererPixbuf):
+ column.add_attribute(renderer, 'pixbuf', nbEntries - 1)
+ elif isinstance(renderer, Gtk.CellRendererText):
+ if useMarkup:
+ column.add_attribute(renderer, 'markup',
+ nbEntries - 1)
+ else:
+ column.add_attribute(renderer, 'text',
+ nbEntries - 1)
+
+ # Mark management
+ self.markedRow = None
+ self.markColumn = len(dataTypes)
+ dataTypes.append(bool) # When there's no other solution,
+ # this additional entry helps in
+ # finding the marked row
+
+ # Create the ListStore associated with this tree
+ self.store = Gtk.ListStore(*dataTypes)
+ self.set_model(self.store)
+
+ # Drag'n'drop management
+ self.dndContext = None
+ self.dndTargets = dndTargets
+ self.motionEvtId = None
+ self.dndStartPos = None
+ self.dndReordering = False
+
+ if len(dndTargets) != 0:
+ self.enable_model_drag_dest(dndTargets, Gdk.DragAction.DEFAULT)
+
+ # self.connect('drag-begin', self.onDragBegin)
+ # self.connect('drag-motion', self.onDragMotion)
+
+ # README: this function is disconnected because it emit twice
+ # 'selection-changed'
+ # self.connect('button-press-event', self.onButtonPressed)
+
+ # self.connect('drag-data-received', self.onDragDataReceived)
+ # self.connect('button-release-event', self.onButtonReleased)
+
+ # Show the list
+ self.show()
+
+ # --== Miscellaneous ==--
+
+ def __getIterOnSelectedRows(self):
+ """ Return a list of iterators pointing to the selected rows """
+ return [self.store.get_iter(path) \
+ for path in self.selection.get_selected_rows()[1]]
+
+ def addColumnAttribute(self, colIndex, renderer, attribute, value):
+ """ Add a new attribute to the given column """
+ self.get_column(colIndex).add_attribute(renderer, attribute, value)
+
+ # --== Mark management ==--
+
+ def hasMark(self):
+ """ True if a mark has been set """
+ return self.markedRow is not None
+
+ def hasMarkAbove(self, index):
+ """ True if a mark is set and is above the given index """
+ return self.markedRow is not None and self.markedRow > index
+
+ def hasMarkUnder(self, index):
+ """ True if a mark is set and is undex the given index """
+ return self.markedRow is not None and self.markedRow < index
+
+ def clearMark(self):
+ """ Remove the mark """
+ if self.markedRow is not None:
+ self.setItem(self.markedRow, self.markColumn, False)
+ self.markedRow = None
+
+ def getMark(self):
+ """ Return the index of the marked row """
+ return self.markedRow
+
+ def setMark(self, rowIndex):
+ """ Put the mark on the given row, it will move with the
+ row itself (e.g., D'n'D) """
+ self.clearMark()
+ self.markedRow = rowIndex
+ self.setItem(rowIndex, self.markColumn, True)
+
+ def __findMark(self):
+ """ Linear search for the marked row --
+ To be used only when there's no other solution """
+ iter = self.store.get_iter_first()
+
+ while iter is not None:
+ if self.store.get_value(iter, self.markColumn) == True:
+ self.markedRow = self.store.get_path(iter)[0]
+ break
+ iter = self.store.iter_next(iter)
+
+ # --== Sorting content ==--
+
+ def __resetSorting(self):
+ """ Reset sorting such that the next column click
+ will result in an ascending sorting """
+ if self.sortLastCol is not None:
+ self.sortLastCol.set_sort_indicator(False)
+ self.sortLastCol = None
+
+ def __cmpRows(self, row1, row2, criteria, ascending):
+ """ Compare two rows based on the given criteria, the latter
+ being a tuple of the indexes to use for the comparison """
+ # Sorting on the first criterion may be done either ascending
+ # or descending
+ criterion = criteria[0]
+ result = cmp(row1[criterion], row2[criterion])
+
+ if result != 0:
+ if ascending:
+ return result
+ else:
+ return -result
+
+ # For subsequent criteria, the order is always ascending
+ for criterion in criteria[1:]:
+ result = cmp(row1[criterion], row2[criterion])
+ if result != 0:
+ return result
+ return 0
+
+ def __sortRows(self, column):
+ """ Sort the rows """
+ if len(self.store) == 0:
+ return
+
+ if self.sortLastCol is not None:
+ self.sortLastCol.set_sort_indicator(False)
+
+ # Find how sorting must be performed
+ if self.sortLastCol == column:
+ self.sortAscending = not self.sortAscending
+ else:
+ self.sortLastCol = column
+ self.sortAscending = True
+
+ # Dump the rows, sort them, and reorder the list
+ rows = [tuple(r) + (i,) for i, r in enumerate(self.store)]
+ criteria = self.sortColCriteria[column]
+ rows.sort(lambda r1, r2: \
+ self.__cmpRows(r1, r2, criteria, self.sortAscending))
+ # FIXME: AttributeError: 'ListStore' object has no attribute 'reorder'
+ # Bug filled upstream:
+ # - https://bugzilla.gnome.org/show_bug.cgi?id=677941
+ # self.store.reorder([r[-1] for r in rows])
+
+ # Move the mark if needed
+ if self.markedRow is not None:
+ self.__findMark()
+
+ column.set_sort_indicator(True)
+ if self.sortAscending:
+ column.set_sort_order(Gtk.SortType.ASCENDING)
+ else:
+ column.set_sort_order(Gtk.SortType.DESCENDING)
+
+ self.emit('extlistview-modified')
+
+ # --== Selection ==--
+
+ def unselectAll(self):
+ """ Unselect all rows """
+ self.selection.unselect_all()
+
+ def selectAll(self):
+ """ Select all rows """
+ self.selection.select_all()
+
+ def getSelectedRowsCount(self):
+ """ Return how many rows are currently selected """
+ return self.selection.count_selected_rows()
+
+ def getSelectedRows(self):
+ """ Return all selected row(s) """
+ return [tuple(self.store[path])[:-1] \
+ for path in self.selection.get_selected_rows()[1]]
+
+ def getFirstSelectedRow(self):
+ """ Return only the first selected row """
+ # TODO: check if this fail on gtk2 version after click on the ListView
+ return tuple(self.store[self.selection.get_selected_rows()[1][0]])[:-1]
+
+ def getFirstSelectedRowIndex(self):
+ """ Return the index of the first selected row """
+ return self.selection.get_selected_rows()[1][0][0]
+
+ def iterSelectedRows(self):
+ """ Iterate on all selected row(s) """
+ for path in self.selection.get_selected_rows()[1]:
+ yield tuple(self.store[path])[:-1]
+
+ # --== Retrieving content / Iterating on content ==--
+
+ def __len__(self):
+ """ Return how many rows are stored in the list """
+ return len(self.store)
+
+ def getCount(self):
+ """ Return how many rows are stored in the list """
+ return len(self.store)
+
+ def getRow(self, rowIndex):
+ """ Return the given row """
+ return tuple(self.store[rowIndex])[:-1]
+
+ def getAllRows(self):
+ """ Return all rows """
+ return [tuple(row)[:-1] for row in self.store]
+
+ def iterAllRows(self):
+ """ Iterate on all rows """
+ for row in self.store:
+ yield tuple(row)[:-1]
+
+ def getItem(self, rowIndex, colIndex):
+ """ Return the value of the given item """
+ return self.store.get_value(self.store.get_iter(rowIndex), colIndex)
+
+ # --== Adding/removing/modifying content ==--
+
+ def clear(self):
+ """ Remove all rows from the list """
+ self.__resetSorting()
+ self.clearMark()
+ self.store.clear()
+ # This fixes the problem of columns sometimes not resizing correctly
+ self.resize_children()
+
+ def setItem(self, rowIndex, colIndex, value):
+ """ Change the value of the given item """
+ # Check if changing that item may change the sorting: if so,
+ # reset sorting
+ if self.sortLastCol is not None and colIndex in \
+ self.sortColCriteria[self.sortLastCol]:
+ self.__resetSorting()
+ self.store.set_value(self.store.get_iter(rowIndex), colIndex, value)
+
+ def removeSelectedRows(self):
+ """ Remove the selected row(s) """
+ self.freeze_child_notify()
+ for iter in self.__getIterOnSelectedRows():
+ # Move the mark if needed
+ if self.markedRow is not None:
+ currentPath = self.store.get_path(iter)[0]
+ if currentPath < self.markedRow:
+ self.markedRow -= 1
+ elif currentPath == self.markedRow:
+ self.markedRow = None
+ # Remove the current row
+ if self.store.remove(iter):
+ self.set_cursor(self.store.get_path(iter))
+ elif len(self.store) != 0:
+ self.set_cursor(len(self.store) - 1)
+ self.thaw_child_notify()
+ if len(self.store) == 0:
+ self.set_cursor(0)
+ self.__resetSorting()
+ # This fixes the problem of columns sometimes not resizing correctly
+ self.resize_children()
+ self.emit('extlistview-modified')
+
+ def cropSelectedRows(self):
+ """ Remove all rows but the selected ones """
+ pathsList = self.selection.get_selected_rows()[1]
+ self.freeze_child_notify()
+ self.selection.select_all()
+ for path in pathsList:
+ self.selection.unselect_path(path)
+ self.removeSelectedRows()
+ self.selection.select_all()
+ self.thaw_child_notify()
+
+ def insertRows(self, rows, position=None):
+ """ Insert or append (if position is None) some rows to the list """
+ if len(rows) == 0:
+ return
+
+ # Insert the additional column used for the mark management
+ if type(rows[0]) is tuple:
+ rows[:] = [row + (False,) for row in rows]
+ else:
+ rows[:] = [row + [False] for row in rows]
+
+ # Move the mark if needed
+ if self.markedRow is not None and position is not None \
+ and position <= self.markedRow:
+ self.markedRow += len(rows)
+
+ # Insert rows
+ self.freeze_child_notify()
+ if position is None:
+ for row in rows:
+ self.store.append(row)
+ else:
+ for row in rows:
+ self.store.insert(position, row)
+ position += 1
+ self.thaw_child_notify()
+ self.__resetSorting()
+ self.emit('extlistview-modified')
+
+ def appendRows(self, rows):
+ """ Helper function, equivalent to insertRows(rows, None) """
+ self.insertRows(rows, None)
+
+ def replaceContent(self, rows):
+ """ Replace the content of the list with the given rows """
+ self.freeze_child_notify()
+ self.set_model(None)
+ self.clear()
+ self.appendRows(rows)
+ self.set_model(self.store)
+ self.thaw_child_notify()
+
+ def shuffle(self):
+ """ Shuffle the content of the list """
+ order = range(len(self.store))
+ random.shuffle(order)
+ self.store.reorder(order)
+
+ # Move the mark if needed
+ if self.markedRow is not None:
+ self.__findMark()
+
+ self.__resetSorting()
+ self.emit('extlistview-modified')
+
+ # --== D'n'D management ==--
+
+ def enableDNDReordering(self):
+ """ Enable the use of Drag'n'Drop to reorder the list """
+ self.dndReordering = True
+ self.dndTargets.append(DND_INTERNAL_TARGET)
+ self.enable_model_drag_dest(self.dndTargets, Gdk.DragAction.DEFAULT)
+
+ def __isDropAfter(self, pos):
+ """ Helper function, True if pos is Gtk.TreeViewDropPosition.AFTER or
+ Gtk.TreeViewDropPosition.INTO_OR_AFTER """
+ return pos == Gtk.TreeViewDropPosition.AFTER or \
+ pos == Gtk.TreeViewDropPosition.INTO_OR_AFTER
+
+ def __moveSelectedRows(self, x, y):
+ """ Internal function used for drag'n'drop """
+ iterList = self.__getIterOnSelectedRows()
+ dropInfo = self.get_dest_row_at_pos(int(x), int(y))
+
+ if dropInfo is None:
+ pos, path = (Gtk.TreeViewDropPosition.INTO_OR_AFTER,
+ len(self.store) - 1)
+ else:
+ pos, path = (dropInfo[1], dropInfo[0][0])
+ if self.__isDropAfter(pos) and path < len(self.store) - 1:
+ pos = Gtk.TreeViewDropPosition.INTO_OR_BEFORE
+ path += 1
+
+ self.freeze_child_notify()
+ for srcIter in iterList:
+ srcPath = self.store.get_path(srcIter)[0]
+
+ if self.__isDropAfter(pos):
+ dstIter = self.store.insert_after(self.store.get_iter(path),
+ self.store[srcIter])
+ else:
+ dstIter = self.store.insert_before(self.store.get_iter(path),
+ self.store[srcIter])
+ if path == srcPath:
+ path += 1
+
+ self.store.remove(srcIter)
+ dstPath = self.store.get_path(dstIter)[0]
+
+ if srcPath > dstPath:
+ path += 1
+
+ if self.markedRow is not None:
+ if srcPath == self.markedRow:
+ self.markedRow = dstPath
+ elif srcPath < self.markedRow and dstPath >= self.markedRow:
+ self.markedRow -= 1
+ elif srcPath > self.markedRow and dstPath <= self.markedRow:
+ self.markedRow += 1
+ self.thaw_child_notify()
+ self.__resetSorting()
+ self.emit('extlistview-modified')
+
+ # --== GTK Handlers ==--
+
+ def onButtonPressed(self, tree, event):
+ """ A mouse button has been pressed """
+ retVal = False
+ pathInfo = self.get_path_at_pos(int(event.x), int(event.y))
+
+ if pathInfo is None:
+ path = None
+ else:
+ path = pathInfo[0]
+
+ if event.button == 1 or event.button == 3:
+ if path is None:
+ # README: this emit the signal: selection-changed and
+ # there is nothing selected so we get an IndexError
+ self.selection.unselect_all()
+ tree.set_cursor(len(self.store))
+ else:
+ if self.dndReordering and self.motionEvtId is None \
+ and event.button == 1:
+ self.dndStartPos = (int(event.x), int(event.y))
+ self.motionEvtId = Gtk.TreeView.connect(self, \
+ 'motion-notify-event', self.onMouseMotion)
+
+ stateClear = not (event.get_state() & \
+ (Gdk.ModifierType.SHIFT_MASK |
+ Gdk.ModifierType.CONTROL_MASK))
+
+ if stateClear and not self.selection.path_is_selected(path):
+ self.selection.unselect_all()
+ self.selection.select_path(path)
+ else:
+ retVal = (stateClear and self.getSelectedRowsCount() > 1 \
+ and self.selection.path_is_selected(path))
+
+ # self.emit('extlistview-button-pressed', event, path)
+
+ return retVal
+
+ def onButtonReleased(self, tree, event):
+ """ A mouse button has been released """
+ if self.motionEvtId is not None:
+ self.disconnect(self.motionEvtId)
+ self.dndContext = None
+ self.motionEvtId = None
+
+ if len(self.dndTargets) != 0:
+ self.enable_model_drag_dest(self.dndTargets,
+ Gdk.DragAction.DEFAULT)
+
+ stateClear = not (event.get_state() & \
+ (Gdk.ModifierType.SHIFT_MASK |
+ Gdk.ModifierType.CONTROL_MASK))
+
+ if stateClear and event.get_state() & Gdk.ModifierType.BUTTON1_MASK \
+ and self.getSelectedRowsCount() > 1:
+ pathInfo = self.get_path_at_pos(int(event.x), int(event.y))
+ if pathInfo is not None:
+ self.selection.unselect_all()
+ self.selection.select_path(pathInfo[0][0])
+
+ def onMouseMotion(self, tree, event):
+ """ The mouse has been moved """
+ if self.dndContext is None and \
+ self.drag_check_threshold(self.dndStartPos[0], self.dndStartPos[1],
+ int(event.x), int(event.y)):
+ self.dndContext = self.drag_begin([DND_INTERNAL_TARGET],
+ Gdk.DragAction.COPY, 1, event)
+
+ def onDragBegin(self, tree, context):
+ """ A drag'n'drop operation has begun """
+ if self.getSelectedRowsCount() == 1:
+ context.set_icon_stock(Gtk.STOCK_DND, 0, 0)
+ else:
+ context.set_icon_stock(Gtk.STOCK_DND_MULTIPLE, 0, 0)
+
+ def onDragDataReceived(self, tree, context, x, y, selection, dndId, time):
+ """ Some data has been dropped into the list """
+ if dndId == DND_REORDERING_ID:
+ self.__moveSelectedRows(x, y)
+ else:
+ self.emit('extlistview-dnd', context, int(x), int(y),
+ selection, dndId, time)
+
+ def onDragMotion(self, tree, context, x, y, time):
+ """ Prevent rows from being dragged *into* other rows
+ (this is a list, not a tree) """
+ drop = self.get_dest_row_at_pos(int(x), int(y))
+
+ if drop is not None and \
+ (drop[1] == Gtk.TreeViewDropPosition.INTO_OR_AFTER or \
+ drop[1] == Gtk.TreeViewDropPosition.INTO_OR_BEFORE):
+ self.enable_model_drag_dest([('invalid-position', 0, -1)],
+ Gdk.DragAction.DEFAULT)
+ else:
+ self.enable_model_drag_dest(self.dndTargets,
+ Gdk.DragAction.DEFAULT)
+
+ def onColumnHeaderClicked(self, column, event):
+ """ A column header has been clicked """
+
+ if event.button == 3:
+ # Create a menu with a CheckMenuItem per column
+ menu = Gtk.Menu()
+
+ # README: it seems like we should use a Palette here
+ # from sugar3.graphics.palette import Palette
+ # menu = Palette('Humitos', text_maxlen=50)
+
+ nbVisibleItems = 0
+ lastVisibleItem = None
+ for column in self.get_columns():
+ item = Gtk.CheckMenuItem(column.get_title())
+ item.set_active(column.get_visible())
+ item.connect('toggled', self.onShowHideColumn, column)
+ item.show()
+ menu.append(item)
+
+ # Count how many columns are visible
+ if item.get_active():
+ nbVisibleItems += 1
+ lastVisibleItem = item
+
+ # Don't allow the user to hide the only visible column left
+ if nbVisibleItems == 1:
+ lastVisibleItem.set_sensitive(False)
+
+ # README: a new argument is needed. Although this is not working
+ # http://developer.gnome.org/gtk3/3.5/GtkMenu.html#gtk-menu-popup
+ menu.popup(None, None, None, None, event.button, event.get_time())
+
+ # FIXME: for some reason this menu.popup call is not
+ # showing the popup
+
+ def onShowHideColumn(self, menuItem, column):
+ """ Switch the visibility of the given column """
+ column.set_visible(not column.get_visible())
+ self.emit('extlistview-column-visibility-changed', \
+ column.get_title(), column.get_visible())
diff --git a/extListview.pyc b/extListview.pyc
new file mode 100644
index 0000000..425e6aa
--- /dev/null
+++ b/extListview.pyc
Binary files differ
diff --git a/feedparser.py b/feedparser.py
new file mode 100644
index 0000000..b9144a9
--- /dev/null
+++ b/feedparser.py
@@ -0,0 +1,3909 @@
+#!/usr/bin/env python
+"""Universal feed parser
+
+Handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds
+
+Visit http://feedparser.org/ for the latest version
+Visit http://feedparser.org/docs/ for the latest documentation
+
+Required: Python 2.4 or later
+Recommended: CJKCodecs and iconv_codec <http://cjkpython.i18n.org/>
+"""
+
+__version__ = "5.0.1"
+__license__ = """Copyright (c) 2002-2008, Mark Pilgrim, All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE."""
+__author__ = "Mark Pilgrim <http://diveintomark.org/>"
+__contributors__ = ["Jason Diamond <http://injektilo.org/>",
+ "John Beimler <http://john.beimler.org/>",
+ "Fazal Majid <http://www.majid.info/mylos/weblog/>",
+ "Aaron Swartz <http://aaronsw.com/>",
+ "Kevin Marks <http://epeus.blogspot.com/>",
+ "Sam Ruby <http://intertwingly.net/>",
+ "Ade Oshineye <http://blog.oshineye.com/>",
+ "Martin Pool <http://sourcefrog.net/>",
+ "Kurt McKee <http://kurtmckee.org/>"]
+_debug = 0
+
+# HTTP "User-Agent" header to send to servers when downloading feeds.
+# If you are embedding feedparser in a larger application, you should
+# change this to your application name and URL.
+USER_AGENT = "UniversalFeedParser/%s +http://feedparser.org/" % __version__
+
+# HTTP "Accept" header to send to servers when downloading feeds. If you don't
+# want to send an Accept header, set this to None.
+ACCEPT_HEADER = "application/atom+xml,application/rdf+xml,application/rss+xml,application/x-netcdf,application/xml;q=0.9,text/xml;q=0.2,*/*;q=0.1"
+
+# List of preferred XML parsers, by SAX driver name. These will be tried first,
+# but if they're not installed, Python will keep searching through its own list
+# of pre-installed parsers until it finds one that supports everything we need.
+PREFERRED_XML_PARSERS = ["drv_libxml2"]
+
+# If you want feedparser to automatically run HTML markup through HTML Tidy, set
+# this to 1. Requires mxTidy <http://www.egenix.com/files/python/mxTidy.html>
+# or utidylib <http://utidylib.berlios.de/>.
+TIDY_MARKUP = 0
+
+# List of Python interfaces for HTML Tidy, in order of preference. Only useful
+# if TIDY_MARKUP = 1
+PREFERRED_TIDY_INTERFACES = ["uTidy", "mxTidy"]
+
+# If you want feedparser to automatically resolve all relative URIs, set this
+# to 1.
+RESOLVE_RELATIVE_URIS = 1
+
+# If you want feedparser to automatically sanitize all potentially unsafe
+# HTML content, set this to 1.
+SANITIZE_HTML = 1
+
+# ---------- Python 3 modules (make it work if possible) ----------
+try:
+ import rfc822
+except ImportError:
+ from email import _parseaddr as rfc822
+
+try:
+ # Python 3.1 introduces bytes.maketrans and simultaneously
+ # deprecates string.maketrans; use bytes.maketrans if possible
+ _maketrans = bytes.maketrans
+except (NameError, AttributeError):
+ import string
+ _maketrans = string.maketrans
+
+# base64 support for Atom feeds that contain embedded binary data
+try:
+ import base64, binascii
+ # Python 3.1 deprecates decodestring in favor of decodebytes
+ _base64decode = getattr(base64, 'decodebytes', base64.decodestring)
+except:
+ base64 = binascii = None
+
+def _s2bytes(s):
+ # Convert a UTF-8 str to bytes if the interpreter is Python 3
+ try:
+ return bytes(s, 'utf8')
+ except (NameError, TypeError):
+ # In Python 2.5 and below, bytes doesn't exist (NameError)
+ # In Python 2.6 and above, bytes and str are the same (TypeError)
+ return s
+
+def _l2bytes(l):
+ # Convert a list of ints to bytes if the interpreter is Python 3
+ try:
+ if bytes is not str:
+ # In Python 2.6 and above, this call won't raise an exception
+ # but it will return bytes([65]) as '[65]' instead of 'A'
+ return bytes(l)
+ raise NameError
+ except NameError:
+ return ''.join(map(chr, l))
+
+# If you want feedparser to allow all URL schemes, set this to ()
+# List culled from Python's urlparse documentation at:
+# http://docs.python.org/library/urlparse.html
+# as well as from "URI scheme" at Wikipedia:
+# https://secure.wikimedia.org/wikipedia/en/wiki/URI_scheme
+# Many more will likely need to be added!
+ACCEPTABLE_URI_SCHEMES = (
+ 'file', 'ftp', 'gopher', 'h323', 'hdl', 'http', 'https', 'imap', 'mailto',
+ 'mms', 'news', 'nntp', 'prospero', 'rsync', 'rtsp', 'rtspu', 'sftp',
+ 'shttp', 'sip', 'sips', 'snews', 'svn', 'svn+ssh', 'telnet', 'wais',
+ # Additional common-but-unofficial schemes
+ 'aim', 'callto', 'cvs', 'facetime', 'feed', 'git', 'gtalk', 'irc', 'ircs',
+ 'irc6', 'itms', 'mms', 'msnim', 'skype', 'ssh', 'smb', 'svn', 'ymsg',
+)
+#ACCEPTABLE_URI_SCHEMES = ()
+
+# ---------- required modules (should come with any Python distribution) ----------
+import sgmllib, re, sys, copy, urlparse, time, types, cgi, urllib, urllib2, datetime
+try:
+ from io import BytesIO as _StringIO
+except ImportError:
+ try:
+ from cStringIO import StringIO as _StringIO
+ except:
+ from StringIO import StringIO as _StringIO
+
+# ---------- optional modules (feedparser will work without these, but with reduced functionality) ----------
+
+# gzip is included with most Python distributions, but may not be available if you compiled your own
+try:
+ import gzip
+except:
+ gzip = None
+try:
+ import zlib
+except:
+ zlib = None
+
+# If a real XML parser is available, feedparser will attempt to use it. feedparser has
+# been tested with the built-in SAX parser, PyXML, and libxml2. On platforms where the
+# Python distribution does not come with an XML parser (such as Mac OS X 10.2 and some
+# versions of FreeBSD), feedparser will quietly fall back on regex-based parsing.
+try:
+ import xml.sax
+ xml.sax.make_parser(PREFERRED_XML_PARSERS) # test for valid parsers
+ from xml.sax.saxutils import escape as _xmlescape
+ _XML_AVAILABLE = 1
+except:
+ _XML_AVAILABLE = 0
+ def _xmlescape(data,entities={}):
+ data = data.replace('&', '&amp;')
+ data = data.replace('>', '&gt;')
+ data = data.replace('<', '&lt;')
+ for char, entity in entities:
+ data = data.replace(char, entity)
+ return data
+
+# cjkcodecs and iconv_codec provide support for more character encodings.
+# Both are available from http://cjkpython.i18n.org/
+try:
+ import cjkcodecs.aliases
+except:
+ pass
+try:
+ import iconv_codec
+except:
+ pass
+
+# chardet library auto-detects character encodings
+# Download from http://chardet.feedparser.org/
+try:
+ import chardet
+ if _debug:
+ import chardet.constants
+ chardet.constants._debug = 1
+except:
+ chardet = None
+
+# reversable htmlentitydefs mappings for Python 2.2
+try:
+ from htmlentitydefs import name2codepoint, codepoint2name
+except:
+ import htmlentitydefs
+ name2codepoint={}
+ codepoint2name={}
+ for (name,codepoint) in htmlentitydefs.entitydefs.iteritems():
+ if codepoint.startswith('&#'): codepoint=unichr(int(codepoint[2:-1]))
+ name2codepoint[name]=ord(codepoint)
+ codepoint2name[ord(codepoint)]=name
+
+# BeautifulSoup parser used for parsing microformats from embedded HTML content
+# http://www.crummy.com/software/BeautifulSoup/
+# feedparser is tested with BeautifulSoup 3.0.x, but it might work with the
+# older 2.x series. If it doesn't, and you can figure out why, I'll accept a
+# patch and modify the compatibility statement accordingly.
+try:
+ import BeautifulSoup
+except:
+ BeautifulSoup = None
+
+# ---------- don't touch these ----------
+class ThingsNobodyCaresAboutButMe(Exception): pass
+class CharacterEncodingOverride(ThingsNobodyCaresAboutButMe): pass
+class CharacterEncodingUnknown(ThingsNobodyCaresAboutButMe): pass
+class NonXMLContentType(ThingsNobodyCaresAboutButMe): pass
+class UndeclaredNamespace(Exception): pass
+
+sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*')
+sgmllib.special = re.compile('<!')
+sgmllib.charref = re.compile('&#(\d+|[xX][0-9a-fA-F]+);')
+
+if sgmllib.endbracket.search(' <').start(0):
+ class EndBracketRegEx:
+ def __init__(self):
+ # Overriding the built-in sgmllib.endbracket regex allows the
+ # parser to find angle brackets embedded in element attributes.
+ self.endbracket = re.compile('''([^'"<>]|"[^"]*"(?=>|/|\s|\w+=)|'[^']*'(?=>|/|\s|\w+=))*(?=[<>])|.*?(?=[<>])''')
+ def search(self,string,index=0):
+ match = self.endbracket.match(string,index)
+ if match is not None:
+ # Returning a new object in the calling thread's context
+ # resolves a thread-safety.
+ return EndBracketMatch(match)
+ return None
+ class EndBracketMatch:
+ def __init__(self, match):
+ self.match = match
+ def start(self, n):
+ return self.match.end(n)
+ sgmllib.endbracket = EndBracketRegEx()
+
+SUPPORTED_VERSIONS = {'': 'unknown',
+ 'rss090': 'RSS 0.90',
+ 'rss091n': 'RSS 0.91 (Netscape)',
+ 'rss091u': 'RSS 0.91 (Userland)',
+ 'rss092': 'RSS 0.92',
+ 'rss093': 'RSS 0.93',
+ 'rss094': 'RSS 0.94',
+ 'rss20': 'RSS 2.0',
+ 'rss10': 'RSS 1.0',
+ 'rss': 'RSS (unknown version)',
+ 'atom01': 'Atom 0.1',
+ 'atom02': 'Atom 0.2',
+ 'atom03': 'Atom 0.3',
+ 'atom10': 'Atom 1.0',
+ 'atom': 'Atom (unknown version)',
+ 'cdf': 'CDF',
+ 'hotrss': 'Hot RSS'
+ }
+
+try:
+ UserDict = dict
+except NameError:
+ # Python 2.1 does not have dict
+ from UserDict import UserDict
+ def dict(aList):
+ rc = {}
+ for k, v in aList:
+ rc[k] = v
+ return rc
+
+class FeedParserDict(UserDict):
+ keymap = {'channel': 'feed',
+ 'items': 'entries',
+ 'guid': 'id',
+ 'date': 'updated',
+ 'date_parsed': 'updated_parsed',
+ 'description': ['summary', 'subtitle'],
+ 'url': ['href'],
+ 'modified': 'updated',
+ 'modified_parsed': 'updated_parsed',
+ 'issued': 'published',
+ 'issued_parsed': 'published_parsed',
+ 'copyright': 'rights',
+ 'copyright_detail': 'rights_detail',
+ 'tagline': 'subtitle',
+ 'tagline_detail': 'subtitle_detail'}
+ def __getitem__(self, key):
+ if key == 'category':
+ return UserDict.__getitem__(self, 'tags')[0]['term']
+ if key == 'enclosures':
+ norel = lambda link: FeedParserDict([(name,value) for (name,value) in link.items() if name!='rel'])
+ return [norel(link) for link in UserDict.__getitem__(self, 'links') if link['rel']=='enclosure']
+ if key == 'license':
+ for link in UserDict.__getitem__(self, 'links'):
+ if link['rel']=='license' and link.has_key('href'):
+ return link['href']
+ if key == 'categories':
+ return [(tag['scheme'], tag['term']) for tag in UserDict.__getitem__(self, 'tags')]
+ realkey = self.keymap.get(key, key)
+ if type(realkey) == types.ListType:
+ for k in realkey:
+ if UserDict.__contains__(self, k):
+ return UserDict.__getitem__(self, k)
+ if UserDict.__contains__(self, key):
+ return UserDict.__getitem__(self, key)
+ return UserDict.__getitem__(self, realkey)
+
+ def __setitem__(self, key, value):
+ for k in self.keymap.keys():
+ if key == k:
+ key = self.keymap[k]
+ if type(key) == types.ListType:
+ key = key[0]
+ return UserDict.__setitem__(self, key, value)
+
+ def get(self, key, default=None):
+ if self.has_key(key):
+ return self[key]
+ else:
+ return default
+
+ def setdefault(self, key, value):
+ if not self.has_key(key):
+ self[key] = value
+ return self[key]
+
+ def has_key(self, key):
+ try:
+ return hasattr(self, key) or UserDict.__contains__(self, key)
+ except AttributeError:
+ return False
+ # This alias prevents the 2to3 tool from changing the semantics of the
+ # __contains__ function below and exhausting the maximum recursion depth
+ __has_key = has_key
+
+ def __getattr__(self, key):
+ try:
+ return self.__dict__[key]
+ except KeyError:
+ pass
+ try:
+ assert not key.startswith('_')
+ return self.__getitem__(key)
+ except:
+ raise AttributeError, "object has no attribute '%s'" % key
+
+ def __setattr__(self, key, value):
+ if key.startswith('_') or key == 'data':
+ self.__dict__[key] = value
+ else:
+ return self.__setitem__(key, value)
+
+ def __contains__(self, key):
+ return self.__has_key(key)
+
+def zopeCompatibilityHack():
+ global FeedParserDict
+ del FeedParserDict
+ def FeedParserDict(aDict=None):
+ rc = {}
+ if aDict:
+ rc.update(aDict)
+ return rc
+
+_ebcdic_to_ascii_map = None
+def _ebcdic_to_ascii(s):
+ global _ebcdic_to_ascii_map
+ if not _ebcdic_to_ascii_map:
+ emap = (
+ 0,1,2,3,156,9,134,127,151,141,142,11,12,13,14,15,
+ 16,17,18,19,157,133,8,135,24,25,146,143,28,29,30,31,
+ 128,129,130,131,132,10,23,27,136,137,138,139,140,5,6,7,
+ 144,145,22,147,148,149,150,4,152,153,154,155,20,21,158,26,
+ 32,160,161,162,163,164,165,166,167,168,91,46,60,40,43,33,
+ 38,169,170,171,172,173,174,175,176,177,93,36,42,41,59,94,
+ 45,47,178,179,180,181,182,183,184,185,124,44,37,95,62,63,
+ 186,187,188,189,190,191,192,193,194,96,58,35,64,39,61,34,
+ 195,97,98,99,100,101,102,103,104,105,196,197,198,199,200,201,
+ 202,106,107,108,109,110,111,112,113,114,203,204,205,206,207,208,
+ 209,126,115,116,117,118,119,120,121,122,210,211,212,213,214,215,
+ 216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,
+ 123,65,66,67,68,69,70,71,72,73,232,233,234,235,236,237,
+ 125,74,75,76,77,78,79,80,81,82,238,239,240,241,242,243,
+ 92,159,83,84,85,86,87,88,89,90,244,245,246,247,248,249,
+ 48,49,50,51,52,53,54,55,56,57,250,251,252,253,254,255
+ )
+ _ebcdic_to_ascii_map = _maketrans( \
+ _l2bytes(range(256)), _l2bytes(emap))
+ return s.translate(_ebcdic_to_ascii_map)
+
+_cp1252 = {
+ unichr(128): unichr(8364), # euro sign
+ unichr(130): unichr(8218), # single low-9 quotation mark
+ unichr(131): unichr( 402), # latin small letter f with hook
+ unichr(132): unichr(8222), # double low-9 quotation mark
+ unichr(133): unichr(8230), # horizontal ellipsis
+ unichr(134): unichr(8224), # dagger
+ unichr(135): unichr(8225), # double dagger
+ unichr(136): unichr( 710), # modifier letter circumflex accent
+ unichr(137): unichr(8240), # per mille sign
+ unichr(138): unichr( 352), # latin capital letter s with caron
+ unichr(139): unichr(8249), # single left-pointing angle quotation mark
+ unichr(140): unichr( 338), # latin capital ligature oe
+ unichr(142): unichr( 381), # latin capital letter z with caron
+ unichr(145): unichr(8216), # left single quotation mark
+ unichr(146): unichr(8217), # right single quotation mark
+ unichr(147): unichr(8220), # left double quotation mark
+ unichr(148): unichr(8221), # right double quotation mark
+ unichr(149): unichr(8226), # bullet
+ unichr(150): unichr(8211), # en dash
+ unichr(151): unichr(8212), # em dash
+ unichr(152): unichr( 732), # small tilde
+ unichr(153): unichr(8482), # trade mark sign
+ unichr(154): unichr( 353), # latin small letter s with caron
+ unichr(155): unichr(8250), # single right-pointing angle quotation mark
+ unichr(156): unichr( 339), # latin small ligature oe
+ unichr(158): unichr( 382), # latin small letter z with caron
+ unichr(159): unichr( 376)} # latin capital letter y with diaeresis
+
+_urifixer = re.compile('^([A-Za-z][A-Za-z0-9+-.]*://)(/*)(.*?)')
+def _urljoin(base, uri):
+ uri = _urifixer.sub(r'\1\3', uri)
+ try:
+ return urlparse.urljoin(base, uri)
+ except:
+ uri = urlparse.urlunparse([urllib.quote(part) for part in urlparse.urlparse(uri)])
+ return urlparse.urljoin(base, uri)
+
+class _FeedParserMixin:
+ namespaces = {'': '',
+ 'http://backend.userland.com/rss': '',
+ 'http://blogs.law.harvard.edu/tech/rss': '',
+ 'http://purl.org/rss/1.0/': '',
+ 'http://my.netscape.com/rdf/simple/0.9/': '',
+ 'http://example.com/newformat#': '',
+ 'http://example.com/necho': '',
+ 'http://purl.org/echo/': '',
+ 'uri/of/echo/namespace#': '',
+ 'http://purl.org/pie/': '',
+ 'http://purl.org/atom/ns#': '',
+ 'http://www.w3.org/2005/Atom': '',
+ 'http://purl.org/rss/1.0/modules/rss091#': '',
+
+ 'http://webns.net/mvcb/': 'admin',
+ 'http://purl.org/rss/1.0/modules/aggregation/': 'ag',
+ 'http://purl.org/rss/1.0/modules/annotate/': 'annotate',
+ 'http://media.tangent.org/rss/1.0/': 'audio',
+ 'http://backend.userland.com/blogChannelModule': 'blogChannel',
+ 'http://web.resource.org/cc/': 'cc',
+ 'http://backend.userland.com/creativeCommonsRssModule': 'creativeCommons',
+ 'http://purl.org/rss/1.0/modules/company': 'co',
+ 'http://purl.org/rss/1.0/modules/content/': 'content',
+ 'http://my.theinfo.org/changed/1.0/rss/': 'cp',
+ 'http://purl.org/dc/elements/1.1/': 'dc',
+ 'http://purl.org/dc/terms/': 'dcterms',
+ 'http://purl.org/rss/1.0/modules/email/': 'email',
+ 'http://purl.org/rss/1.0/modules/event/': 'ev',
+ 'http://rssnamespace.org/feedburner/ext/1.0': 'feedburner',
+ 'http://freshmeat.net/rss/fm/': 'fm',
+ 'http://xmlns.com/foaf/0.1/': 'foaf',
+ 'http://www.w3.org/2003/01/geo/wgs84_pos#': 'geo',
+ 'http://postneo.com/icbm/': 'icbm',
+ 'http://purl.org/rss/1.0/modules/image/': 'image',
+ 'http://www.itunes.com/DTDs/PodCast-1.0.dtd': 'itunes',
+ 'http://example.com/DTDs/PodCast-1.0.dtd': 'itunes',
+ 'http://purl.org/rss/1.0/modules/link/': 'l',
+ 'http://search.yahoo.com/mrss': 'media',
+ #Version 1.1.2 of the Media RSS spec added the trailing slash on the namespace
+ 'http://search.yahoo.com/mrss/': 'media',
+ 'http://madskills.com/public/xml/rss/module/pingback/': 'pingback',
+ 'http://prismstandard.org/namespaces/1.2/basic/': 'prism',
+ 'http://www.w3.org/1999/02/22-rdf-syntax-ns#': 'rdf',
+ 'http://www.w3.org/2000/01/rdf-schema#': 'rdfs',
+ 'http://purl.org/rss/1.0/modules/reference/': 'ref',
+ 'http://purl.org/rss/1.0/modules/richequiv/': 'reqv',
+ 'http://purl.org/rss/1.0/modules/search/': 'search',
+ 'http://purl.org/rss/1.0/modules/slash/': 'slash',
+ 'http://schemas.xmlsoap.org/soap/envelope/': 'soap',
+ 'http://purl.org/rss/1.0/modules/servicestatus/': 'ss',
+ 'http://hacks.benhammersley.com/rss/streaming/': 'str',
+ 'http://purl.org/rss/1.0/modules/subscription/': 'sub',
+ 'http://purl.org/rss/1.0/modules/syndication/': 'sy',
+ 'http://schemas.pocketsoap.com/rss/myDescModule/': 'szf',
+ 'http://purl.org/rss/1.0/modules/taxonomy/': 'taxo',
+ 'http://purl.org/rss/1.0/modules/threading/': 'thr',
+ 'http://purl.org/rss/1.0/modules/textinput/': 'ti',
+ 'http://madskills.com/public/xml/rss/module/trackback/':'trackback',
+ 'http://wellformedweb.org/commentAPI/': 'wfw',
+ 'http://purl.org/rss/1.0/modules/wiki/': 'wiki',
+ 'http://www.w3.org/1999/xhtml': 'xhtml',
+ 'http://www.w3.org/1999/xlink': 'xlink',
+ 'http://www.w3.org/XML/1998/namespace': 'xml'
+}
+ _matchnamespaces = {}
+
+ can_be_relative_uri = ['link', 'id', 'wfw_comment', 'wfw_commentrss', 'docs', 'url', 'href', 'comments', 'icon', 'logo']
+ can_contain_relative_uris = ['content', 'title', 'summary', 'info', 'tagline', 'subtitle', 'copyright', 'rights', 'description']
+ can_contain_dangerous_markup = ['content', 'title', 'summary', 'info', 'tagline', 'subtitle', 'copyright', 'rights', 'description']
+ html_types = ['text/html', 'application/xhtml+xml']
+
+ def __init__(self, baseuri=None, baselang=None, encoding='utf-8'):
+ if _debug: sys.stderr.write('initializing FeedParser\n')
+ if not self._matchnamespaces:
+ for k, v in self.namespaces.items():
+ self._matchnamespaces[k.lower()] = v
+ self.feeddata = FeedParserDict() # feed-level data
+ self.encoding = encoding # character encoding
+ self.entries = [] # list of entry-level data
+ self.version = '' # feed type/version, see SUPPORTED_VERSIONS
+ self.namespacesInUse = {} # dictionary of namespaces defined by the feed
+
+ # the following are used internally to track state;
+ # this is really out of control and should be refactored
+ self.infeed = 0
+ self.inentry = 0
+ self.incontent = 0
+ self.intextinput = 0
+ self.inimage = 0
+ self.inauthor = 0
+ self.incontributor = 0
+ self.inpublisher = 0
+ self.insource = 0
+ self.sourcedata = FeedParserDict()
+ self.contentparams = FeedParserDict()
+ self._summaryKey = None
+ self.namespacemap = {}
+ self.elementstack = []
+ self.basestack = []
+ self.langstack = []
+ self.baseuri = baseuri or ''
+ self.lang = baselang or None
+ self.svgOK = 0
+ self.hasTitle = 0
+ if baselang:
+ self.feeddata['language'] = baselang.replace('_','-')
+
+ def unknown_starttag(self, tag, attrs):
+ if _debug: sys.stderr.write('start %s with %s\n' % (tag, attrs))
+ # normalize attrs
+ attrs = [(k.lower(), v) for k, v in attrs]
+ attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs]
+ # the sgml parser doesn't handle entities in attributes, but
+ # strict xml parsers do -- account for this difference
+ if isinstance(self, _LooseFeedParser):
+ attrs = [(k, v.replace('&amp;', '&')) for k, v in attrs]
+
+ # track xml:base and xml:lang
+ attrsD = dict(attrs)
+ baseuri = attrsD.get('xml:base', attrsD.get('base')) or self.baseuri
+ if type(baseuri) != type(u''):
+ try:
+ baseuri = unicode(baseuri, self.encoding)
+ except:
+ baseuri = unicode(baseuri, 'iso-8859-1')
+ # ensure that self.baseuri is always an absolute URI that
+ # uses a whitelisted URI scheme (e.g. not `javscript:`)
+ if self.baseuri:
+ self.baseuri = _makeSafeAbsoluteURI(self.baseuri, baseuri) or self.baseuri
+ else:
+ self.baseuri = _urljoin(self.baseuri, baseuri)
+ lang = attrsD.get('xml:lang', attrsD.get('lang'))
+ if lang == '':
+ # xml:lang could be explicitly set to '', we need to capture that
+ lang = None
+ elif lang is None:
+ # if no xml:lang is specified, use parent lang
+ lang = self.lang
+ if lang:
+ if tag in ('feed', 'rss', 'rdf:RDF'):
+ self.feeddata['language'] = lang.replace('_','-')
+ self.lang = lang
+ self.basestack.append(self.baseuri)
+ self.langstack.append(lang)
+
+ # track namespaces
+ for prefix, uri in attrs:
+ if prefix.startswith('xmlns:'):
+ self.trackNamespace(prefix[6:], uri)
+ elif prefix == 'xmlns':
+ self.trackNamespace(None, uri)
+
+ # track inline content
+ if self.incontent and self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'):
+ if tag in ['xhtml:div', 'div']: return # typepad does this 10/2007
+ # element declared itself as escaped markup, but it isn't really
+ self.contentparams['type'] = 'application/xhtml+xml'
+ if self.incontent and self.contentparams.get('type') == 'application/xhtml+xml':
+ if tag.find(':') <> -1:
+ prefix, tag = tag.split(':', 1)
+ namespace = self.namespacesInUse.get(prefix, '')
+ if tag=='math' and namespace=='http://www.w3.org/1998/Math/MathML':
+ attrs.append(('xmlns',namespace))
+ if tag=='svg' and namespace=='http://www.w3.org/2000/svg':
+ attrs.append(('xmlns',namespace))
+ if tag == 'svg': self.svgOK += 1
+ return self.handle_data('<%s%s>' % (tag, self.strattrs(attrs)), escape=0)
+
+ # match namespaces
+ if tag.find(':') <> -1:
+ prefix, suffix = tag.split(':', 1)
+ else:
+ prefix, suffix = '', tag
+ prefix = self.namespacemap.get(prefix, prefix)
+ if prefix:
+ prefix = prefix + '_'
+
+ # special hack for better tracking of empty textinput/image elements in illformed feeds
+ if (not prefix) and tag not in ('title', 'link', 'description', 'name'):
+ self.intextinput = 0
+ if (not prefix) and tag not in ('title', 'link', 'description', 'url', 'href', 'width', 'height'):
+ self.inimage = 0
+
+ # call special handler (if defined) or default handler
+ methodname = '_start_' + prefix + suffix
+ try:
+ method = getattr(self, methodname)
+ return method(attrsD)
+ except AttributeError:
+ # Since there's no handler or something has gone wrong we explicitly add the element and its attributes
+ unknown_tag = prefix + suffix
+ if len(attrsD) == 0:
+ # No attributes so merge it into the encosing dictionary
+ return self.push(unknown_tag, 1)
+ else:
+ # Has attributes so create it in its own dictionary
+ context = self._getContext()
+ context[unknown_tag] = attrsD
+
+ def unknown_endtag(self, tag):
+ if _debug: sys.stderr.write('end %s\n' % tag)
+ # match namespaces
+ if tag.find(':') <> -1:
+ prefix, suffix = tag.split(':', 1)
+ else:
+ prefix, suffix = '', tag
+ prefix = self.namespacemap.get(prefix, prefix)
+ if prefix:
+ prefix = prefix + '_'
+ if suffix == 'svg' and self.svgOK: self.svgOK -= 1
+
+ # call special handler (if defined) or default handler
+ methodname = '_end_' + prefix + suffix
+ try:
+ if self.svgOK: raise AttributeError()
+ method = getattr(self, methodname)
+ method()
+ except AttributeError:
+ self.pop(prefix + suffix)
+
+ # track inline content
+ if self.incontent and self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'):
+ # element declared itself as escaped markup, but it isn't really
+ if tag in ['xhtml:div', 'div']: return # typepad does this 10/2007
+ self.contentparams['type'] = 'application/xhtml+xml'
+ if self.incontent and self.contentparams.get('type') == 'application/xhtml+xml':
+ tag = tag.split(':')[-1]
+ self.handle_data('</%s>' % tag, escape=0)
+
+ # track xml:base and xml:lang going out of scope
+ if self.basestack:
+ self.basestack.pop()
+ if self.basestack and self.basestack[-1]:
+ self.baseuri = self.basestack[-1]
+ if self.langstack:
+ self.langstack.pop()
+ if self.langstack: # and (self.langstack[-1] is not None):
+ self.lang = self.langstack[-1]
+
+ def handle_charref(self, ref):
+ # called for each character reference, e.g. for '&#160;', ref will be '160'
+ if not self.elementstack: return
+ ref = ref.lower()
+ if ref in ('34', '38', '39', '60', '62', 'x22', 'x26', 'x27', 'x3c', 'x3e'):
+ text = '&#%s;' % ref
+ else:
+ if ref[0] == 'x':
+ c = int(ref[1:], 16)
+ else:
+ c = int(ref)
+ text = unichr(c).encode('utf-8')
+ self.elementstack[-1][2].append(text)
+
+ def handle_entityref(self, ref):
+ # called for each entity reference, e.g. for '&copy;', ref will be 'copy'
+ if not self.elementstack: return
+ if _debug: sys.stderr.write('entering handle_entityref with %s\n' % ref)
+ if ref in ('lt', 'gt', 'quot', 'amp', 'apos'):
+ text = '&%s;' % ref
+ elif ref in self.entities.keys():
+ text = self.entities[ref]
+ if text.startswith('&#') and text.endswith(';'):
+ return self.handle_entityref(text)
+ else:
+ try: name2codepoint[ref]
+ except KeyError: text = '&%s;' % ref
+ else: text = unichr(name2codepoint[ref]).encode('utf-8')
+ self.elementstack[-1][2].append(text)
+
+ def handle_data(self, text, escape=1):
+ # called for each block of plain text, i.e. outside of any tag and
+ # not containing any character or entity references
+ if not self.elementstack: return
+ if escape and self.contentparams.get('type') == 'application/xhtml+xml':
+ text = _xmlescape(text)
+ self.elementstack[-1][2].append(text)
+
+ def handle_comment(self, text):
+ # called for each comment, e.g. <!-- insert message here -->
+ pass
+
+ def handle_pi(self, text):
+ # called for each processing instruction, e.g. <?instruction>
+ pass
+
+ def handle_decl(self, text):
+ pass
+
+ def parse_declaration(self, i):
+ # override internal declaration handler to handle CDATA blocks
+ if _debug: sys.stderr.write('entering parse_declaration\n')
+ if self.rawdata[i:i+9] == '<![CDATA[':
+ k = self.rawdata.find(']]>', i)
+ if k == -1:
+ # CDATA block began but didn't finish
+ k = len(self.rawdata)
+ return k
+ self.handle_data(_xmlescape(self.rawdata[i+9:k]), 0)
+ return k+3
+ else:
+ k = self.rawdata.find('>', i)
+ if k >= 0:
+ return k+1
+ else:
+ # We have an incomplete CDATA block.
+ return k
+
+ def mapContentType(self, contentType):
+ contentType = contentType.lower()
+ if contentType == 'text' or contentType == 'plain':
+ contentType = 'text/plain'
+ elif contentType == 'html':
+ contentType = 'text/html'
+ elif contentType == 'xhtml':
+ contentType = 'application/xhtml+xml'
+ return contentType
+
+ def trackNamespace(self, prefix, uri):
+ loweruri = uri.lower()
+ if (prefix, loweruri) == (None, 'http://my.netscape.com/rdf/simple/0.9/') and not self.version:
+ self.version = 'rss090'
+ if loweruri == 'http://purl.org/rss/1.0/' and not self.version:
+ self.version = 'rss10'
+ if loweruri == 'http://www.w3.org/2005/atom' and not self.version:
+ self.version = 'atom10'
+ if loweruri.find('backend.userland.com/rss') <> -1:
+ # match any backend.userland.com namespace
+ uri = 'http://backend.userland.com/rss'
+ loweruri = uri
+ if self._matchnamespaces.has_key(loweruri):
+ self.namespacemap[prefix] = self._matchnamespaces[loweruri]
+ self.namespacesInUse[self._matchnamespaces[loweruri]] = uri
+ else:
+ self.namespacesInUse[prefix or ''] = uri
+
+ def resolveURI(self, uri):
+ return _urljoin(self.baseuri or '', uri)
+
+ def decodeEntities(self, element, data):
+ return data
+
+ def strattrs(self, attrs):
+ return ''.join([' %s="%s"' % (t[0],_xmlescape(t[1],{'"':'&quot;'})) for t in attrs])
+
+ def push(self, element, expectingText):
+ self.elementstack.append([element, expectingText, []])
+
+ def pop(self, element, stripWhitespace=1):
+ if not self.elementstack: return
+ if self.elementstack[-1][0] != element: return
+
+ element, expectingText, pieces = self.elementstack.pop()
+
+ if self.version == 'atom10' and self.contentparams.get('type','text') == 'application/xhtml+xml':
+ # remove enclosing child element, but only if it is a <div> and
+ # only if all the remaining content is nested underneath it.
+ # This means that the divs would be retained in the following:
+ # <div>foo</div><div>bar</div>
+ while pieces and len(pieces)>1 and not pieces[-1].strip():
+ del pieces[-1]
+ while pieces and len(pieces)>1 and not pieces[0].strip():
+ del pieces[0]
+ if pieces and (pieces[0] == '<div>' or pieces[0].startswith('<div ')) and pieces[-1]=='</div>':
+ depth = 0
+ for piece in pieces[:-1]:
+ if piece.startswith('</'):
+ depth -= 1
+ if depth == 0: break
+ elif piece.startswith('<') and not piece.endswith('/>'):
+ depth += 1
+ else:
+ pieces = pieces[1:-1]
+
+ # Ensure each piece is a str for Python 3
+ for (i, v) in enumerate(pieces):
+ if not isinstance(v, basestring):
+ pieces[i] = v.decode('utf-8')
+
+ output = ''.join(pieces)
+ if stripWhitespace:
+ output = output.strip()
+ if not expectingText: return output
+
+ # decode base64 content
+ if base64 and self.contentparams.get('base64', 0):
+ try:
+ output = _base64decode(output)
+ except binascii.Error:
+ pass
+ except binascii.Incomplete:
+ pass
+ except TypeError:
+ # In Python 3, base64 takes and outputs bytes, not str
+ # This may not be the most correct way to accomplish this
+ output = _base64decode(output.encode('utf-8')).decode('utf-8')
+
+ # resolve relative URIs
+ if (element in self.can_be_relative_uri) and output:
+ output = self.resolveURI(output)
+
+ # decode entities within embedded markup
+ if not self.contentparams.get('base64', 0):
+ output = self.decodeEntities(element, output)
+
+ if self.lookslikehtml(output):
+ self.contentparams['type']='text/html'
+
+ # remove temporary cruft from contentparams
+ try:
+ del self.contentparams['mode']
+ except KeyError:
+ pass
+ try:
+ del self.contentparams['base64']
+ except KeyError:
+ pass
+
+ is_htmlish = self.mapContentType(self.contentparams.get('type', 'text/html')) in self.html_types
+ # resolve relative URIs within embedded markup
+ if is_htmlish and RESOLVE_RELATIVE_URIS:
+ if element in self.can_contain_relative_uris:
+ output = _resolveRelativeURIs(output, self.baseuri, self.encoding, self.contentparams.get('type', 'text/html'))
+
+ # parse microformats
+ # (must do this before sanitizing because some microformats
+ # rely on elements that we sanitize)
+ if is_htmlish and element in ['content', 'description', 'summary']:
+ mfresults = _parseMicroformats(output, self.baseuri, self.encoding)
+ if mfresults:
+ for tag in mfresults.get('tags', []):
+ self._addTag(tag['term'], tag['scheme'], tag['label'])
+ for enclosure in mfresults.get('enclosures', []):
+ self._start_enclosure(enclosure)
+ for xfn in mfresults.get('xfn', []):
+ self._addXFN(xfn['relationships'], xfn['href'], xfn['name'])
+ vcard = mfresults.get('vcard')
+ if vcard:
+ self._getContext()['vcard'] = vcard
+
+ # sanitize embedded markup
+ if is_htmlish and SANITIZE_HTML:
+ if element in self.can_contain_dangerous_markup:
+ output = _sanitizeHTML(output, self.encoding, self.contentparams.get('type', 'text/html'))
+
+ if self.encoding and type(output) != type(u''):
+ try:
+ output = unicode(output, self.encoding)
+ except:
+ pass
+
+ # address common error where people take data that is already
+ # utf-8, presume that it is iso-8859-1, and re-encode it.
+ if self.encoding in ('utf-8', 'utf-8_INVALID_PYTHON_3') and type(output) == type(u''):
+ try:
+ output = unicode(output.encode('iso-8859-1'), 'utf-8')
+ except:
+ pass
+
+ # map win-1252 extensions to the proper code points
+ if type(output) == type(u''):
+ output = u''.join([c in _cp1252.keys() and _cp1252[c] or c for c in output])
+
+ # categories/tags/keywords/whatever are handled in _end_category
+ if element == 'category':
+ return output
+
+ if element == 'title' and self.hasTitle:
+ return output
+
+ # store output in appropriate place(s)
+ if self.inentry and not self.insource:
+ if element == 'content':
+ self.entries[-1].setdefault(element, [])
+ contentparams = copy.deepcopy(self.contentparams)
+ contentparams['value'] = output
+ self.entries[-1][element].append(contentparams)
+ elif element == 'link':
+ if not self.inimage:
+ # query variables in urls in link elements are improperly
+ # converted from `?a=1&b=2` to `?a=1&b;=2` as if they're
+ # unhandled character references. fix this special case.
+ output = re.sub("&([A-Za-z0-9_]+);", "&\g<1>", output)
+ self.entries[-1][element] = output
+ if output:
+ self.entries[-1]['links'][-1]['href'] = output
+ else:
+ if element == 'description':
+ element = 'summary'
+ self.entries[-1][element] = output
+ if self.incontent:
+ contentparams = copy.deepcopy(self.contentparams)
+ contentparams['value'] = output
+ self.entries[-1][element + '_detail'] = contentparams
+ elif (self.infeed or self.insource):# and (not self.intextinput) and (not self.inimage):
+ context = self._getContext()
+ if element == 'description':
+ element = 'subtitle'
+ context[element] = output
+ if element == 'link':
+ # fix query variables; see above for the explanation
+ output = re.sub("&([A-Za-z0-9_]+);", "&\g<1>", output)
+ context[element] = output
+ context['links'][-1]['href'] = output
+ elif self.incontent:
+ contentparams = copy.deepcopy(self.contentparams)
+ contentparams['value'] = output
+ context[element + '_detail'] = contentparams
+ return output
+
+ def pushContent(self, tag, attrsD, defaultContentType, expectingText):
+ self.incontent += 1
+ if self.lang: self.lang=self.lang.replace('_','-')
+ self.contentparams = FeedParserDict({
+ 'type': self.mapContentType(attrsD.get('type', defaultContentType)),
+ 'language': self.lang,
+ 'base': self.baseuri})
+ self.contentparams['base64'] = self._isBase64(attrsD, self.contentparams)
+ self.push(tag, expectingText)
+
+ def popContent(self, tag):
+ value = self.pop(tag)
+ self.incontent -= 1
+ self.contentparams.clear()
+ return value
+
+ # a number of elements in a number of RSS variants are nominally plain
+ # text, but this is routinely ignored. This is an attempt to detect
+ # the most common cases. As false positives often result in silent
+ # data loss, this function errs on the conservative side.
+ def lookslikehtml(self, s):
+ if self.version.startswith('atom'): return
+ if self.contentparams.get('type','text/html') != 'text/plain': return
+
+ # must have a close tag or a entity reference to qualify
+ if not (re.search(r'</(\w+)>',s) or re.search("&#?\w+;",s)): return
+
+ # all tags must be in a restricted subset of valid HTML tags
+ if filter(lambda t: t.lower() not in _HTMLSanitizer.acceptable_elements,
+ re.findall(r'</?(\w+)',s)): return
+
+ # all entities must have been defined as valid HTML entities
+ from htmlentitydefs import entitydefs
+ if filter(lambda e: e not in entitydefs.keys(),
+ re.findall(r'&(\w+);',s)): return
+
+ return 1
+
+ def _mapToStandardPrefix(self, name):
+ colonpos = name.find(':')
+ if colonpos <> -1:
+ prefix = name[:colonpos]
+ suffix = name[colonpos+1:]
+ prefix = self.namespacemap.get(prefix, prefix)
+ name = prefix + ':' + suffix
+ return name
+
+ def _getAttribute(self, attrsD, name):
+ return attrsD.get(self._mapToStandardPrefix(name))
+
+ def _isBase64(self, attrsD, contentparams):
+ if attrsD.get('mode', '') == 'base64':
+ return 1
+ if self.contentparams['type'].startswith('text/'):
+ return 0
+ if self.contentparams['type'].endswith('+xml'):
+ return 0
+ if self.contentparams['type'].endswith('/xml'):
+ return 0
+ return 1
+
+ def _itsAnHrefDamnIt(self, attrsD):
+ href = attrsD.get('url', attrsD.get('uri', attrsD.get('href', None)))
+ if href:
+ try:
+ del attrsD['url']
+ except KeyError:
+ pass
+ try:
+ del attrsD['uri']
+ except KeyError:
+ pass
+ attrsD['href'] = href
+ return attrsD
+
+ def _save(self, key, value, overwrite=False):
+ context = self._getContext()
+ if overwrite:
+ context[key] = value
+ else:
+ context.setdefault(key, value)
+
+ def _start_rss(self, attrsD):
+ versionmap = {'0.91': 'rss091u',
+ '0.92': 'rss092',
+ '0.93': 'rss093',
+ '0.94': 'rss094'}
+ #If we're here then this is an RSS feed.
+ #If we don't have a version or have a version that starts with something
+ #other than RSS then there's been a mistake. Correct it.
+ if not self.version or not self.version.startswith('rss'):
+ attr_version = attrsD.get('version', '')
+ version = versionmap.get(attr_version)
+ if version:
+ self.version = version
+ elif attr_version.startswith('2.'):
+ self.version = 'rss20'
+ else:
+ self.version = 'rss'
+
+ def _start_dlhottitles(self, attrsD):
+ self.version = 'hotrss'
+
+ def _start_channel(self, attrsD):
+ self.infeed = 1
+ self._cdf_common(attrsD)
+ _start_feedinfo = _start_channel
+
+ def _cdf_common(self, attrsD):
+ if attrsD.has_key('lastmod'):
+ self._start_modified({})
+ self.elementstack[-1][-1] = attrsD['lastmod']
+ self._end_modified()
+ if attrsD.has_key('href'):
+ self._start_link({})
+ self.elementstack[-1][-1] = attrsD['href']
+ self._end_link()
+
+ def _start_feed(self, attrsD):
+ self.infeed = 1
+ versionmap = {'0.1': 'atom01',
+ '0.2': 'atom02',
+ '0.3': 'atom03'}
+ if not self.version:
+ attr_version = attrsD.get('version')
+ version = versionmap.get(attr_version)
+ if version:
+ self.version = version
+ else:
+ self.version = 'atom'
+
+ def _end_channel(self):
+ self.infeed = 0
+ _end_feed = _end_channel
+
+ def _start_image(self, attrsD):
+ context = self._getContext()
+ if not self.inentry:
+ context.setdefault('image', FeedParserDict())
+ self.inimage = 1
+ self.hasTitle = 0
+ self.push('image', 0)
+
+ def _end_image(self):
+ self.pop('image')
+ self.inimage = 0
+
+ def _start_textinput(self, attrsD):
+ context = self._getContext()
+ context.setdefault('textinput', FeedParserDict())
+ self.intextinput = 1
+ self.hasTitle = 0
+ self.push('textinput', 0)
+ _start_textInput = _start_textinput
+
+ def _end_textinput(self):
+ self.pop('textinput')
+ self.intextinput = 0
+ _end_textInput = _end_textinput
+
+ def _start_author(self, attrsD):
+ self.inauthor = 1
+ self.push('author', 1)
+ # Append a new FeedParserDict when expecting an author
+ context = self._getContext()
+ context.setdefault('authors', [])
+ context['authors'].append(FeedParserDict())
+ _start_managingeditor = _start_author
+ _start_dc_author = _start_author
+ _start_dc_creator = _start_author
+ _start_itunes_author = _start_author
+
+ def _end_author(self):
+ self.pop('author')
+ self.inauthor = 0
+ self._sync_author_detail()
+ _end_managingeditor = _end_author
+ _end_dc_author = _end_author
+ _end_dc_creator = _end_author
+ _end_itunes_author = _end_author
+
+ def _start_itunes_owner(self, attrsD):
+ self.inpublisher = 1
+ self.push('publisher', 0)
+
+ def _end_itunes_owner(self):
+ self.pop('publisher')
+ self.inpublisher = 0
+ self._sync_author_detail('publisher')
+
+ def _start_contributor(self, attrsD):
+ self.incontributor = 1
+ context = self._getContext()
+ context.setdefault('contributors', [])
+ context['contributors'].append(FeedParserDict())
+ self.push('contributor', 0)
+
+ def _end_contributor(self):
+ self.pop('contributor')
+ self.incontributor = 0
+
+ def _start_dc_contributor(self, attrsD):
+ self.incontributor = 1
+ context = self._getContext()
+ context.setdefault('contributors', [])
+ context['contributors'].append(FeedParserDict())
+ self.push('name', 0)
+
+ def _end_dc_contributor(self):
+ self._end_name()
+ self.incontributor = 0
+
+ def _start_name(self, attrsD):
+ self.push('name', 0)
+ _start_itunes_name = _start_name
+
+ def _end_name(self):
+ value = self.pop('name')
+ if self.inpublisher:
+ self._save_author('name', value, 'publisher')
+ elif self.inauthor:
+ self._save_author('name', value)
+ elif self.incontributor:
+ self._save_contributor('name', value)
+ elif self.intextinput:
+ context = self._getContext()
+ context['name'] = value
+ _end_itunes_name = _end_name
+
+ def _start_width(self, attrsD):
+ self.push('width', 0)
+
+ def _end_width(self):
+ value = self.pop('width')
+ try:
+ value = int(value)
+ except:
+ value = 0
+ if self.inimage:
+ context = self._getContext()
+ context['width'] = value
+
+ def _start_height(self, attrsD):
+ self.push('height', 0)
+
+ def _end_height(self):
+ value = self.pop('height')
+ try:
+ value = int(value)
+ except:
+ value = 0
+ if self.inimage:
+ context = self._getContext()
+ context['height'] = value
+
+ def _start_url(self, attrsD):
+ self.push('href', 1)
+ _start_homepage = _start_url
+ _start_uri = _start_url
+
+ def _end_url(self):
+ value = self.pop('href')
+ if self.inauthor:
+ self._save_author('href', value)
+ elif self.incontributor:
+ self._save_contributor('href', value)
+ _end_homepage = _end_url
+ _end_uri = _end_url
+
+ def _start_email(self, attrsD):
+ self.push('email', 0)
+ _start_itunes_email = _start_email
+
+ def _end_email(self):
+ value = self.pop('email')
+ if self.inpublisher:
+ self._save_author('email', value, 'publisher')
+ elif self.inauthor:
+ self._save_author('email', value)
+ elif self.incontributor:
+ self._save_contributor('email', value)
+ _end_itunes_email = _end_email
+
+ def _getContext(self):
+ if self.insource:
+ context = self.sourcedata
+ elif self.inimage and self.feeddata.has_key('image'):
+ context = self.feeddata['image']
+ elif self.intextinput:
+ context = self.feeddata['textinput']
+ elif self.inentry:
+ context = self.entries[-1]
+ else:
+ context = self.feeddata
+ return context
+
+ def _save_author(self, key, value, prefix='author'):
+ context = self._getContext()
+ context.setdefault(prefix + '_detail', FeedParserDict())
+ context[prefix + '_detail'][key] = value
+ self._sync_author_detail()
+ context.setdefault('authors', [FeedParserDict()])
+ context['authors'][-1][key] = value
+
+ def _save_contributor(self, key, value):
+ context = self._getContext()
+ context.setdefault('contributors', [FeedParserDict()])
+ context['contributors'][-1][key] = value
+
+ def _sync_author_detail(self, key='author'):
+ context = self._getContext()
+ detail = context.get('%s_detail' % key)
+ if detail:
+ name = detail.get('name')
+ email = detail.get('email')
+ if name and email:
+ context[key] = '%s (%s)' % (name, email)
+ elif name:
+ context[key] = name
+ elif email:
+ context[key] = email
+ else:
+ author, email = context.get(key), None
+ if not author: return
+ emailmatch = re.search(r'''(([a-zA-Z0-9\_\-\.\+]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?))(\?subject=\S+)?''', author)
+ if emailmatch:
+ email = emailmatch.group(0)
+ # probably a better way to do the following, but it passes all the tests
+ author = author.replace(email, '')
+ author = author.replace('()', '')
+ author = author.replace('<>', '')
+ author = author.replace('&lt;&gt;', '')
+ author = author.strip()
+ if author and (author[0] == '('):
+ author = author[1:]
+ if author and (author[-1] == ')'):
+ author = author[:-1]
+ author = author.strip()
+ if author or email:
+ context.setdefault('%s_detail' % key, FeedParserDict())
+ if author:
+ context['%s_detail' % key]['name'] = author
+ if email:
+ context['%s_detail' % key]['email'] = email
+
+ def _start_subtitle(self, attrsD):
+ self.pushContent('subtitle', attrsD, 'text/plain', 1)
+ _start_tagline = _start_subtitle
+ _start_itunes_subtitle = _start_subtitle
+
+ def _end_subtitle(self):
+ self.popContent('subtitle')
+ _end_tagline = _end_subtitle
+ _end_itunes_subtitle = _end_subtitle
+
+ def _start_rights(self, attrsD):
+ self.pushContent('rights', attrsD, 'text/plain', 1)
+ _start_dc_rights = _start_rights
+ _start_copyright = _start_rights
+
+ def _end_rights(self):
+ self.popContent('rights')
+ _end_dc_rights = _end_rights
+ _end_copyright = _end_rights
+
+ def _start_item(self, attrsD):
+ self.entries.append(FeedParserDict())
+ self.push('item', 0)
+ self.inentry = 1
+ self.guidislink = 0
+ self.hasTitle = 0
+ id = self._getAttribute(attrsD, 'rdf:about')
+ if id:
+ context = self._getContext()
+ context['id'] = id
+ self._cdf_common(attrsD)
+ _start_entry = _start_item
+ _start_product = _start_item
+
+ def _end_item(self):
+ self.pop('item')
+ self.inentry = 0
+ _end_entry = _end_item
+
+ def _start_dc_language(self, attrsD):
+ self.push('language', 1)
+ _start_language = _start_dc_language
+
+ def _end_dc_language(self):
+ self.lang = self.pop('language')
+ _end_language = _end_dc_language
+
+ def _start_dc_publisher(self, attrsD):
+ self.push('publisher', 1)
+ _start_webmaster = _start_dc_publisher
+
+ def _end_dc_publisher(self):
+ self.pop('publisher')
+ self._sync_author_detail('publisher')
+ _end_webmaster = _end_dc_publisher
+
+ def _start_published(self, attrsD):
+ self.push('published', 1)
+ _start_dcterms_issued = _start_published
+ _start_issued = _start_published
+
+ def _end_published(self):
+ value = self.pop('published')
+ self._save('published_parsed', _parse_date(value), overwrite=True)
+ _end_dcterms_issued = _end_published
+ _end_issued = _end_published
+
+ def _start_updated(self, attrsD):
+ self.push('updated', 1)
+ _start_modified = _start_updated
+ _start_dcterms_modified = _start_updated
+ _start_pubdate = _start_updated
+ _start_dc_date = _start_updated
+ _start_lastbuilddate = _start_updated
+
+ def _end_updated(self):
+ value = self.pop('updated')
+ parsed_value = _parse_date(value)
+ self._save('updated_parsed', parsed_value, overwrite=True)
+ _end_modified = _end_updated
+ _end_dcterms_modified = _end_updated
+ _end_pubdate = _end_updated
+ _end_dc_date = _end_updated
+ _end_lastbuilddate = _end_updated
+
+ def _start_created(self, attrsD):
+ self.push('created', 1)
+ _start_dcterms_created = _start_created
+
+ def _end_created(self):
+ value = self.pop('created')
+ self._save('created_parsed', _parse_date(value), overwrite=True)
+ _end_dcterms_created = _end_created
+
+ def _start_expirationdate(self, attrsD):
+ self.push('expired', 1)
+
+ def _end_expirationdate(self):
+ self._save('expired_parsed', _parse_date(self.pop('expired')), overwrite=True)
+
+ def _start_cc_license(self, attrsD):
+ context = self._getContext()
+ value = self._getAttribute(attrsD, 'rdf:resource')
+ attrsD = FeedParserDict()
+ attrsD['rel']='license'
+ if value: attrsD['href']=value
+ context.setdefault('links', []).append(attrsD)
+
+ def _start_creativecommons_license(self, attrsD):
+ self.push('license', 1)
+ _start_creativeCommons_license = _start_creativecommons_license
+
+ def _end_creativecommons_license(self):
+ value = self.pop('license')
+ context = self._getContext()
+ attrsD = FeedParserDict()
+ attrsD['rel']='license'
+ if value: attrsD['href']=value
+ context.setdefault('links', []).append(attrsD)
+ del context['license']
+ _end_creativeCommons_license = _end_creativecommons_license
+
+ def _addXFN(self, relationships, href, name):
+ context = self._getContext()
+ xfn = context.setdefault('xfn', [])
+ value = FeedParserDict({'relationships': relationships, 'href': href, 'name': name})
+ if value not in xfn:
+ xfn.append(value)
+
+ def _addTag(self, term, scheme, label):
+ context = self._getContext()
+ tags = context.setdefault('tags', [])
+ if (not term) and (not scheme) and (not label): return
+ value = FeedParserDict({'term': term, 'scheme': scheme, 'label': label})
+ if value not in tags:
+ tags.append(value)
+
+ def _start_category(self, attrsD):
+ if _debug: sys.stderr.write('entering _start_category with %s\n' % repr(attrsD))
+ term = attrsD.get('term')
+ scheme = attrsD.get('scheme', attrsD.get('domain'))
+ label = attrsD.get('label')
+ self._addTag(term, scheme, label)
+ self.push('category', 1)
+ _start_dc_subject = _start_category
+ _start_keywords = _start_category
+
+ def _start_media_category(self, attrsD):
+ attrsD.setdefault('scheme', 'http://search.yahoo.com/mrss/category_schema')
+ self._start_category(attrsD)
+
+ def _end_itunes_keywords(self):
+ for term in self.pop('itunes_keywords').split():
+ self._addTag(term, 'http://www.itunes.com/', None)
+
+ def _start_itunes_category(self, attrsD):
+ self._addTag(attrsD.get('text'), 'http://www.itunes.com/', None)
+ self.push('category', 1)
+
+ def _end_category(self):
+ value = self.pop('category')
+ if not value: return
+ context = self._getContext()
+ tags = context['tags']
+ if value and len(tags) and not tags[-1]['term']:
+ tags[-1]['term'] = value
+ else:
+ self._addTag(value, None, None)
+ _end_dc_subject = _end_category
+ _end_keywords = _end_category
+ _end_itunes_category = _end_category
+ _end_media_category = _end_category
+
+ def _start_cloud(self, attrsD):
+ self._getContext()['cloud'] = FeedParserDict(attrsD)
+
+ def _start_link(self, attrsD):
+ attrsD.setdefault('rel', 'alternate')
+ if attrsD['rel'] == 'self':
+ attrsD.setdefault('type', 'application/atom+xml')
+ else:
+ attrsD.setdefault('type', 'text/html')
+ context = self._getContext()
+ attrsD = self._itsAnHrefDamnIt(attrsD)
+ if attrsD.has_key('href'):
+ attrsD['href'] = self.resolveURI(attrsD['href'])
+ expectingText = self.infeed or self.inentry or self.insource
+ context.setdefault('links', [])
+ if not (self.inentry and self.inimage):
+ context['links'].append(FeedParserDict(attrsD))
+ if attrsD.has_key('href'):
+ expectingText = 0
+ if (attrsD.get('rel') == 'alternate') and (self.mapContentType(attrsD.get('type')) in self.html_types):
+ context['link'] = attrsD['href']
+ else:
+ self.push('link', expectingText)
+ _start_producturl = _start_link
+
+ def _end_link(self):
+ value = self.pop('link')
+ context = self._getContext()
+ _end_producturl = _end_link
+
+ def _start_guid(self, attrsD):
+ self.guidislink = (attrsD.get('ispermalink', 'true') == 'true')
+ self.push('id', 1)
+
+ def _end_guid(self):
+ value = self.pop('id')
+ self._save('guidislink', self.guidislink and not self._getContext().has_key('link'))
+ if self.guidislink:
+ # guid acts as link, but only if 'ispermalink' is not present or is 'true',
+ # and only if the item doesn't already have a link element
+ self._save('link', value)
+
+ def _start_title(self, attrsD):
+ if self.svgOK: return self.unknown_starttag('title', attrsD.items())
+ self.pushContent('title', attrsD, 'text/plain', self.infeed or self.inentry or self.insource)
+ _start_dc_title = _start_title
+ _start_media_title = _start_title
+
+ def _end_title(self):
+ if self.svgOK: return
+ value = self.popContent('title')
+ if not value: return
+ context = self._getContext()
+ self.hasTitle = 1
+ _end_dc_title = _end_title
+
+ def _end_media_title(self):
+ hasTitle = self.hasTitle
+ self._end_title()
+ self.hasTitle = hasTitle
+
+ def _start_description(self, attrsD):
+ context = self._getContext()
+ if context.has_key('summary'):
+ self._summaryKey = 'content'
+ self._start_content(attrsD)
+ else:
+ self.pushContent('description', attrsD, 'text/html', self.infeed or self.inentry or self.insource)
+ _start_dc_description = _start_description
+
+ def _start_abstract(self, attrsD):
+ self.pushContent('description', attrsD, 'text/plain', self.infeed or self.inentry or self.insource)
+
+ def _end_description(self):
+ if self._summaryKey == 'content':
+ self._end_content()
+ else:
+ value = self.popContent('description')
+ self._summaryKey = None
+ _end_abstract = _end_description
+ _end_dc_description = _end_description
+
+ def _start_info(self, attrsD):
+ self.pushContent('info', attrsD, 'text/plain', 1)
+ _start_feedburner_browserfriendly = _start_info
+
+ def _end_info(self):
+ self.popContent('info')
+ _end_feedburner_browserfriendly = _end_info
+
+ def _start_generator(self, attrsD):
+ if attrsD:
+ attrsD = self._itsAnHrefDamnIt(attrsD)
+ if attrsD.has_key('href'):
+ attrsD['href'] = self.resolveURI(attrsD['href'])
+ self._getContext()['generator_detail'] = FeedParserDict(attrsD)
+ self.push('generator', 1)
+
+ def _end_generator(self):
+ value = self.pop('generator')
+ context = self._getContext()
+ if context.has_key('generator_detail'):
+ context['generator_detail']['name'] = value
+
+ def _start_admin_generatoragent(self, attrsD):
+ self.push('generator', 1)
+ value = self._getAttribute(attrsD, 'rdf:resource')
+ if value:
+ self.elementstack[-1][2].append(value)
+ self.pop('generator')
+ self._getContext()['generator_detail'] = FeedParserDict({'href': value})
+
+ def _start_admin_errorreportsto(self, attrsD):
+ self.push('errorreportsto', 1)
+ value = self._getAttribute(attrsD, 'rdf:resource')
+ if value:
+ self.elementstack[-1][2].append(value)
+ self.pop('errorreportsto')
+
+ def _start_summary(self, attrsD):
+ context = self._getContext()
+ if context.has_key('summary'):
+ self._summaryKey = 'content'
+ self._start_content(attrsD)
+ else:
+ self._summaryKey = 'summary'
+ self.pushContent(self._summaryKey, attrsD, 'text/plain', 1)
+ _start_itunes_summary = _start_summary
+
+ def _end_summary(self):
+ if self._summaryKey == 'content':
+ self._end_content()
+ else:
+ self.popContent(self._summaryKey or 'summary')
+ self._summaryKey = None
+ _end_itunes_summary = _end_summary
+
+ def _start_enclosure(self, attrsD):
+ attrsD = self._itsAnHrefDamnIt(attrsD)
+ context = self._getContext()
+ attrsD['rel']='enclosure'
+ context.setdefault('links', []).append(FeedParserDict(attrsD))
+
+ def _start_source(self, attrsD):
+ if 'url' in attrsD:
+ # This means that we're processing a source element from an RSS 2.0 feed
+ self.sourcedata['href'] = attrsD[u'url']
+ self.push('source', 1)
+ self.insource = 1
+ self.hasTitle = 0
+
+ def _end_source(self):
+ self.insource = 0
+ value = self.pop('source')
+ if value:
+ self.sourcedata['title'] = value
+ self._getContext()['source'] = copy.deepcopy(self.sourcedata)
+ self.sourcedata.clear()
+
+ def _start_content(self, attrsD):
+ self.pushContent('content', attrsD, 'text/plain', 1)
+ src = attrsD.get('src')
+ if src:
+ self.contentparams['src'] = src
+ self.push('content', 1)
+
+ def _start_prodlink(self, attrsD):
+ self.pushContent('content', attrsD, 'text/html', 1)
+
+ def _start_body(self, attrsD):
+ self.pushContent('content', attrsD, 'application/xhtml+xml', 1)
+ _start_xhtml_body = _start_body
+
+ def _start_content_encoded(self, attrsD):
+ self.pushContent('content', attrsD, 'text/html', 1)
+ _start_fullitem = _start_content_encoded
+
+ def _end_content(self):
+ copyToSummary = self.mapContentType(self.contentparams.get('type')) in (['text/plain'] + self.html_types)
+ value = self.popContent('content')
+ if copyToSummary:
+ self._save('summary', value)
+
+ _end_body = _end_content
+ _end_xhtml_body = _end_content
+ _end_content_encoded = _end_content
+ _end_fullitem = _end_content
+ _end_prodlink = _end_content
+
+ def _start_itunes_image(self, attrsD):
+ self.push('itunes_image', 0)
+ if attrsD.get('href'):
+ self._getContext()['image'] = FeedParserDict({'href': attrsD.get('href')})
+ _start_itunes_link = _start_itunes_image
+
+ def _end_itunes_block(self):
+ value = self.pop('itunes_block', 0)
+ self._getContext()['itunes_block'] = (value == 'yes') and 1 or 0
+
+ def _end_itunes_explicit(self):
+ value = self.pop('itunes_explicit', 0)
+ # Convert 'yes' -> True, 'clean' to False, and any other value to None
+ # False and None both evaluate as False, so the difference can be ignored
+ # by applications that only need to know if the content is explicit.
+ self._getContext()['itunes_explicit'] = (None, False, True)[(value == 'yes' and 2) or value == 'clean' or 0]
+
+ def _start_media_content(self, attrsD):
+ context = self._getContext()
+ context.setdefault('media_content', [])
+ context['media_content'].append(attrsD)
+
+ def _start_media_thumbnail(self, attrsD):
+ context = self._getContext()
+ context.setdefault('media_thumbnail', [])
+ self.push('url', 1) # new
+ context['media_thumbnail'].append(attrsD)
+
+ def _end_media_thumbnail(self):
+ url = self.pop('url')
+ context = self._getContext()
+ if url != None and len(url.strip()) != 0:
+ if not context['media_thumbnail'][-1].has_key('url'):
+ context['media_thumbnail'][-1]['url'] = url
+
+ def _start_media_player(self, attrsD):
+ self.push('media_player', 0)
+ self._getContext()['media_player'] = FeedParserDict(attrsD)
+
+ def _end_media_player(self):
+ value = self.pop('media_player')
+ context = self._getContext()
+ context['media_player']['content'] = value
+
+ def _start_newlocation(self, attrsD):
+ self.push('newlocation', 1)
+
+ def _end_newlocation(self):
+ url = self.pop('newlocation')
+ context = self._getContext()
+ # don't set newlocation if the context isn't right
+ if context is not self.feeddata:
+ return
+ context['newlocation'] = _makeSafeAbsoluteURI(self.baseuri, url.strip())
+
+if _XML_AVAILABLE:
+ class _StrictFeedParser(_FeedParserMixin, xml.sax.handler.ContentHandler):
+ def __init__(self, baseuri, baselang, encoding):
+ if _debug: sys.stderr.write('trying StrictFeedParser\n')
+ xml.sax.handler.ContentHandler.__init__(self)
+ _FeedParserMixin.__init__(self, baseuri, baselang, encoding)
+ self.bozo = 0
+ self.exc = None
+ self.decls = {}
+
+ def startPrefixMapping(self, prefix, uri):
+ self.trackNamespace(prefix, uri)
+ if uri == 'http://www.w3.org/1999/xlink':
+ self.decls['xmlns:'+prefix] = uri
+
+ def startElementNS(self, name, qname, attrs):
+ namespace, localname = name
+ lowernamespace = str(namespace or '').lower()
+ if lowernamespace.find('backend.userland.com/rss') <> -1:
+ # match any backend.userland.com namespace
+ namespace = 'http://backend.userland.com/rss'
+ lowernamespace = namespace
+ if qname and qname.find(':') > 0:
+ givenprefix = qname.split(':')[0]
+ else:
+ givenprefix = None
+ prefix = self._matchnamespaces.get(lowernamespace, givenprefix)
+ if givenprefix and (prefix == None or (prefix == '' and lowernamespace == '')) and not self.namespacesInUse.has_key(givenprefix):
+ raise UndeclaredNamespace, "'%s' is not associated with a namespace" % givenprefix
+ localname = str(localname).lower()
+
+ # qname implementation is horribly broken in Python 2.1 (it
+ # doesn't report any), and slightly broken in Python 2.2 (it
+ # doesn't report the xml: namespace). So we match up namespaces
+ # with a known list first, and then possibly override them with
+ # the qnames the SAX parser gives us (if indeed it gives us any
+ # at all). Thanks to MatejC for helping me test this and
+ # tirelessly telling me that it didn't work yet.
+ attrsD, self.decls = self.decls, {}
+ if localname=='math' and namespace=='http://www.w3.org/1998/Math/MathML':
+ attrsD['xmlns']=namespace
+ if localname=='svg' and namespace=='http://www.w3.org/2000/svg':
+ attrsD['xmlns']=namespace
+
+ if prefix:
+ localname = prefix.lower() + ':' + localname
+ elif namespace and not qname: #Expat
+ for name,value in self.namespacesInUse.items():
+ if name and value == namespace:
+ localname = name + ':' + localname
+ break
+ if _debug: sys.stderr.write('startElementNS: qname = %s, namespace = %s, givenprefix = %s, prefix = %s, attrs = %s, localname = %s\n' % (qname, namespace, givenprefix, prefix, attrs.items(), localname))
+
+ for (namespace, attrlocalname), attrvalue in attrs._attrs.items():
+ lowernamespace = (namespace or '').lower()
+ prefix = self._matchnamespaces.get(lowernamespace, '')
+ if prefix:
+ attrlocalname = prefix + ':' + attrlocalname
+ attrsD[str(attrlocalname).lower()] = attrvalue
+ for qname in attrs.getQNames():
+ attrsD[str(qname).lower()] = attrs.getValueByQName(qname)
+ self.unknown_starttag(localname, attrsD.items())
+
+ def characters(self, text):
+ self.handle_data(text)
+
+ def endElementNS(self, name, qname):
+ namespace, localname = name
+ lowernamespace = str(namespace or '').lower()
+ if qname and qname.find(':') > 0:
+ givenprefix = qname.split(':')[0]
+ else:
+ givenprefix = ''
+ prefix = self._matchnamespaces.get(lowernamespace, givenprefix)
+ if prefix:
+ localname = prefix + ':' + localname
+ elif namespace and not qname: #Expat
+ for name,value in self.namespacesInUse.items():
+ if name and value == namespace:
+ localname = name + ':' + localname
+ break
+ localname = str(localname).lower()
+ self.unknown_endtag(localname)
+
+ def error(self, exc):
+ self.bozo = 1
+ self.exc = exc
+
+ def fatalError(self, exc):
+ self.error(exc)
+ raise exc
+
+class _BaseHTMLProcessor(sgmllib.SGMLParser):
+ special = re.compile('''[<>'"]''')
+ bare_ampersand = re.compile("&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)")
+ elements_no_end_tag = [
+ 'area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame',
+ 'hr', 'img', 'input', 'isindex', 'keygen', 'link', 'meta', 'param',
+ 'source', 'track', 'wbr'
+ ]
+
+ def __init__(self, encoding, _type):
+ self.encoding = encoding
+ self._type = _type
+ if _debug: sys.stderr.write('entering BaseHTMLProcessor, encoding=%s\n' % self.encoding)
+ sgmllib.SGMLParser.__init__(self)
+
+ def reset(self):
+ self.pieces = []
+ sgmllib.SGMLParser.reset(self)
+
+ def _shorttag_replace(self, match):
+ tag = match.group(1)
+ if tag in self.elements_no_end_tag:
+ return '<' + tag + ' />'
+ else:
+ return '<' + tag + '></' + tag + '>'
+
+ def parse_starttag(self,i):
+ j=sgmllib.SGMLParser.parse_starttag(self, i)
+ if self._type == 'application/xhtml+xml':
+ if j>2 and self.rawdata[j-2:j]=='/>':
+ self.unknown_endtag(self.lasttag)
+ return j
+
+ def feed(self, data):
+ data = re.compile(r'<!((?!DOCTYPE|--|\[))', re.IGNORECASE).sub(r'&lt;!\1', data)
+ #data = re.sub(r'<(\S+?)\s*?/>', self._shorttag_replace, data) # bug [ 1399464 ] Bad regexp for _shorttag_replace
+ data = re.sub(r'<([^<>\s]+?)\s*/>', self._shorttag_replace, data)
+ data = data.replace('&#39;', "'")
+ data = data.replace('&#34;', '"')
+ try:
+ bytes
+ if bytes is str:
+ raise NameError
+ self.encoding = self.encoding + '_INVALID_PYTHON_3'
+ except NameError:
+ if self.encoding and type(data) == type(u''):
+ data = data.encode(self.encoding)
+ sgmllib.SGMLParser.feed(self, data)
+ sgmllib.SGMLParser.close(self)
+
+ def normalize_attrs(self, attrs):
+ if not attrs: return attrs
+ # utility method to be called by descendants
+ attrs = dict([(k.lower(), v) for k, v in attrs]).items()
+ attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs]
+ attrs.sort()
+ return attrs
+
+ def unknown_starttag(self, tag, attrs):
+ # called for each start tag
+ # attrs is a list of (attr, value) tuples
+ # e.g. for <pre class='screen'>, tag='pre', attrs=[('class', 'screen')]
+ if _debug: sys.stderr.write('_BaseHTMLProcessor, unknown_starttag, tag=%s\n' % tag)
+ uattrs = []
+ strattrs=''
+ if attrs:
+ for key, value in attrs:
+ value=value.replace('>','&gt;').replace('<','&lt;').replace('"','&quot;')
+ value = self.bare_ampersand.sub("&amp;", value)
+ # thanks to Kevin Marks for this breathtaking hack to deal with (valid) high-bit attribute values in UTF-8 feeds
+ if type(value) != type(u''):
+ try:
+ value = unicode(value, self.encoding)
+ except:
+ value = unicode(value, 'iso-8859-1')
+ try:
+ # Currently, in Python 3 the key is already a str, and cannot be decoded again
+ uattrs.append((unicode(key, self.encoding), value))
+ except TypeError:
+ uattrs.append((key, value))
+ strattrs = u''.join([u' %s="%s"' % (key, value) for key, value in uattrs])
+ if self.encoding:
+ try:
+ strattrs=strattrs.encode(self.encoding)
+ except:
+ pass
+ if tag in self.elements_no_end_tag:
+ self.pieces.append('<%(tag)s%(strattrs)s />' % locals())
+ else:
+ self.pieces.append('<%(tag)s%(strattrs)s>' % locals())
+
+ def unknown_endtag(self, tag):
+ # called for each end tag, e.g. for </pre>, tag will be 'pre'
+ # Reconstruct the original end tag.
+ if tag not in self.elements_no_end_tag:
+ self.pieces.append("</%(tag)s>" % locals())
+
+ def handle_charref(self, ref):
+ # called for each character reference, e.g. for '&#160;', ref will be '160'
+ # Reconstruct the original character reference.
+ if ref.startswith('x'):
+ value = unichr(int(ref[1:],16))
+ else:
+ value = unichr(int(ref))
+
+ if value in _cp1252.keys():
+ self.pieces.append('&#%s;' % hex(ord(_cp1252[value]))[1:])
+ else:
+ self.pieces.append('&#%(ref)s;' % locals())
+
+ def handle_entityref(self, ref):
+ # called for each entity reference, e.g. for '&copy;', ref will be 'copy'
+ # Reconstruct the original entity reference.
+ if name2codepoint.has_key(ref):
+ self.pieces.append('&%(ref)s;' % locals())
+ else:
+ self.pieces.append('&amp;%(ref)s' % locals())
+
+ def handle_data(self, text):
+ # called for each block of plain text, i.e. outside of any tag and
+ # not containing any character or entity references
+ # Store the original text verbatim.
+ if _debug: sys.stderr.write('_BaseHTMLProcessor, handle_data, text=%s\n' % text)
+ self.pieces.append(text)
+
+ def handle_comment(self, text):
+ # called for each HTML comment, e.g. <!-- insert Javascript code here -->
+ # Reconstruct the original comment.
+ self.pieces.append('<!--%(text)s-->' % locals())
+
+ def handle_pi(self, text):
+ # called for each processing instruction, e.g. <?instruction>
+ # Reconstruct original processing instruction.
+ self.pieces.append('<?%(text)s>' % locals())
+
+ def handle_decl(self, text):
+ # called for the DOCTYPE, if present, e.g.
+ # <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ # "http://www.w3.org/TR/html4/loose.dtd">
+ # Reconstruct original DOCTYPE
+ self.pieces.append('<!%(text)s>' % locals())
+
+ _new_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9:]*\s*').match
+ def _scan_name(self, i, declstartpos):
+ rawdata = self.rawdata
+ n = len(rawdata)
+ if i == n:
+ return None, -1
+ m = self._new_declname_match(rawdata, i)
+ if m:
+ s = m.group()
+ name = s.strip()
+ if (i + len(s)) == n:
+ return None, -1 # end of buffer
+ return name.lower(), m.end()
+ else:
+ self.handle_data(rawdata)
+# self.updatepos(declstartpos, i)
+ return None, -1
+
+ def convert_charref(self, name):
+ return '&#%s;' % name
+
+ def convert_entityref(self, name):
+ return '&%s;' % name
+
+ def output(self):
+ '''Return processed HTML as a single string'''
+ return ''.join([str(p) for p in self.pieces])
+
+ def parse_declaration(self, i):
+ try:
+ return sgmllib.SGMLParser.parse_declaration(self, i)
+ except sgmllib.SGMLParseError:
+ # escape the doctype declaration and continue parsing
+ self.handle_data('&lt;')
+ return i+1
+
+class _LooseFeedParser(_FeedParserMixin, _BaseHTMLProcessor):
+ def __init__(self, baseuri, baselang, encoding, entities):
+ sgmllib.SGMLParser.__init__(self)
+ _FeedParserMixin.__init__(self, baseuri, baselang, encoding)
+ _BaseHTMLProcessor.__init__(self, encoding, 'application/xhtml+xml')
+ self.entities=entities
+
+ def decodeEntities(self, element, data):
+ data = data.replace('&#60;', '&lt;')
+ data = data.replace('&#x3c;', '&lt;')
+ data = data.replace('&#x3C;', '&lt;')
+ data = data.replace('&#62;', '&gt;')
+ data = data.replace('&#x3e;', '&gt;')
+ data = data.replace('&#x3E;', '&gt;')
+ data = data.replace('&#38;', '&amp;')
+ data = data.replace('&#x26;', '&amp;')
+ data = data.replace('&#34;', '&quot;')
+ data = data.replace('&#x22;', '&quot;')
+ data = data.replace('&#39;', '&apos;')
+ data = data.replace('&#x27;', '&apos;')
+ if self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'):
+ data = data.replace('&lt;', '<')
+ data = data.replace('&gt;', '>')
+ data = data.replace('&amp;', '&')
+ data = data.replace('&quot;', '"')
+ data = data.replace('&apos;', "'")
+ return data
+
+ def strattrs(self, attrs):
+ return ''.join([' %s="%s"' % (n,v.replace('"','&quot;')) for n,v in attrs])
+
+class _MicroformatsParser:
+ STRING = 1
+ DATE = 2
+ URI = 3
+ NODE = 4
+ EMAIL = 5
+
+ known_xfn_relationships = ['contact', 'acquaintance', 'friend', 'met', 'co-worker', 'coworker', 'colleague', 'co-resident', 'coresident', 'neighbor', 'child', 'parent', 'sibling', 'brother', 'sister', 'spouse', 'wife', 'husband', 'kin', 'relative', 'muse', 'crush', 'date', 'sweetheart', 'me']
+ known_binary_extensions = ['zip','rar','exe','gz','tar','tgz','tbz2','bz2','z','7z','dmg','img','sit','sitx','hqx','deb','rpm','bz2','jar','rar','iso','bin','msi','mp2','mp3','ogg','ogm','mp4','m4v','m4a','avi','wma','wmv']
+
+ def __init__(self, data, baseuri, encoding):
+ self.document = BeautifulSoup.BeautifulSoup(data)
+ self.baseuri = baseuri
+ self.encoding = encoding
+ if type(data) == type(u''):
+ data = data.encode(encoding)
+ self.tags = []
+ self.enclosures = []
+ self.xfn = []
+ self.vcard = None
+
+ def vcardEscape(self, s):
+ if type(s) in (type(''), type(u'')):
+ s = s.replace(',', '\\,').replace(';', '\\;').replace('\n', '\\n')
+ return s
+
+ def vcardFold(self, s):
+ s = re.sub(';+$', '', s)
+ sFolded = ''
+ iMax = 75
+ sPrefix = ''
+ while len(s) > iMax:
+ sFolded += sPrefix + s[:iMax] + '\n'
+ s = s[iMax:]
+ sPrefix = ' '
+ iMax = 74
+ sFolded += sPrefix + s
+ return sFolded
+
+ def normalize(self, s):
+ return re.sub(r'\s+', ' ', s).strip()
+
+ def unique(self, aList):
+ results = []
+ for element in aList:
+ if element not in results:
+ results.append(element)
+ return results
+
+ def toISO8601(self, dt):
+ return time.strftime('%Y-%m-%dT%H:%M:%SZ', dt)
+
+ def getPropertyValue(self, elmRoot, sProperty, iPropertyType=4, bAllowMultiple=0, bAutoEscape=0):
+ all = lambda x: 1
+ sProperty = sProperty.lower()
+ bFound = 0
+ bNormalize = 1
+ propertyMatch = {'class': re.compile(r'\b%s\b' % sProperty)}
+ if bAllowMultiple and (iPropertyType != self.NODE):
+ snapResults = []
+ containers = elmRoot(['ul', 'ol'], propertyMatch)
+ for container in containers:
+ snapResults.extend(container('li'))
+ bFound = (len(snapResults) != 0)
+ if not bFound:
+ snapResults = elmRoot(all, propertyMatch)
+ bFound = (len(snapResults) != 0)
+ if (not bFound) and (sProperty == 'value'):
+ snapResults = elmRoot('pre')
+ bFound = (len(snapResults) != 0)
+ bNormalize = not bFound
+ if not bFound:
+ snapResults = [elmRoot]
+ bFound = (len(snapResults) != 0)
+ arFilter = []
+ if sProperty == 'vcard':
+ snapFilter = elmRoot(all, propertyMatch)
+ for node in snapFilter:
+ if node.findParent(all, propertyMatch):
+ arFilter.append(node)
+ arResults = []
+ for node in snapResults:
+ if node not in arFilter:
+ arResults.append(node)
+ bFound = (len(arResults) != 0)
+ if not bFound:
+ if bAllowMultiple: return []
+ elif iPropertyType == self.STRING: return ''
+ elif iPropertyType == self.DATE: return None
+ elif iPropertyType == self.URI: return ''
+ elif iPropertyType == self.NODE: return None
+ else: return None
+ arValues = []
+ for elmResult in arResults:
+ sValue = None
+ if iPropertyType == self.NODE:
+ if bAllowMultiple:
+ arValues.append(elmResult)
+ continue
+ else:
+ return elmResult
+ sNodeName = elmResult.name.lower()
+ if (iPropertyType == self.EMAIL) and (sNodeName == 'a'):
+ sValue = (elmResult.get('href') or '').split('mailto:').pop().split('?')[0]
+ if sValue:
+ sValue = bNormalize and self.normalize(sValue) or sValue.strip()
+ if (not sValue) and (sNodeName == 'abbr'):
+ sValue = elmResult.get('title')
+ if sValue:
+ sValue = bNormalize and self.normalize(sValue) or sValue.strip()
+ if (not sValue) and (iPropertyType == self.URI):
+ if sNodeName == 'a': sValue = elmResult.get('href')
+ elif sNodeName == 'img': sValue = elmResult.get('src')
+ elif sNodeName == 'object': sValue = elmResult.get('data')
+ if sValue:
+ sValue = bNormalize and self.normalize(sValue) or sValue.strip()
+ if (not sValue) and (sNodeName == 'img'):
+ sValue = elmResult.get('alt')
+ if sValue:
+ sValue = bNormalize and self.normalize(sValue) or sValue.strip()
+ if not sValue:
+ sValue = elmResult.renderContents()
+ sValue = re.sub(r'<\S[^>]*>', '', sValue)
+ sValue = sValue.replace('\r\n', '\n')
+ sValue = sValue.replace('\r', '\n')
+ if sValue:
+ sValue = bNormalize and self.normalize(sValue) or sValue.strip()
+ if not sValue: continue
+ if iPropertyType == self.DATE:
+ sValue = _parse_date_iso8601(sValue)
+ if bAllowMultiple:
+ arValues.append(bAutoEscape and self.vcardEscape(sValue) or sValue)
+ else:
+ return bAutoEscape and self.vcardEscape(sValue) or sValue
+ return arValues
+
+ def findVCards(self, elmRoot, bAgentParsing=0):
+ sVCards = ''
+
+ if not bAgentParsing:
+ arCards = self.getPropertyValue(elmRoot, 'vcard', bAllowMultiple=1)
+ else:
+ arCards = [elmRoot]
+
+ for elmCard in arCards:
+ arLines = []
+
+ def processSingleString(sProperty):
+ sValue = self.getPropertyValue(elmCard, sProperty, self.STRING, bAutoEscape=1).decode(self.encoding)
+ if sValue:
+ arLines.append(self.vcardFold(sProperty.upper() + ':' + sValue))
+ return sValue or u''
+
+ def processSingleURI(sProperty):
+ sValue = self.getPropertyValue(elmCard, sProperty, self.URI)
+ if sValue:
+ sContentType = ''
+ sEncoding = ''
+ sValueKey = ''
+ if sValue.startswith('data:'):
+ sEncoding = ';ENCODING=b'
+ sContentType = sValue.split(';')[0].split('/').pop()
+ sValue = sValue.split(',', 1).pop()
+ else:
+ elmValue = self.getPropertyValue(elmCard, sProperty)
+ if elmValue:
+ if sProperty != 'url':
+ sValueKey = ';VALUE=uri'
+ sContentType = elmValue.get('type', '').strip().split('/').pop().strip()
+ sContentType = sContentType.upper()
+ if sContentType == 'OCTET-STREAM':
+ sContentType = ''
+ if sContentType:
+ sContentType = ';TYPE=' + sContentType.upper()
+ arLines.append(self.vcardFold(sProperty.upper() + sEncoding + sContentType + sValueKey + ':' + sValue))
+
+ def processTypeValue(sProperty, arDefaultType, arForceType=None):
+ arResults = self.getPropertyValue(elmCard, sProperty, bAllowMultiple=1)
+ for elmResult in arResults:
+ arType = self.getPropertyValue(elmResult, 'type', self.STRING, 1, 1)
+ if arForceType:
+ arType = self.unique(arForceType + arType)
+ if not arType:
+ arType = arDefaultType
+ sValue = self.getPropertyValue(elmResult, 'value', self.EMAIL, 0)
+ if sValue:
+ arLines.append(self.vcardFold(sProperty.upper() + ';TYPE=' + ','.join(arType) + ':' + sValue))
+
+ # AGENT
+ # must do this before all other properties because it is destructive
+ # (removes nested class="vcard" nodes so they don't interfere with
+ # this vcard's other properties)
+ arAgent = self.getPropertyValue(elmCard, 'agent', bAllowMultiple=1)
+ for elmAgent in arAgent:
+ if re.compile(r'\bvcard\b').search(elmAgent.get('class')):
+ sAgentValue = self.findVCards(elmAgent, 1) + '\n'
+ sAgentValue = sAgentValue.replace('\n', '\\n')
+ sAgentValue = sAgentValue.replace(';', '\\;')
+ if sAgentValue:
+ arLines.append(self.vcardFold('AGENT:' + sAgentValue))
+ # Completely remove the agent element from the parse tree
+ elmAgent.extract()
+ else:
+ sAgentValue = self.getPropertyValue(elmAgent, 'value', self.URI, bAutoEscape=1);
+ if sAgentValue:
+ arLines.append(self.vcardFold('AGENT;VALUE=uri:' + sAgentValue))
+
+ # FN (full name)
+ sFN = processSingleString('fn')
+
+ # N (name)
+ elmName = self.getPropertyValue(elmCard, 'n')
+ if elmName:
+ sFamilyName = self.getPropertyValue(elmName, 'family-name', self.STRING, bAutoEscape=1)
+ sGivenName = self.getPropertyValue(elmName, 'given-name', self.STRING, bAutoEscape=1)
+ arAdditionalNames = self.getPropertyValue(elmName, 'additional-name', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'additional-names', self.STRING, 1, 1)
+ arHonorificPrefixes = self.getPropertyValue(elmName, 'honorific-prefix', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'honorific-prefixes', self.STRING, 1, 1)
+ arHonorificSuffixes = self.getPropertyValue(elmName, 'honorific-suffix', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'honorific-suffixes', self.STRING, 1, 1)
+ arLines.append(self.vcardFold('N:' + sFamilyName + ';' +
+ sGivenName + ';' +
+ ','.join(arAdditionalNames) + ';' +
+ ','.join(arHonorificPrefixes) + ';' +
+ ','.join(arHonorificSuffixes)))
+ elif sFN:
+ # implied "N" optimization
+ # http://microformats.org/wiki/hcard#Implied_.22N.22_Optimization
+ arNames = self.normalize(sFN).split()
+ if len(arNames) == 2:
+ bFamilyNameFirst = (arNames[0].endswith(',') or
+ len(arNames[1]) == 1 or
+ ((len(arNames[1]) == 2) and (arNames[1].endswith('.'))))
+ if bFamilyNameFirst:
+ arLines.append(self.vcardFold('N:' + arNames[0] + ';' + arNames[1]))
+ else:
+ arLines.append(self.vcardFold('N:' + arNames[1] + ';' + arNames[0]))
+
+ # SORT-STRING
+ sSortString = self.getPropertyValue(elmCard, 'sort-string', self.STRING, bAutoEscape=1)
+ if sSortString:
+ arLines.append(self.vcardFold('SORT-STRING:' + sSortString))
+
+ # NICKNAME
+ arNickname = self.getPropertyValue(elmCard, 'nickname', self.STRING, 1, 1)
+ if arNickname:
+ arLines.append(self.vcardFold('NICKNAME:' + ','.join(arNickname)))
+
+ # PHOTO
+ processSingleURI('photo')
+
+ # BDAY
+ dtBday = self.getPropertyValue(elmCard, 'bday', self.DATE)
+ if dtBday:
+ arLines.append(self.vcardFold('BDAY:' + self.toISO8601(dtBday)))
+
+ # ADR (address)
+ arAdr = self.getPropertyValue(elmCard, 'adr', bAllowMultiple=1)
+ for elmAdr in arAdr:
+ arType = self.getPropertyValue(elmAdr, 'type', self.STRING, 1, 1)
+ if not arType:
+ arType = ['intl','postal','parcel','work'] # default adr types, see RFC 2426 section 3.2.1
+ sPostOfficeBox = self.getPropertyValue(elmAdr, 'post-office-box', self.STRING, 0, 1)
+ sExtendedAddress = self.getPropertyValue(elmAdr, 'extended-address', self.STRING, 0, 1)
+ sStreetAddress = self.getPropertyValue(elmAdr, 'street-address', self.STRING, 0, 1)
+ sLocality = self.getPropertyValue(elmAdr, 'locality', self.STRING, 0, 1)
+ sRegion = self.getPropertyValue(elmAdr, 'region', self.STRING, 0, 1)
+ sPostalCode = self.getPropertyValue(elmAdr, 'postal-code', self.STRING, 0, 1)
+ sCountryName = self.getPropertyValue(elmAdr, 'country-name', self.STRING, 0, 1)
+ arLines.append(self.vcardFold('ADR;TYPE=' + ','.join(arType) + ':' +
+ sPostOfficeBox + ';' +
+ sExtendedAddress + ';' +
+ sStreetAddress + ';' +
+ sLocality + ';' +
+ sRegion + ';' +
+ sPostalCode + ';' +
+ sCountryName))
+
+ # LABEL
+ processTypeValue('label', ['intl','postal','parcel','work'])
+
+ # TEL (phone number)
+ processTypeValue('tel', ['voice'])
+
+ # EMAIL
+ processTypeValue('email', ['internet'], ['internet'])
+
+ # MAILER
+ processSingleString('mailer')
+
+ # TZ (timezone)
+ processSingleString('tz')
+
+ # GEO (geographical information)
+ elmGeo = self.getPropertyValue(elmCard, 'geo')
+ if elmGeo:
+ sLatitude = self.getPropertyValue(elmGeo, 'latitude', self.STRING, 0, 1)
+ sLongitude = self.getPropertyValue(elmGeo, 'longitude', self.STRING, 0, 1)
+ arLines.append(self.vcardFold('GEO:' + sLatitude + ';' + sLongitude))
+
+ # TITLE
+ processSingleString('title')
+
+ # ROLE
+ processSingleString('role')
+
+ # LOGO
+ processSingleURI('logo')
+
+ # ORG (organization)
+ elmOrg = self.getPropertyValue(elmCard, 'org')
+ if elmOrg:
+ sOrganizationName = self.getPropertyValue(elmOrg, 'organization-name', self.STRING, 0, 1)
+ if not sOrganizationName:
+ # implied "organization-name" optimization
+ # http://microformats.org/wiki/hcard#Implied_.22organization-name.22_Optimization
+ sOrganizationName = self.getPropertyValue(elmCard, 'org', self.STRING, 0, 1)
+ if sOrganizationName:
+ arLines.append(self.vcardFold('ORG:' + sOrganizationName))
+ else:
+ arOrganizationUnit = self.getPropertyValue(elmOrg, 'organization-unit', self.STRING, 1, 1)
+ arLines.append(self.vcardFold('ORG:' + sOrganizationName + ';' + ';'.join(arOrganizationUnit)))
+
+ # CATEGORY
+ arCategory = self.getPropertyValue(elmCard, 'category', self.STRING, 1, 1) + self.getPropertyValue(elmCard, 'categories', self.STRING, 1, 1)
+ if arCategory:
+ arLines.append(self.vcardFold('CATEGORIES:' + ','.join(arCategory)))
+
+ # NOTE
+ processSingleString('note')
+
+ # REV
+ processSingleString('rev')
+
+ # SOUND
+ processSingleURI('sound')
+
+ # UID
+ processSingleString('uid')
+
+ # URL
+ processSingleURI('url')
+
+ # CLASS
+ processSingleString('class')
+
+ # KEY
+ processSingleURI('key')
+
+ if arLines:
+ arLines = [u'BEGIN:vCard',u'VERSION:3.0'] + arLines + [u'END:vCard']
+ sVCards += u'\n'.join(arLines) + u'\n'
+
+ return sVCards.strip()
+
+ def isProbablyDownloadable(self, elm):
+ attrsD = elm.attrMap
+ if not attrsD.has_key('href'): return 0
+ linktype = attrsD.get('type', '').strip()
+ if linktype.startswith('audio/') or \
+ linktype.startswith('video/') or \
+ (linktype.startswith('application/') and not linktype.endswith('xml')):
+ return 1
+ path = urlparse.urlparse(attrsD['href'])[2]
+ if path.find('.') == -1: return 0
+ fileext = path.split('.').pop().lower()
+ return fileext in self.known_binary_extensions
+
+ def findTags(self):
+ all = lambda x: 1
+ for elm in self.document(all, {'rel': re.compile(r'\btag\b')}):
+ href = elm.get('href')
+ if not href: continue
+ urlscheme, domain, path, params, query, fragment = \
+ urlparse.urlparse(_urljoin(self.baseuri, href))
+ segments = path.split('/')
+ tag = segments.pop()
+ if not tag:
+ tag = segments.pop()
+ tagscheme = urlparse.urlunparse((urlscheme, domain, '/'.join(segments), '', '', ''))
+ if not tagscheme.endswith('/'):
+ tagscheme += '/'
+ self.tags.append(FeedParserDict({"term": tag, "scheme": tagscheme, "label": elm.string or ''}))
+
+ def findEnclosures(self):
+ all = lambda x: 1
+ enclosure_match = re.compile(r'\benclosure\b')
+ for elm in self.document(all, {'href': re.compile(r'.+')}):
+ if not enclosure_match.search(elm.get('rel', '')) and not self.isProbablyDownloadable(elm): continue
+ if elm.attrMap not in self.enclosures:
+ self.enclosures.append(elm.attrMap)
+ if elm.string and not elm.get('title'):
+ self.enclosures[-1]['title'] = elm.string
+
+ def findXFN(self):
+ all = lambda x: 1
+ for elm in self.document(all, {'rel': re.compile('.+'), 'href': re.compile('.+')}):
+ rels = elm.get('rel', '').split()
+ xfn_rels = []
+ for rel in rels:
+ if rel in self.known_xfn_relationships:
+ xfn_rels.append(rel)
+ if xfn_rels:
+ self.xfn.append({"relationships": xfn_rels, "href": elm.get('href', ''), "name": elm.string})
+
+def _parseMicroformats(htmlSource, baseURI, encoding):
+ if not BeautifulSoup: return
+ if _debug: sys.stderr.write('entering _parseMicroformats\n')
+ try:
+ p = _MicroformatsParser(htmlSource, baseURI, encoding)
+ except UnicodeEncodeError:
+ # sgmllib throws this exception when performing lookups of tags
+ # with non-ASCII characters in them.
+ return
+ p.vcard = p.findVCards(p.document)
+ p.findTags()
+ p.findEnclosures()
+ p.findXFN()
+ return {"tags": p.tags, "enclosures": p.enclosures, "xfn": p.xfn, "vcard": p.vcard}
+
+class _RelativeURIResolver(_BaseHTMLProcessor):
+ relative_uris = [('a', 'href'),
+ ('applet', 'codebase'),
+ ('area', 'href'),
+ ('blockquote', 'cite'),
+ ('body', 'background'),
+ ('del', 'cite'),
+ ('form', 'action'),
+ ('frame', 'longdesc'),
+ ('frame', 'src'),
+ ('iframe', 'longdesc'),
+ ('iframe', 'src'),
+ ('head', 'profile'),
+ ('img', 'longdesc'),
+ ('img', 'src'),
+ ('img', 'usemap'),
+ ('input', 'src'),
+ ('input', 'usemap'),
+ ('ins', 'cite'),
+ ('link', 'href'),
+ ('object', 'classid'),
+ ('object', 'codebase'),
+ ('object', 'data'),
+ ('object', 'usemap'),
+ ('q', 'cite'),
+ ('script', 'src')]
+
+ def __init__(self, baseuri, encoding, _type):
+ _BaseHTMLProcessor.__init__(self, encoding, _type)
+ self.baseuri = baseuri
+
+ def resolveURI(self, uri):
+ return _makeSafeAbsoluteURI(_urljoin(self.baseuri, uri.strip()))
+
+ def unknown_starttag(self, tag, attrs):
+ if _debug:
+ sys.stderr.write('tag: [%s] with attributes: [%s]\n' % (tag, str(attrs)))
+ attrs = self.normalize_attrs(attrs)
+ attrs = [(key, ((tag, key) in self.relative_uris) and self.resolveURI(value) or value) for key, value in attrs]
+ _BaseHTMLProcessor.unknown_starttag(self, tag, attrs)
+
+def _resolveRelativeURIs(htmlSource, baseURI, encoding, _type):
+ if _debug:
+ sys.stderr.write('entering _resolveRelativeURIs\n')
+
+ p = _RelativeURIResolver(baseURI, encoding, _type)
+ p.feed(htmlSource)
+ return p.output()
+
+def _makeSafeAbsoluteURI(base, rel=None):
+ # bail if ACCEPTABLE_URI_SCHEMES is empty
+ if not ACCEPTABLE_URI_SCHEMES:
+ return _urljoin(base, rel or u'')
+ if not base:
+ return rel or u''
+ if not rel:
+ scheme = urlparse.urlparse(base)[0]
+ if not scheme or scheme in ACCEPTABLE_URI_SCHEMES:
+ return base
+ return u''
+ uri = _urljoin(base, rel)
+ if uri.strip().split(':', 1)[0] not in ACCEPTABLE_URI_SCHEMES:
+ return u''
+ return uri
+
+class _HTMLSanitizer(_BaseHTMLProcessor):
+ acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area',
+ 'article', 'aside', 'audio', 'b', 'big', 'blockquote', 'br', 'button',
+ 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup',
+ 'command', 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn',
+ 'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset',
+ 'figcaption', 'figure', 'footer', 'font', 'form', 'header', 'h1',
+ 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input', 'ins',
+ 'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map', 'menu', 'meter',
+ 'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup', 'option',
+ 'p', 'pre', 'progress', 'q', 's', 'samp', 'section', 'select',
+ 'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong',
+ 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot',
+ 'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'video', 'noscript']
+
+ acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey',
+ 'action', 'align', 'alt', 'autocomplete', 'autofocus', 'axis',
+ 'background', 'balance', 'bgcolor', 'bgproperties', 'border',
+ 'bordercolor', 'bordercolordark', 'bordercolorlight', 'bottompadding',
+ 'cellpadding', 'cellspacing', 'ch', 'challenge', 'char', 'charoff',
+ 'choff', 'charset', 'checked', 'cite', 'class', 'clear', 'color', 'cols',
+ 'colspan', 'compact', 'contenteditable', 'controls', 'coords', 'data',
+ 'datafld', 'datapagesize', 'datasrc', 'datetime', 'default', 'delay',
+ 'dir', 'disabled', 'draggable', 'dynsrc', 'enctype', 'end', 'face', 'for',
+ 'form', 'frame', 'galleryimg', 'gutter', 'headers', 'height', 'hidefocus',
+ 'hidden', 'high', 'href', 'hreflang', 'hspace', 'icon', 'id', 'inputmode',
+ 'ismap', 'keytype', 'label', 'leftspacing', 'lang', 'list', 'longdesc',
+ 'loop', 'loopcount', 'loopend', 'loopstart', 'low', 'lowsrc', 'max',
+ 'maxlength', 'media', 'method', 'min', 'multiple', 'name', 'nohref',
+ 'noshade', 'nowrap', 'open', 'optimum', 'pattern', 'ping', 'point-size',
+ 'prompt', 'pqg', 'radiogroup', 'readonly', 'rel', 'repeat-max',
+ 'repeat-min', 'replace', 'required', 'rev', 'rightspacing', 'rows',
+ 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size', 'span', 'src',
+ 'start', 'step', 'summary', 'suppress', 'tabindex', 'target', 'template',
+ 'title', 'toppadding', 'type', 'unselectable', 'usemap', 'urn', 'valign',
+ 'value', 'variable', 'volume', 'vspace', 'vrml', 'width', 'wrap',
+ 'xml:lang']
+
+ unacceptable_elements_with_end_tag = ['script', 'applet', 'style']
+
+ acceptable_css_properties = ['azimuth', 'background-color',
+ 'border-bottom-color', 'border-collapse', 'border-color',
+ 'border-left-color', 'border-right-color', 'border-top-color', 'clear',
+ 'color', 'cursor', 'direction', 'display', 'elevation', 'float', 'font',
+ 'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight',
+ 'height', 'letter-spacing', 'line-height', 'overflow', 'pause',
+ 'pause-after', 'pause-before', 'pitch', 'pitch-range', 'richness',
+ 'speak', 'speak-header', 'speak-numeral', 'speak-punctuation',
+ 'speech-rate', 'stress', 'text-align', 'text-decoration', 'text-indent',
+ 'unicode-bidi', 'vertical-align', 'voice-family', 'volume',
+ 'white-space', 'width']
+
+ # survey of common keywords found in feeds
+ acceptable_css_keywords = ['auto', 'aqua', 'black', 'block', 'blue',
+ 'bold', 'both', 'bottom', 'brown', 'center', 'collapse', 'dashed',
+ 'dotted', 'fuchsia', 'gray', 'green', '!important', 'italic', 'left',
+ 'lime', 'maroon', 'medium', 'none', 'navy', 'normal', 'nowrap', 'olive',
+ 'pointer', 'purple', 'red', 'right', 'solid', 'silver', 'teal', 'top',
+ 'transparent', 'underline', 'white', 'yellow']
+
+ valid_css_values = re.compile('^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|' +
+ '\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$')
+
+ mathml_elements = ['annotation', 'annotation-xml', 'maction', 'math',
+ 'merror', 'mfenced', 'mfrac', 'mi', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded',
+ 'mphantom', 'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle',
+ 'msub', 'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder',
+ 'munderover', 'none', 'semantics']
+
+ mathml_attributes = ['actiontype', 'align', 'columnalign', 'columnalign',
+ 'columnalign', 'close', 'columnlines', 'columnspacing', 'columnspan', 'depth',
+ 'display', 'displaystyle', 'encoding', 'equalcolumns', 'equalrows',
+ 'fence', 'fontstyle', 'fontweight', 'frame', 'height', 'linethickness',
+ 'lspace', 'mathbackground', 'mathcolor', 'mathvariant', 'mathvariant',
+ 'maxsize', 'minsize', 'open', 'other', 'rowalign', 'rowalign', 'rowalign',
+ 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'scriptlevel', 'selection',
+ 'separator', 'separators', 'stretchy', 'width', 'width', 'xlink:href',
+ 'xlink:show', 'xlink:type', 'xmlns', 'xmlns:xlink']
+
+ # svgtiny - foreignObject + linearGradient + radialGradient + stop
+ svg_elements = ['a', 'animate', 'animateColor', 'animateMotion',
+ 'animateTransform', 'circle', 'defs', 'desc', 'ellipse', 'foreignObject',
+ 'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern',
+ 'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph', 'mpath',
+ 'path', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'stop',
+ 'svg', 'switch', 'text', 'title', 'tspan', 'use']
+
+ # svgtiny + class + opacity + offset + xmlns + xmlns:xlink
+ svg_attributes = ['accent-height', 'accumulate', 'additive', 'alphabetic',
+ 'arabic-form', 'ascent', 'attributeName', 'attributeType',
+ 'baseProfile', 'bbox', 'begin', 'by', 'calcMode', 'cap-height',
+ 'class', 'color', 'color-rendering', 'content', 'cx', 'cy', 'd', 'dx',
+ 'dy', 'descent', 'display', 'dur', 'end', 'fill', 'fill-opacity',
+ 'fill-rule', 'font-family', 'font-size', 'font-stretch', 'font-style',
+ 'font-variant', 'font-weight', 'from', 'fx', 'fy', 'g1', 'g2',
+ 'glyph-name', 'gradientUnits', 'hanging', 'height', 'horiz-adv-x',
+ 'horiz-origin-x', 'id', 'ideographic', 'k', 'keyPoints', 'keySplines',
+ 'keyTimes', 'lang', 'mathematical', 'marker-end', 'marker-mid',
+ 'marker-start', 'markerHeight', 'markerUnits', 'markerWidth', 'max',
+ 'min', 'name', 'offset', 'opacity', 'orient', 'origin',
+ 'overline-position', 'overline-thickness', 'panose-1', 'path',
+ 'pathLength', 'points', 'preserveAspectRatio', 'r', 'refX', 'refY',
+ 'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures',
+ 'restart', 'rotate', 'rx', 'ry', 'slope', 'stemh', 'stemv',
+ 'stop-color', 'stop-opacity', 'strikethrough-position',
+ 'strikethrough-thickness', 'stroke', 'stroke-dasharray',
+ 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin',
+ 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'systemLanguage',
+ 'target', 'text-anchor', 'to', 'transform', 'type', 'u1', 'u2',
+ 'underline-position', 'underline-thickness', 'unicode', 'unicode-range',
+ 'units-per-em', 'values', 'version', 'viewBox', 'visibility', 'width',
+ 'widths', 'x', 'x-height', 'x1', 'x2', 'xlink:actuate', 'xlink:arcrole',
+ 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type',
+ 'xml:base', 'xml:lang', 'xml:space', 'xmlns', 'xmlns:xlink', 'y', 'y1',
+ 'y2', 'zoomAndPan']
+
+ svg_attr_map = None
+ svg_elem_map = None
+
+ acceptable_svg_properties = [ 'fill', 'fill-opacity', 'fill-rule',
+ 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin',
+ 'stroke-opacity']
+
+ def reset(self):
+ _BaseHTMLProcessor.reset(self)
+ self.unacceptablestack = 0
+ self.mathmlOK = 0
+ self.svgOK = 0
+
+ def unknown_starttag(self, tag, attrs):
+ acceptable_attributes = self.acceptable_attributes
+ keymap = {}
+ if not tag in self.acceptable_elements or self.svgOK:
+ if tag in self.unacceptable_elements_with_end_tag:
+ self.unacceptablestack += 1
+
+ # add implicit namespaces to html5 inline svg/mathml
+ if self._type.endswith('html'):
+ if not dict(attrs).get('xmlns'):
+ if tag=='svg':
+ attrs.append( ('xmlns','http://www.w3.org/2000/svg') )
+ if tag=='math':
+ attrs.append( ('xmlns','http://www.w3.org/1998/Math/MathML') )
+
+ # not otherwise acceptable, perhaps it is MathML or SVG?
+ if tag=='math' and ('xmlns','http://www.w3.org/1998/Math/MathML') in attrs:
+ self.mathmlOK += 1
+ if tag=='svg' and ('xmlns','http://www.w3.org/2000/svg') in attrs:
+ self.svgOK += 1
+
+ # chose acceptable attributes based on tag class, else bail
+ if self.mathmlOK and tag in self.mathml_elements:
+ acceptable_attributes = self.mathml_attributes
+ elif self.svgOK and tag in self.svg_elements:
+ # for most vocabularies, lowercasing is a good idea. Many
+ # svg elements, however, are camel case
+ if not self.svg_attr_map:
+ lower=[attr.lower() for attr in self.svg_attributes]
+ mix=[a for a in self.svg_attributes if a not in lower]
+ self.svg_attributes = lower
+ self.svg_attr_map = dict([(a.lower(),a) for a in mix])
+
+ lower=[attr.lower() for attr in self.svg_elements]
+ mix=[a for a in self.svg_elements if a not in lower]
+ self.svg_elements = lower
+ self.svg_elem_map = dict([(a.lower(),a) for a in mix])
+ acceptable_attributes = self.svg_attributes
+ tag = self.svg_elem_map.get(tag,tag)
+ keymap = self.svg_attr_map
+ elif not tag in self.acceptable_elements:
+ return
+
+ # declare xlink namespace, if needed
+ if self.mathmlOK or self.svgOK:
+ if filter(lambda (n,v): n.startswith('xlink:'),attrs):
+ if not ('xmlns:xlink','http://www.w3.org/1999/xlink') in attrs:
+ attrs.append(('xmlns:xlink','http://www.w3.org/1999/xlink'))
+
+ clean_attrs = []
+ for key, value in self.normalize_attrs(attrs):
+ if key in acceptable_attributes:
+ key=keymap.get(key,key)
+ # make sure the uri uses an acceptable uri scheme
+ if key == u'href':
+ value = _makeSafeAbsoluteURI(value)
+ clean_attrs.append((key,value))
+ elif key=='style':
+ clean_value = self.sanitize_style(value)
+ if clean_value: clean_attrs.append((key,clean_value))
+ _BaseHTMLProcessor.unknown_starttag(self, tag, clean_attrs)
+
+ def unknown_endtag(self, tag):
+ if not tag in self.acceptable_elements:
+ if tag in self.unacceptable_elements_with_end_tag:
+ self.unacceptablestack -= 1
+ if self.mathmlOK and tag in self.mathml_elements:
+ if tag == 'math' and self.mathmlOK: self.mathmlOK -= 1
+ elif self.svgOK and tag in self.svg_elements:
+ tag = self.svg_elem_map.get(tag,tag)
+ if tag == 'svg' and self.svgOK: self.svgOK -= 1
+ else:
+ return
+ _BaseHTMLProcessor.unknown_endtag(self, tag)
+
+ def handle_pi(self, text):
+ pass
+
+ def handle_decl(self, text):
+ pass
+
+ def handle_data(self, text):
+ if not self.unacceptablestack:
+ _BaseHTMLProcessor.handle_data(self, text)
+
+ def sanitize_style(self, style):
+ # disallow urls
+ style=re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ',style)
+
+ # gauntlet
+ if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): return ''
+ # This replaced a regexp that used re.match and was prone to pathological back-tracking.
+ if re.sub("\s*[-\w]+\s*:\s*[^:;]*;?", '', style).strip(): return ''
+
+ clean = []
+ for prop,value in re.findall("([-\w]+)\s*:\s*([^:;]*)",style):
+ if not value: continue
+ if prop.lower() in self.acceptable_css_properties:
+ clean.append(prop + ': ' + value + ';')
+ elif prop.split('-')[0].lower() in ['background','border','margin','padding']:
+ for keyword in value.split():
+ if not keyword in self.acceptable_css_keywords and \
+ not self.valid_css_values.match(keyword):
+ break
+ else:
+ clean.append(prop + ': ' + value + ';')
+ elif self.svgOK and prop.lower() in self.acceptable_svg_properties:
+ clean.append(prop + ': ' + value + ';')
+
+ return ' '.join(clean)
+
+ def parse_comment(self, i, report=1):
+ ret = _BaseHTMLProcessor.parse_comment(self, i, report)
+ if ret >= 0:
+ return ret
+ # if ret == -1, this may be a malicious attempt to circumvent
+ # sanitization, or a page-destroying unclosed comment
+ match = re.compile(r'--[^>]*>').search(self.rawdata, i+4)
+ if match:
+ return match.end()
+ # unclosed comment; deliberately fail to handle_data()
+ return len(self.rawdata)
+
+
+def _sanitizeHTML(htmlSource, encoding, _type):
+ p = _HTMLSanitizer(encoding, _type)
+ htmlSource = htmlSource.replace('<![CDATA[', '&lt;![CDATA[')
+ p.feed(htmlSource)
+ data = p.output()
+ if TIDY_MARKUP:
+ # loop through list of preferred Tidy interfaces looking for one that's installed,
+ # then set up a common _tidy function to wrap the interface-specific API.
+ _tidy = None
+ for tidy_interface in PREFERRED_TIDY_INTERFACES:
+ try:
+ if tidy_interface == "uTidy":
+ from tidy import parseString as _utidy
+ def _tidy(data, **kwargs):
+ return str(_utidy(data, **kwargs))
+ break
+ elif tidy_interface == "mxTidy":
+ from mx.Tidy import Tidy as _mxtidy
+ def _tidy(data, **kwargs):
+ nerrors, nwarnings, data, errordata = _mxtidy.tidy(data, **kwargs)
+ return data
+ break
+ except:
+ pass
+ if _tidy:
+ utf8 = type(data) == type(u'')
+ if utf8:
+ data = data.encode('utf-8')
+ data = _tidy(data, output_xhtml=1, numeric_entities=1, wrap=0, char_encoding="utf8")
+ if utf8:
+ data = unicode(data, 'utf-8')
+ if data.count('<body'):
+ data = data.split('<body', 1)[1]
+ if data.count('>'):
+ data = data.split('>', 1)[1]
+ if data.count('</body'):
+ data = data.split('</body', 1)[0]
+ data = data.strip().replace('\r\n', '\n')
+ return data
+
+class _FeedURLHandler(urllib2.HTTPDigestAuthHandler, urllib2.HTTPRedirectHandler, urllib2.HTTPDefaultErrorHandler):
+ def http_error_default(self, req, fp, code, msg, headers):
+ if ((code / 100) == 3) and (code != 304):
+ return self.http_error_302(req, fp, code, msg, headers)
+ infourl = urllib.addinfourl(fp, headers, req.get_full_url())
+ infourl.status = code
+ return infourl
+
+ def http_error_302(self, req, fp, code, msg, headers):
+ if headers.dict.has_key('location'):
+ infourl = urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
+ else:
+ infourl = urllib.addinfourl(fp, headers, req.get_full_url())
+ if not hasattr(infourl, 'status'):
+ infourl.status = code
+ return infourl
+
+ def http_error_301(self, req, fp, code, msg, headers):
+ if headers.dict.has_key('location'):
+ infourl = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp, code, msg, headers)
+ else:
+ infourl = urllib.addinfourl(fp, headers, req.get_full_url())
+ if not hasattr(infourl, 'status'):
+ infourl.status = code
+ return infourl
+
+ http_error_300 = http_error_302
+ http_error_303 = http_error_302
+ http_error_307 = http_error_302
+
+ def http_error_401(self, req, fp, code, msg, headers):
+ # Check if
+ # - server requires digest auth, AND
+ # - we tried (unsuccessfully) with basic auth, AND
+ # - we're using Python 2.3.3 or later (digest auth is irreparably broken in earlier versions)
+ # If all conditions hold, parse authentication information
+ # out of the Authorization header we sent the first time
+ # (for the username and password) and the WWW-Authenticate
+ # header the server sent back (for the realm) and retry
+ # the request with the appropriate digest auth headers instead.
+ # This evil genius hack has been brought to you by Aaron Swartz.
+ host = urlparse.urlparse(req.get_full_url())[1]
+ try:
+ assert sys.version.split()[0] >= '2.3.3'
+ assert base64 != None
+ user, passw = _base64decode(req.headers['Authorization'].split(' ')[1]).split(':')
+ realm = re.findall('realm="([^"]*)"', headers['WWW-Authenticate'])[0]
+ self.add_password(realm, host, user, passw)
+ retry = self.http_error_auth_reqed('www-authenticate', host, req, headers)
+ self.reset_retry_count()
+ return retry
+ except:
+ return self.http_error_default(req, fp, code, msg, headers)
+
+def _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers, request_headers):
+ """URL, filename, or string --> stream
+
+ This function lets you define parsers that take any input source
+ (URL, pathname to local or network file, or actual data as a string)
+ and deal with it in a uniform manner. Returned object is guaranteed
+ to have all the basic stdio read methods (read, readline, readlines).
+ Just .close() the object when you're done with it.
+
+ If the etag argument is supplied, it will be used as the value of an
+ If-None-Match request header.
+
+ If the modified argument is supplied, it can be a tuple of 9 integers
+ (as returned by gmtime() in the standard Python time module) or a date
+ string in any format supported by feedparser. Regardless, it MUST
+ be in GMT (Greenwich Mean Time). It will be reformatted into an
+ RFC 1123-compliant date and used as the value of an If-Modified-Since
+ request header.
+
+ If the agent argument is supplied, it will be used as the value of a
+ User-Agent request header.
+
+ If the referrer argument is supplied, it will be used as the value of a
+ Referer[sic] request header.
+
+ If handlers is supplied, it is a list of handlers used to build a
+ urllib2 opener.
+
+ if request_headers is supplied it is a dictionary of HTTP request headers
+ that will override the values generated by FeedParser.
+ """
+
+ if hasattr(url_file_stream_or_string, 'read'):
+ return url_file_stream_or_string
+
+ if url_file_stream_or_string == '-':
+ return sys.stdin
+
+ if urlparse.urlparse(url_file_stream_or_string)[0] in ('http', 'https', 'ftp', 'file', 'feed'):
+ # Deal with the feed URI scheme
+ if url_file_stream_or_string.startswith('feed:http'):
+ url_file_stream_or_string = url_file_stream_or_string[5:]
+ elif url_file_stream_or_string.startswith('feed:'):
+ url_file_stream_or_string = 'http:' + url_file_stream_or_string[5:]
+ if not agent:
+ agent = USER_AGENT
+ # test for inline user:password for basic auth
+ auth = None
+ if base64:
+ urltype, rest = urllib.splittype(url_file_stream_or_string)
+ realhost, rest = urllib.splithost(rest)
+ if realhost:
+ user_passwd, realhost = urllib.splituser(realhost)
+ if user_passwd:
+ url_file_stream_or_string = '%s://%s%s' % (urltype, realhost, rest)
+ auth = base64.standard_b64encode(user_passwd).strip()
+
+ # iri support
+ try:
+ if isinstance(url_file_stream_or_string,unicode):
+ url_file_stream_or_string = url_file_stream_or_string.encode('idna').decode('utf-8')
+ else:
+ url_file_stream_or_string = url_file_stream_or_string.decode('utf-8').encode('idna').decode('utf-8')
+ except:
+ pass
+
+ # try to open with urllib2 (to use optional headers)
+ request = _build_urllib2_request(url_file_stream_or_string, agent, etag, modified, referrer, auth, request_headers)
+ opener = apply(urllib2.build_opener, tuple(handlers + [_FeedURLHandler()]))
+ opener.addheaders = [] # RMK - must clear so we only send our custom User-Agent
+ try:
+ return opener.open(request)
+ finally:
+ opener.close() # JohnD
+
+ # try to open with native open function (if url_file_stream_or_string is a filename)
+ try:
+ return open(url_file_stream_or_string, 'rb')
+ except:
+ pass
+
+ # treat url_file_stream_or_string as string
+ return _StringIO(str(url_file_stream_or_string))
+
+def _build_urllib2_request(url, agent, etag, modified, referrer, auth, request_headers):
+ request = urllib2.Request(url)
+ request.add_header('User-Agent', agent)
+ if etag:
+ request.add_header('If-None-Match', etag)
+ if type(modified) == type(''):
+ modified = _parse_date(modified)
+ elif isinstance(modified, datetime.datetime):
+ modified = modified.utctimetuple()
+ if modified:
+ # format into an RFC 1123-compliant timestamp. We can't use
+ # time.strftime() since the %a and %b directives can be affected
+ # by the current locale, but RFC 2616 states that dates must be
+ # in English.
+ short_weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+ months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+ request.add_header('If-Modified-Since', '%s, %02d %s %04d %02d:%02d:%02d GMT' % (short_weekdays[modified[6]], modified[2], months[modified[1] - 1], modified[0], modified[3], modified[4], modified[5]))
+ if referrer:
+ request.add_header('Referer', referrer)
+ if gzip and zlib:
+ request.add_header('Accept-encoding', 'gzip, deflate')
+ elif gzip:
+ request.add_header('Accept-encoding', 'gzip')
+ elif zlib:
+ request.add_header('Accept-encoding', 'deflate')
+ else:
+ request.add_header('Accept-encoding', '')
+ if auth:
+ request.add_header('Authorization', 'Basic %s' % auth)
+ if ACCEPT_HEADER:
+ request.add_header('Accept', ACCEPT_HEADER)
+ # use this for whatever -- cookies, special headers, etc
+ # [('Cookie','Something'),('x-special-header','Another Value')]
+ for header_name, header_value in request_headers.items():
+ request.add_header(header_name, header_value)
+ request.add_header('A-IM', 'feed') # RFC 3229 support
+ return request
+
+_date_handlers = []
+def registerDateHandler(func):
+ '''Register a date handler function (takes string, returns 9-tuple date in GMT)'''
+ _date_handlers.insert(0, func)
+
+# ISO-8601 date parsing routines written by Fazal Majid.
+# The ISO 8601 standard is very convoluted and irregular - a full ISO 8601
+# parser is beyond the scope of feedparser and would be a worthwhile addition
+# to the Python library.
+# A single regular expression cannot parse ISO 8601 date formats into groups
+# as the standard is highly irregular (for instance is 030104 2003-01-04 or
+# 0301-04-01), so we use templates instead.
+# Please note the order in templates is significant because we need a
+# greedy match.
+_iso8601_tmpl = ['YYYY-?MM-?DD', 'YYYY-0MM?-?DD', 'YYYY-MM', 'YYYY-?OOO',
+ 'YY-?MM-?DD', 'YY-?OOO', 'YYYY',
+ '-YY-?MM', '-OOO', '-YY',
+ '--MM-?DD', '--MM',
+ '---DD',
+ 'CC', '']
+_iso8601_re = [
+ tmpl.replace(
+ 'YYYY', r'(?P<year>\d{4})').replace(
+ 'YY', r'(?P<year>\d\d)').replace(
+ 'MM', r'(?P<month>[01]\d)').replace(
+ 'DD', r'(?P<day>[0123]\d)').replace(
+ 'OOO', r'(?P<ordinal>[0123]\d\d)').replace(
+ 'CC', r'(?P<century>\d\d$)')
+ + r'(T?(?P<hour>\d{2}):(?P<minute>\d{2})'
+ + r'(:(?P<second>\d{2}))?'
+ + r'(\.(?P<fracsecond>\d+))?'
+ + r'(?P<tz>[+-](?P<tzhour>\d{2})(:(?P<tzmin>\d{2}))?|Z)?)?'
+ for tmpl in _iso8601_tmpl]
+try:
+ del tmpl
+except NameError:
+ pass
+_iso8601_matches = [re.compile(regex).match for regex in _iso8601_re]
+try:
+ del regex
+except NameError:
+ pass
+def _parse_date_iso8601(dateString):
+ '''Parse a variety of ISO-8601-compatible formats like 20040105'''
+ m = None
+ for _iso8601_match in _iso8601_matches:
+ m = _iso8601_match(dateString)
+ if m: break
+ if not m: return
+ if m.span() == (0, 0): return
+ params = m.groupdict()
+ ordinal = params.get('ordinal', 0)
+ if ordinal:
+ ordinal = int(ordinal)
+ else:
+ ordinal = 0
+ year = params.get('year', '--')
+ if not year or year == '--':
+ year = time.gmtime()[0]
+ elif len(year) == 2:
+ # ISO 8601 assumes current century, i.e. 93 -> 2093, NOT 1993
+ year = 100 * int(time.gmtime()[0] / 100) + int(year)
+ else:
+ year = int(year)
+ month = params.get('month', '-')
+ if not month or month == '-':
+ # ordinals are NOT normalized by mktime, we simulate them
+ # by setting month=1, day=ordinal
+ if ordinal:
+ month = 1
+ else:
+ month = time.gmtime()[1]
+ month = int(month)
+ day = params.get('day', 0)
+ if not day:
+ # see above
+ if ordinal:
+ day = ordinal
+ elif params.get('century', 0) or \
+ params.get('year', 0) or params.get('month', 0):
+ day = 1
+ else:
+ day = time.gmtime()[2]
+ else:
+ day = int(day)
+ # special case of the century - is the first year of the 21st century
+ # 2000 or 2001 ? The debate goes on...
+ if 'century' in params.keys():
+ year = (int(params['century']) - 1) * 100 + 1
+ # in ISO 8601 most fields are optional
+ for field in ['hour', 'minute', 'second', 'tzhour', 'tzmin']:
+ if not params.get(field, None):
+ params[field] = 0
+ hour = int(params.get('hour', 0))
+ minute = int(params.get('minute', 0))
+ second = int(float(params.get('second', 0)))
+ # weekday is normalized by mktime(), we can ignore it
+ weekday = 0
+ daylight_savings_flag = -1
+ tm = [year, month, day, hour, minute, second, weekday,
+ ordinal, daylight_savings_flag]
+ # ISO 8601 time zone adjustments
+ tz = params.get('tz')
+ if tz and tz != 'Z':
+ if tz[0] == '-':
+ tm[3] += int(params.get('tzhour', 0))
+ tm[4] += int(params.get('tzmin', 0))
+ elif tz[0] == '+':
+ tm[3] -= int(params.get('tzhour', 0))
+ tm[4] -= int(params.get('tzmin', 0))
+ else:
+ return None
+ # Python's time.mktime() is a wrapper around the ANSI C mktime(3c)
+ # which is guaranteed to normalize d/m/y/h/m/s.
+ # Many implementations have bugs, but we'll pretend they don't.
+ return time.localtime(time.mktime(tuple(tm)))
+registerDateHandler(_parse_date_iso8601)
+
+# 8-bit date handling routines written by ytrewq1.
+_korean_year = u'\ub144' # b3e2 in euc-kr
+_korean_month = u'\uc6d4' # bff9 in euc-kr
+_korean_day = u'\uc77c' # c0cf in euc-kr
+_korean_am = u'\uc624\uc804' # bfc0 c0fc in euc-kr
+_korean_pm = u'\uc624\ud6c4' # bfc0 c8c4 in euc-kr
+
+_korean_onblog_date_re = \
+ re.compile('(\d{4})%s\s+(\d{2})%s\s+(\d{2})%s\s+(\d{2}):(\d{2}):(\d{2})' % \
+ (_korean_year, _korean_month, _korean_day))
+_korean_nate_date_re = \
+ re.compile(u'(\d{4})-(\d{2})-(\d{2})\s+(%s|%s)\s+(\d{,2}):(\d{,2}):(\d{,2})' % \
+ (_korean_am, _korean_pm))
+def _parse_date_onblog(dateString):
+ '''Parse a string according to the OnBlog 8-bit date format'''
+ m = _korean_onblog_date_re.match(dateString)
+ if not m: return
+ w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \
+ {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\
+ 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\
+ 'zonediff': '+09:00'}
+ if _debug: sys.stderr.write('OnBlog date parsed as: %s\n' % w3dtfdate)
+ return _parse_date_w3dtf(w3dtfdate)
+registerDateHandler(_parse_date_onblog)
+
+def _parse_date_nate(dateString):
+ '''Parse a string according to the Nate 8-bit date format'''
+ m = _korean_nate_date_re.match(dateString)
+ if not m: return
+ hour = int(m.group(5))
+ ampm = m.group(4)
+ if (ampm == _korean_pm):
+ hour += 12
+ hour = str(hour)
+ if len(hour) == 1:
+ hour = '0' + hour
+ w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \
+ {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\
+ 'hour': hour, 'minute': m.group(6), 'second': m.group(7),\
+ 'zonediff': '+09:00'}
+ if _debug: sys.stderr.write('Nate date parsed as: %s\n' % w3dtfdate)
+ return _parse_date_w3dtf(w3dtfdate)
+registerDateHandler(_parse_date_nate)
+
+_mssql_date_re = \
+ re.compile('(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})(\.\d+)?')
+def _parse_date_mssql(dateString):
+ '''Parse a string according to the MS SQL date format'''
+ m = _mssql_date_re.match(dateString)
+ if not m: return
+ w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \
+ {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\
+ 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\
+ 'zonediff': '+09:00'}
+ if _debug: sys.stderr.write('MS SQL date parsed as: %s\n' % w3dtfdate)
+ return _parse_date_w3dtf(w3dtfdate)
+registerDateHandler(_parse_date_mssql)
+
+# Unicode strings for Greek date strings
+_greek_months = \
+ { \
+ u'\u0399\u03b1\u03bd': u'Jan', # c9e1ed in iso-8859-7
+ u'\u03a6\u03b5\u03b2': u'Feb', # d6e5e2 in iso-8859-7
+ u'\u039c\u03ac\u03ce': u'Mar', # ccdcfe in iso-8859-7
+ u'\u039c\u03b1\u03ce': u'Mar', # cce1fe in iso-8859-7
+ u'\u0391\u03c0\u03c1': u'Apr', # c1f0f1 in iso-8859-7
+ u'\u039c\u03ac\u03b9': u'May', # ccdce9 in iso-8859-7
+ u'\u039c\u03b1\u03ca': u'May', # cce1fa in iso-8859-7
+ u'\u039c\u03b1\u03b9': u'May', # cce1e9 in iso-8859-7
+ u'\u0399\u03bf\u03cd\u03bd': u'Jun', # c9effded in iso-8859-7
+ u'\u0399\u03bf\u03bd': u'Jun', # c9efed in iso-8859-7
+ u'\u0399\u03bf\u03cd\u03bb': u'Jul', # c9effdeb in iso-8859-7
+ u'\u0399\u03bf\u03bb': u'Jul', # c9f9eb in iso-8859-7
+ u'\u0391\u03cd\u03b3': u'Aug', # c1fde3 in iso-8859-7
+ u'\u0391\u03c5\u03b3': u'Aug', # c1f5e3 in iso-8859-7
+ u'\u03a3\u03b5\u03c0': u'Sep', # d3e5f0 in iso-8859-7
+ u'\u039f\u03ba\u03c4': u'Oct', # cfeaf4 in iso-8859-7
+ u'\u039d\u03bf\u03ad': u'Nov', # cdefdd in iso-8859-7
+ u'\u039d\u03bf\u03b5': u'Nov', # cdefe5 in iso-8859-7
+ u'\u0394\u03b5\u03ba': u'Dec', # c4e5ea in iso-8859-7
+ }
+
+_greek_wdays = \
+ { \
+ u'\u039a\u03c5\u03c1': u'Sun', # caf5f1 in iso-8859-7
+ u'\u0394\u03b5\u03c5': u'Mon', # c4e5f5 in iso-8859-7
+ u'\u03a4\u03c1\u03b9': u'Tue', # d4f1e9 in iso-8859-7
+ u'\u03a4\u03b5\u03c4': u'Wed', # d4e5f4 in iso-8859-7
+ u'\u03a0\u03b5\u03bc': u'Thu', # d0e5ec in iso-8859-7
+ u'\u03a0\u03b1\u03c1': u'Fri', # d0e1f1 in iso-8859-7
+ u'\u03a3\u03b1\u03b2': u'Sat', # d3e1e2 in iso-8859-7
+ }
+
+_greek_date_format_re = \
+ re.compile(u'([^,]+),\s+(\d{2})\s+([^\s]+)\s+(\d{4})\s+(\d{2}):(\d{2}):(\d{2})\s+([^\s]+)')
+
+def _parse_date_greek(dateString):
+ '''Parse a string according to a Greek 8-bit date format.'''
+ m = _greek_date_format_re.match(dateString)
+ if not m: return
+ try:
+ wday = _greek_wdays[m.group(1)]
+ month = _greek_months[m.group(3)]
+ except:
+ return
+ rfc822date = '%(wday)s, %(day)s %(month)s %(year)s %(hour)s:%(minute)s:%(second)s %(zonediff)s' % \
+ {'wday': wday, 'day': m.group(2), 'month': month, 'year': m.group(4),\
+ 'hour': m.group(5), 'minute': m.group(6), 'second': m.group(7),\
+ 'zonediff': m.group(8)}
+ if _debug: sys.stderr.write('Greek date parsed as: %s\n' % rfc822date)
+ return _parse_date_rfc822(rfc822date)
+registerDateHandler(_parse_date_greek)
+
+# Unicode strings for Hungarian date strings
+_hungarian_months = \
+ { \
+ u'janu\u00e1r': u'01', # e1 in iso-8859-2
+ u'febru\u00e1ri': u'02', # e1 in iso-8859-2
+ u'm\u00e1rcius': u'03', # e1 in iso-8859-2
+ u'\u00e1prilis': u'04', # e1 in iso-8859-2
+ u'm\u00e1ujus': u'05', # e1 in iso-8859-2
+ u'j\u00fanius': u'06', # fa in iso-8859-2
+ u'j\u00falius': u'07', # fa in iso-8859-2
+ u'augusztus': u'08',
+ u'szeptember': u'09',
+ u'okt\u00f3ber': u'10', # f3 in iso-8859-2
+ u'november': u'11',
+ u'december': u'12',
+ }
+
+_hungarian_date_format_re = \
+ re.compile(u'(\d{4})-([^-]+)-(\d{,2})T(\d{,2}):(\d{2})((\+|-)(\d{,2}:\d{2}))')
+
+def _parse_date_hungarian(dateString):
+ '''Parse a string according to a Hungarian 8-bit date format.'''
+ m = _hungarian_date_format_re.match(dateString)
+ if not m: return
+ try:
+ month = _hungarian_months[m.group(2)]
+ day = m.group(3)
+ if len(day) == 1:
+ day = '0' + day
+ hour = m.group(4)
+ if len(hour) == 1:
+ hour = '0' + hour
+ except:
+ return
+ w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s%(zonediff)s' % \
+ {'year': m.group(1), 'month': month, 'day': day,\
+ 'hour': hour, 'minute': m.group(5),\
+ 'zonediff': m.group(6)}
+ if _debug: sys.stderr.write('Hungarian date parsed as: %s\n' % w3dtfdate)
+ return _parse_date_w3dtf(w3dtfdate)
+registerDateHandler(_parse_date_hungarian)
+
+# W3DTF-style date parsing adapted from PyXML xml.utils.iso8601, written by
+# Drake and licensed under the Python license. Removed all range checking
+# for month, day, hour, minute, and second, since mktime will normalize
+# these later
+def _parse_date_w3dtf(dateString):
+ def __extract_date(m):
+ year = int(m.group('year'))
+ if year < 100:
+ year = 100 * int(time.gmtime()[0] / 100) + int(year)
+ if year < 1000:
+ return 0, 0, 0
+ julian = m.group('julian')
+ if julian:
+ julian = int(julian)
+ month = julian / 30 + 1
+ day = julian % 30 + 1
+ jday = None
+ while jday != julian:
+ t = time.mktime((year, month, day, 0, 0, 0, 0, 0, 0))
+ jday = time.gmtime(t)[-2]
+ diff = abs(jday - julian)
+ if jday > julian:
+ if diff < day:
+ day = day - diff
+ else:
+ month = month - 1
+ day = 31
+ elif jday < julian:
+ if day + diff < 28:
+ day = day + diff
+ else:
+ month = month + 1
+ return year, month, day
+ month = m.group('month')
+ day = 1
+ if month is None:
+ month = 1
+ else:
+ month = int(month)
+ day = m.group('day')
+ if day:
+ day = int(day)
+ else:
+ day = 1
+ return year, month, day
+
+ def __extract_time(m):
+ if not m:
+ return 0, 0, 0
+ hours = m.group('hours')
+ if not hours:
+ return 0, 0, 0
+ hours = int(hours)
+ minutes = int(m.group('minutes'))
+ seconds = m.group('seconds')
+ if seconds:
+ seconds = int(seconds)
+ else:
+ seconds = 0
+ return hours, minutes, seconds
+
+ def __extract_tzd(m):
+ '''Return the Time Zone Designator as an offset in seconds from UTC.'''
+ if not m:
+ return 0
+ tzd = m.group('tzd')
+ if not tzd:
+ return 0
+ if tzd == 'Z':
+ return 0
+ hours = int(m.group('tzdhours'))
+ minutes = m.group('tzdminutes')
+ if minutes:
+ minutes = int(minutes)
+ else:
+ minutes = 0
+ offset = (hours*60 + minutes) * 60
+ if tzd[0] == '+':
+ return -offset
+ return offset
+
+ __date_re = ('(?P<year>\d\d\d\d)'
+ '(?:(?P<dsep>-|)'
+ '(?:(?P<month>\d\d)(?:(?P=dsep)(?P<day>\d\d))?'
+ '|(?P<julian>\d\d\d)))?')
+ __tzd_re = '(?P<tzd>[-+](?P<tzdhours>\d\d)(?::?(?P<tzdminutes>\d\d))|Z)'
+ __tzd_rx = re.compile(__tzd_re)
+ __time_re = ('(?P<hours>\d\d)(?P<tsep>:|)(?P<minutes>\d\d)'
+ '(?:(?P=tsep)(?P<seconds>\d\d)(?:[.,]\d+)?)?'
+ + __tzd_re)
+ __datetime_re = '%s(?:T%s)?' % (__date_re, __time_re)
+ __datetime_rx = re.compile(__datetime_re)
+ m = __datetime_rx.match(dateString)
+ if (m is None) or (m.group() != dateString): return
+ gmt = __extract_date(m) + __extract_time(m) + (0, 0, 0)
+ if gmt[0] == 0: return
+ return time.gmtime(time.mktime(gmt) + __extract_tzd(m) - time.timezone)
+registerDateHandler(_parse_date_w3dtf)
+
+def _parse_date_rfc822(dateString):
+ '''Parse an RFC822, RFC1123, RFC2822, or asctime-style date'''
+ data = dateString.split()
+ if data[0][-1] in (',', '.') or data[0].lower() in rfc822._daynames:
+ del data[0]
+ if len(data) == 4:
+ s = data[3]
+ i = s.find('+')
+ if i > 0:
+ data[3:] = [s[:i], s[i+1:]]
+ else:
+ data.append('')
+ dateString = " ".join(data)
+ # Account for the Etc/GMT timezone by stripping 'Etc/'
+ elif len(data) == 5 and data[4].lower().startswith('etc/'):
+ data[4] = data[4][4:]
+ dateString = " ".join(data)
+ if len(data) < 5:
+ dateString += ' 00:00:00 GMT'
+ tm = rfc822.parsedate_tz(dateString)
+ if tm:
+ return time.gmtime(rfc822.mktime_tz(tm))
+# rfc822.py defines several time zones, but we define some extra ones.
+# 'ET' is equivalent to 'EST', etc.
+_additional_timezones = {'AT': -400, 'ET': -500, 'CT': -600, 'MT': -700, 'PT': -800}
+rfc822._timezones.update(_additional_timezones)
+registerDateHandler(_parse_date_rfc822)
+
+def _parse_date_perforce(aDateString):
+ """parse a date in yyyy/mm/dd hh:mm:ss TTT format"""
+ # Fri, 2006/09/15 08:19:53 EDT
+ _my_date_pattern = re.compile( \
+ r'(\w{,3}), (\d{,4})/(\d{,2})/(\d{2}) (\d{,2}):(\d{2}):(\d{2}) (\w{,3})')
+
+ dow, year, month, day, hour, minute, second, tz = \
+ _my_date_pattern.search(aDateString).groups()
+ months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+ dateString = "%s, %s %s %s %s:%s:%s %s" % (dow, day, months[int(month) - 1], year, hour, minute, second, tz)
+ tm = rfc822.parsedate_tz(dateString)
+ if tm:
+ return time.gmtime(rfc822.mktime_tz(tm))
+registerDateHandler(_parse_date_perforce)
+
+def _parse_date(dateString):
+ '''Parses a variety of date formats into a 9-tuple in GMT'''
+ for handler in _date_handlers:
+ try:
+ date9tuple = handler(dateString)
+ if not date9tuple: continue
+ if len(date9tuple) != 9:
+ if _debug: sys.stderr.write('date handler function must return 9-tuple\n')
+ raise ValueError
+ map(int, date9tuple)
+ return date9tuple
+ except Exception, e:
+ if _debug: sys.stderr.write('%s raised %s\n' % (handler.__name__, repr(e)))
+ pass
+ return None
+
+def _getCharacterEncoding(http_headers, xml_data):
+ '''Get the character encoding of the XML document
+
+ http_headers is a dictionary
+ xml_data is a raw string (not Unicode)
+
+ This is so much trickier than it sounds, it's not even funny.
+ According to RFC 3023 ('XML Media Types'), if the HTTP Content-Type
+ is application/xml, application/*+xml,
+ application/xml-external-parsed-entity, or application/xml-dtd,
+ the encoding given in the charset parameter of the HTTP Content-Type
+ takes precedence over the encoding given in the XML prefix within the
+ document, and defaults to 'utf-8' if neither are specified. But, if
+ the HTTP Content-Type is text/xml, text/*+xml, or
+ text/xml-external-parsed-entity, the encoding given in the XML prefix
+ within the document is ALWAYS IGNORED and only the encoding given in
+ the charset parameter of the HTTP Content-Type header should be
+ respected, and it defaults to 'us-ascii' if not specified.
+
+ Furthermore, discussion on the atom-syntax mailing list with the
+ author of RFC 3023 leads me to the conclusion that any document
+ served with a Content-Type of text/* and no charset parameter
+ must be treated as us-ascii. (We now do this.) And also that it
+ must always be flagged as non-well-formed. (We now do this too.)
+
+ If Content-Type is unspecified (input was local file or non-HTTP source)
+ or unrecognized (server just got it totally wrong), then go by the
+ encoding given in the XML prefix of the document and default to
+ 'iso-8859-1' as per the HTTP specification (RFC 2616).
+
+ Then, assuming we didn't find a character encoding in the HTTP headers
+ (and the HTTP Content-type allowed us to look in the body), we need
+ to sniff the first few bytes of the XML data and try to determine
+ whether the encoding is ASCII-compatible. Section F of the XML
+ specification shows the way here:
+ http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info
+
+ If the sniffed encoding is not ASCII-compatible, we need to make it
+ ASCII compatible so that we can sniff further into the XML declaration
+ to find the encoding attribute, which will tell us the true encoding.
+
+ Of course, none of this guarantees that we will be able to parse the
+ feed in the declared character encoding (assuming it was declared
+ correctly, which many are not). CJKCodecs and iconv_codec help a lot;
+ you should definitely install them if you can.
+ http://cjkpython.i18n.org/
+ '''
+
+ def _parseHTTPContentType(content_type):
+ '''takes HTTP Content-Type header and returns (content type, charset)
+
+ If no charset is specified, returns (content type, '')
+ If no content type is specified, returns ('', '')
+ Both return parameters are guaranteed to be lowercase strings
+ '''
+ content_type = content_type or ''
+ content_type, params = cgi.parse_header(content_type)
+ return content_type, params.get('charset', '').replace("'", '')
+
+ sniffed_xml_encoding = ''
+ xml_encoding = ''
+ true_encoding = ''
+ http_content_type, http_encoding = _parseHTTPContentType(http_headers.get('content-type', http_headers.get('Content-type')))
+ # Must sniff for non-ASCII-compatible character encodings before
+ # searching for XML declaration. This heuristic is defined in
+ # section F of the XML specification:
+ # http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info
+ try:
+ if xml_data[:4] == _l2bytes([0x4c, 0x6f, 0xa7, 0x94]):
+ # EBCDIC
+ xml_data = _ebcdic_to_ascii(xml_data)
+ elif xml_data[:4] == _l2bytes([0x00, 0x3c, 0x00, 0x3f]):
+ # UTF-16BE
+ sniffed_xml_encoding = 'utf-16be'
+ xml_data = unicode(xml_data, 'utf-16be').encode('utf-8')
+ elif (len(xml_data) >= 4) and (xml_data[:2] == _l2bytes([0xfe, 0xff])) and (xml_data[2:4] != _l2bytes([0x00, 0x00])):
+ # UTF-16BE with BOM
+ sniffed_xml_encoding = 'utf-16be'
+ xml_data = unicode(xml_data[2:], 'utf-16be').encode('utf-8')
+ elif xml_data[:4] == _l2bytes([0x3c, 0x00, 0x3f, 0x00]):
+ # UTF-16LE
+ sniffed_xml_encoding = 'utf-16le'
+ xml_data = unicode(xml_data, 'utf-16le').encode('utf-8')
+ elif (len(xml_data) >= 4) and (xml_data[:2] == _l2bytes([0xff, 0xfe])) and (xml_data[2:4] != _l2bytes([0x00, 0x00])):
+ # UTF-16LE with BOM
+ sniffed_xml_encoding = 'utf-16le'
+ xml_data = unicode(xml_data[2:], 'utf-16le').encode('utf-8')
+ elif xml_data[:4] == _l2bytes([0x00, 0x00, 0x00, 0x3c]):
+ # UTF-32BE
+ sniffed_xml_encoding = 'utf-32be'
+ xml_data = unicode(xml_data, 'utf-32be').encode('utf-8')
+ elif xml_data[:4] == _l2bytes([0x3c, 0x00, 0x00, 0x00]):
+ # UTF-32LE
+ sniffed_xml_encoding = 'utf-32le'
+ xml_data = unicode(xml_data, 'utf-32le').encode('utf-8')
+ elif xml_data[:4] == _l2bytes([0x00, 0x00, 0xfe, 0xff]):
+ # UTF-32BE with BOM
+ sniffed_xml_encoding = 'utf-32be'
+ xml_data = unicode(xml_data[4:], 'utf-32be').encode('utf-8')
+ elif xml_data[:4] == _l2bytes([0xff, 0xfe, 0x00, 0x00]):
+ # UTF-32LE with BOM
+ sniffed_xml_encoding = 'utf-32le'
+ xml_data = unicode(xml_data[4:], 'utf-32le').encode('utf-8')
+ elif xml_data[:3] == _l2bytes([0xef, 0xbb, 0xbf]):
+ # UTF-8 with BOM
+ sniffed_xml_encoding = 'utf-8'
+ xml_data = unicode(xml_data[3:], 'utf-8').encode('utf-8')
+ else:
+ # ASCII-compatible
+ pass
+ xml_encoding_match = re.compile(_s2bytes('^<\?.*encoding=[\'"](.*?)[\'"].*\?>')).match(xml_data)
+ except:
+ xml_encoding_match = None
+ if xml_encoding_match:
+ xml_encoding = xml_encoding_match.groups()[0].decode('utf-8').lower()
+ if sniffed_xml_encoding and (xml_encoding in ('iso-10646-ucs-2', 'ucs-2', 'csunicode', 'iso-10646-ucs-4', 'ucs-4', 'csucs4', 'utf-16', 'utf-32', 'utf_16', 'utf_32', 'utf16', 'u16')):
+ xml_encoding = sniffed_xml_encoding
+ acceptable_content_type = 0
+ application_content_types = ('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity')
+ text_content_types = ('text/xml', 'text/xml-external-parsed-entity')
+ if (http_content_type in application_content_types) or \
+ (http_content_type.startswith('application/') and http_content_type.endswith('+xml')):
+ acceptable_content_type = 1
+ true_encoding = http_encoding or xml_encoding or 'utf-8'
+ elif (http_content_type in text_content_types) or \
+ (http_content_type.startswith('text/')) and http_content_type.endswith('+xml'):
+ acceptable_content_type = 1
+ true_encoding = http_encoding or 'us-ascii'
+ elif http_content_type.startswith('text/'):
+ true_encoding = http_encoding or 'us-ascii'
+ elif http_headers and (not (http_headers.has_key('content-type') or http_headers.has_key('Content-type'))):
+ true_encoding = xml_encoding or 'iso-8859-1'
+ else:
+ true_encoding = xml_encoding or 'utf-8'
+ # some feeds claim to be gb2312 but are actually gb18030.
+ # apparently MSIE and Firefox both do the following switch:
+ if true_encoding.lower() == 'gb2312':
+ true_encoding = 'gb18030'
+ return true_encoding, http_encoding, xml_encoding, sniffed_xml_encoding, acceptable_content_type
+
+def _toUTF8(data, encoding):
+ '''Changes an XML data stream on the fly to specify a new encoding
+
+ data is a raw sequence of bytes (not Unicode) that is presumed to be in %encoding already
+ encoding is a string recognized by encodings.aliases
+ '''
+ if _debug: sys.stderr.write('entering _toUTF8, trying encoding %s\n' % encoding)
+ # strip Byte Order Mark (if present)
+ if (len(data) >= 4) and (data[:2] == _l2bytes([0xfe, 0xff])) and (data[2:4] != _l2bytes([0x00, 0x00])):
+ if _debug:
+ sys.stderr.write('stripping BOM\n')
+ if encoding != 'utf-16be':
+ sys.stderr.write('trying utf-16be instead\n')
+ encoding = 'utf-16be'
+ data = data[2:]
+ elif (len(data) >= 4) and (data[:2] == _l2bytes([0xff, 0xfe])) and (data[2:4] != _l2bytes([0x00, 0x00])):
+ if _debug:
+ sys.stderr.write('stripping BOM\n')
+ if encoding != 'utf-16le':
+ sys.stderr.write('trying utf-16le instead\n')
+ encoding = 'utf-16le'
+ data = data[2:]
+ elif data[:3] == _l2bytes([0xef, 0xbb, 0xbf]):
+ if _debug:
+ sys.stderr.write('stripping BOM\n')
+ if encoding != 'utf-8':
+ sys.stderr.write('trying utf-8 instead\n')
+ encoding = 'utf-8'
+ data = data[3:]
+ elif data[:4] == _l2bytes([0x00, 0x00, 0xfe, 0xff]):
+ if _debug:
+ sys.stderr.write('stripping BOM\n')
+ if encoding != 'utf-32be':
+ sys.stderr.write('trying utf-32be instead\n')
+ encoding = 'utf-32be'
+ data = data[4:]
+ elif data[:4] == _l2bytes([0xff, 0xfe, 0x00, 0x00]):
+ if _debug:
+ sys.stderr.write('stripping BOM\n')
+ if encoding != 'utf-32le':
+ sys.stderr.write('trying utf-32le instead\n')
+ encoding = 'utf-32le'
+ data = data[4:]
+ newdata = unicode(data, encoding)
+ if _debug: sys.stderr.write('successfully converted %s data to unicode\n' % encoding)
+ declmatch = re.compile('^<\?xml[^>]*?>')
+ newdecl = '''<?xml version='1.0' encoding='utf-8'?>'''
+ if declmatch.search(newdata):
+ newdata = declmatch.sub(newdecl, newdata)
+ else:
+ newdata = newdecl + u'\n' + newdata
+ return newdata.encode('utf-8')
+
+def _stripDoctype(data):
+ '''Strips DOCTYPE from XML document, returns (rss_version, stripped_data)
+
+ rss_version may be 'rss091n' or None
+ stripped_data is the same XML document, minus the DOCTYPE
+ '''
+ start = re.search(_s2bytes('<\w'), data)
+ start = start and start.start() or -1
+ head,data = data[:start+1], data[start+1:]
+
+ entity_pattern = re.compile(_s2bytes(r'^\s*<!ENTITY([^>]*?)>'), re.MULTILINE)
+ entity_results=entity_pattern.findall(head)
+ head = entity_pattern.sub(_s2bytes(''), head)
+ doctype_pattern = re.compile(_s2bytes(r'^\s*<!DOCTYPE([^>]*?)>'), re.MULTILINE)
+ doctype_results = doctype_pattern.findall(head)
+ doctype = doctype_results and doctype_results[0] or _s2bytes('')
+ if doctype.lower().count(_s2bytes('netscape')):
+ version = 'rss091n'
+ else:
+ version = None
+
+ # only allow in 'safe' inline entity definitions
+ replacement=_s2bytes('')
+ if len(doctype_results)==1 and entity_results:
+ safe_pattern=re.compile(_s2bytes('\s+(\w+)\s+"(&#\w+;|[^&"]*)"'))
+ safe_entities=filter(lambda e: safe_pattern.match(e),entity_results)
+ if safe_entities:
+ replacement=_s2bytes('<!DOCTYPE feed [\n <!ENTITY') + _s2bytes('>\n <!ENTITY ').join(safe_entities) + _s2bytes('>\n]>')
+ data = doctype_pattern.sub(replacement, head) + data
+
+ return version, data, dict(replacement and [(k.decode('utf-8'), v.decode('utf-8')) for k, v in safe_pattern.findall(replacement)])
+
+def parse(url_file_stream_or_string, etag=None, modified=None, agent=None, referrer=None, handlers=[], request_headers={}, response_headers={}):
+ '''Parse a feed from a URL, file, stream, or string.
+
+ request_headers, if given, is a dict from http header name to value to add
+ to the request; this overrides internally generated values.
+ '''
+ result = FeedParserDict()
+ result['feed'] = FeedParserDict()
+ result['entries'] = []
+ if _XML_AVAILABLE:
+ result['bozo'] = 0
+ if not isinstance(handlers, list):
+ handlers = [handlers]
+ try:
+ f = _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers, request_headers)
+ data = f.read()
+ except Exception, e:
+ result['bozo'] = 1
+ result['bozo_exception'] = e
+ data = None
+ f = None
+
+ if hasattr(f, 'headers'):
+ result['headers'] = dict(f.headers)
+ # overwrite existing headers using response_headers
+ if 'headers' in result:
+ result['headers'].update(response_headers)
+ elif response_headers:
+ result['headers'] = copy.deepcopy(response_headers)
+
+ # if feed is gzip-compressed, decompress it
+ if f and data and 'headers' in result:
+ if gzip and result['headers'].get('content-encoding') == 'gzip':
+ try:
+ data = gzip.GzipFile(fileobj=_StringIO(data)).read()
+ except Exception, e:
+ # Some feeds claim to be gzipped but they're not, so
+ # we get garbage. Ideally, we should re-request the
+ # feed without the 'Accept-encoding: gzip' header,
+ # but we don't.
+ result['bozo'] = 1
+ result['bozo_exception'] = e
+ data = ''
+ elif zlib and result['headers'].get('content-encoding') == 'deflate':
+ try:
+ data = zlib.decompress(data, -zlib.MAX_WBITS)
+ except Exception, e:
+ result['bozo'] = 1
+ result['bozo_exception'] = e
+ data = ''
+
+ # save HTTP headers
+ if 'headers' in result:
+ if 'etag' in result['headers'] or 'ETag' in result['headers']:
+ etag = result['headers'].get('etag', result['headers'].get('ETag'))
+ if etag:
+ result['etag'] = etag
+ if 'last-modified' in result['headers'] or 'Last-Modified' in result['headers']:
+ modified = result['headers'].get('last-modified', result['headers'].get('Last-Modified'))
+ if modified:
+ result['modified'] = _parse_date(modified)
+ if hasattr(f, 'url'):
+ result['href'] = f.url
+ result['status'] = 200
+ if hasattr(f, 'status'):
+ result['status'] = f.status
+ if hasattr(f, 'close'):
+ f.close()
+
+ # there are four encodings to keep track of:
+ # - http_encoding is the encoding declared in the Content-Type HTTP header
+ # - xml_encoding is the encoding declared in the <?xml declaration
+ # - sniffed_encoding is the encoding sniffed from the first 4 bytes of the XML data
+ # - result['encoding'] is the actual encoding, as per RFC 3023 and a variety of other conflicting specifications
+ http_headers = result.get('headers', {})
+ result['encoding'], http_encoding, xml_encoding, sniffed_xml_encoding, acceptable_content_type = \
+ _getCharacterEncoding(http_headers, data)
+ if http_headers and (not acceptable_content_type):
+ if http_headers.has_key('content-type') or http_headers.has_key('Content-type'):
+ bozo_message = '%s is not an XML media type' % http_headers.get('content-type', http_headers.get('Content-type'))
+ else:
+ bozo_message = 'no Content-type specified'
+ result['bozo'] = 1
+ result['bozo_exception'] = NonXMLContentType(bozo_message)
+
+ if data is not None:
+ result['version'], data, entities = _stripDoctype(data)
+
+ # ensure that baseuri is an absolute uri using an acceptable URI scheme
+ contentloc = http_headers.get('content-location', http_headers.get('Content-Location', ''))
+ href = result.get('href', '')
+ baseuri = _makeSafeAbsoluteURI(href, contentloc) or _makeSafeAbsoluteURI(contentloc) or href
+
+ baselang = http_headers.get('content-language', http_headers.get('Content-Language', None))
+
+ # if server sent 304, we're done
+ if result.get('status', 0) == 304:
+ result['version'] = ''
+ result['debug_message'] = 'The feed has not changed since you last checked, ' + \
+ 'so the server sent no data. This is a feature, not a bug!'
+ return result
+
+ # if there was a problem downloading, we're done
+ if data is None:
+ return result
+
+ # determine character encoding
+ use_strict_parser = 0
+ known_encoding = 0
+ tried_encodings = []
+ # try: HTTP encoding, declared XML encoding, encoding sniffed from BOM
+ for proposed_encoding in (result['encoding'], xml_encoding, sniffed_xml_encoding):
+ if not proposed_encoding: continue
+ if proposed_encoding in tried_encodings: continue
+ tried_encodings.append(proposed_encoding)
+ try:
+ data = _toUTF8(data, proposed_encoding)
+ known_encoding = use_strict_parser = 1
+ break
+ except:
+ pass
+ # if no luck and we have auto-detection library, try that
+ if (not known_encoding) and chardet:
+ try:
+ proposed_encoding = chardet.detect(data)['encoding']
+ if proposed_encoding and (proposed_encoding not in tried_encodings):
+ tried_encodings.append(proposed_encoding)
+ data = _toUTF8(data, proposed_encoding)
+ known_encoding = use_strict_parser = 1
+ except:
+ pass
+ # if still no luck and we haven't tried utf-8 yet, try that
+ if (not known_encoding) and ('utf-8' not in tried_encodings):
+ try:
+ proposed_encoding = 'utf-8'
+ tried_encodings.append(proposed_encoding)
+ data = _toUTF8(data, proposed_encoding)
+ known_encoding = use_strict_parser = 1
+ except:
+ pass
+ # if still no luck and we haven't tried windows-1252 yet, try that
+ if (not known_encoding) and ('windows-1252' not in tried_encodings):
+ try:
+ proposed_encoding = 'windows-1252'
+ tried_encodings.append(proposed_encoding)
+ data = _toUTF8(data, proposed_encoding)
+ known_encoding = use_strict_parser = 1
+ except:
+ pass
+ # if still no luck and we haven't tried iso-8859-2 yet, try that.
+ if (not known_encoding) and ('iso-8859-2' not in tried_encodings):
+ try:
+ proposed_encoding = 'iso-8859-2'
+ tried_encodings.append(proposed_encoding)
+ data = _toUTF8(data, proposed_encoding)
+ known_encoding = use_strict_parser = 1
+ except:
+ pass
+ # if still no luck, give up
+ if not known_encoding:
+ result['bozo'] = 1
+ result['bozo_exception'] = CharacterEncodingUnknown( \
+ 'document encoding unknown, I tried ' + \
+ '%s, %s, utf-8, windows-1252, and iso-8859-2 but nothing worked' % \
+ (result['encoding'], xml_encoding))
+ result['encoding'] = ''
+ elif proposed_encoding != result['encoding']:
+ result['bozo'] = 1
+ result['bozo_exception'] = CharacterEncodingOverride( \
+ 'document declared as %s, but parsed as %s' % \
+ (result['encoding'], proposed_encoding))
+ result['encoding'] = proposed_encoding
+
+ if not _XML_AVAILABLE:
+ use_strict_parser = 0
+ if use_strict_parser:
+ # initialize the SAX parser
+ feedparser = _StrictFeedParser(baseuri, baselang, 'utf-8')
+ saxparser = xml.sax.make_parser(PREFERRED_XML_PARSERS)
+ saxparser.setFeature(xml.sax.handler.feature_namespaces, 1)
+ saxparser.setContentHandler(feedparser)
+ saxparser.setErrorHandler(feedparser)
+ source = xml.sax.xmlreader.InputSource()
+ source.setByteStream(_StringIO(data))
+ if hasattr(saxparser, '_ns_stack'):
+ # work around bug in built-in SAX parser (doesn't recognize xml: namespace)
+ # PyXML doesn't have this problem, and it doesn't have _ns_stack either
+ saxparser._ns_stack.append({'http://www.w3.org/XML/1998/namespace':'xml'})
+ try:
+ saxparser.parse(source)
+ except Exception, e:
+ if _debug:
+ import traceback
+ traceback.print_stack()
+ traceback.print_exc()
+ sys.stderr.write('xml parsing failed\n')
+ result['bozo'] = 1
+ result['bozo_exception'] = feedparser.exc or e
+ use_strict_parser = 0
+ if not use_strict_parser:
+ feedparser = _LooseFeedParser(baseuri, baselang, 'utf-8', entities)
+ feedparser.feed(data.decode('utf-8', 'replace'))
+ result['feed'] = feedparser.feeddata
+ result['entries'] = feedparser.entries
+ result['version'] = result['version'] or feedparser.version
+ result['namespaces'] = feedparser.namespacesInUse
+ return result
+
+class Serializer:
+ def __init__(self, results):
+ self.results = results
+
+class TextSerializer(Serializer):
+ def write(self, stream=sys.stdout):
+ self._writer(stream, self.results, '')
+
+ def _writer(self, stream, node, prefix):
+ if not node: return
+ if hasattr(node, 'keys'):
+ keys = node.keys()
+ keys.sort()
+ for k in keys:
+ if k in ('description', 'link'): continue
+ if node.has_key(k + '_detail'): continue
+ if node.has_key(k + '_parsed'): continue
+ self._writer(stream, node[k], prefix + k + '.')
+ elif type(node) == types.ListType:
+ index = 0
+ for n in node:
+ self._writer(stream, n, prefix[:-1] + '[' + str(index) + '].')
+ index += 1
+ else:
+ try:
+ s = str(node).encode('utf-8')
+ s = s.replace('\\', '\\\\')
+ s = s.replace('\r', '')
+ s = s.replace('\n', r'\n')
+ stream.write(prefix[:-1])
+ stream.write('=')
+ stream.write(s)
+ stream.write('\n')
+ except:
+ pass
+
+class PprintSerializer(Serializer):
+ def write(self, stream=sys.stdout):
+ if self.results.has_key('href'):
+ stream.write(self.results['href'] + '\n\n')
+ from pprint import pprint
+ pprint(self.results, stream)
+ stream.write('\n')
+
+if __name__ == '__main__':
+ try:
+ from optparse import OptionParser
+ except:
+ OptionParser = None
+
+ if OptionParser:
+ optionParser = OptionParser(version=__version__, usage="%prog [options] url_or_filename_or_-")
+ optionParser.set_defaults(format="pprint")
+ optionParser.add_option("-A", "--user-agent", dest="agent", metavar="AGENT", help="User-Agent for HTTP URLs")
+ optionParser.add_option("-e", "--referer", "--referrer", dest="referrer", metavar="URL", help="Referrer for HTTP URLs")
+ optionParser.add_option("-t", "--etag", dest="etag", metavar="TAG", help="ETag/If-None-Match for HTTP URLs")
+ optionParser.add_option("-m", "--last-modified", dest="modified", metavar="DATE", help="Last-modified/If-Modified-Since for HTTP URLs (any supported date format)")
+ optionParser.add_option("-f", "--format", dest="format", metavar="FORMAT", help="output results in FORMAT (text, pprint)")
+ optionParser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, help="write debugging information to stderr")
+ (options, urls) = optionParser.parse_args()
+ if options.verbose:
+ _debug = 1
+ if not urls:
+ optionParser.print_help()
+ sys.exit(0)
+ else:
+ if not sys.argv[1:]:
+ print __doc__
+ sys.exit(0)
+ class _Options:
+ etag = modified = agent = referrer = None
+ format = 'pprint'
+ options = _Options()
+ urls = sys.argv[1:]
+
+ zopeCompatibilityHack()
+
+ serializer = globals().get(options.format.capitalize() + 'Serializer', Serializer)
+ for url in urls:
+ results = parse(url, etag=options.etag, modified=options.modified, agent=options.agent, referrer=options.referrer)
+ serializer(results).write(sys.stdout)
diff --git a/feedparser.pyc b/feedparser.pyc
new file mode 100644
index 0000000..21864f7
--- /dev/null
+++ b/feedparser.pyc
Binary files differ
diff --git a/generic_cover.png b/generic_cover.png
new file mode 100644
index 0000000..33eec4f
--- /dev/null
+++ b/generic_cover.png
Binary files differ
diff --git a/get-books.cfg b/get-books.cfg
new file mode 100644
index 0000000..127d9ea
--- /dev/null
+++ b/get-books.cfg
@@ -0,0 +1,34 @@
+[GetBooks]
+show_images = yes
+languages = en,es,fr,de
+
+[Feedbooks]
+name = Feedbooks
+query_uri = http://www.feedbooks.com/books/search.atom?query=
+opds_cover = http://opds-spec.org/image
+summary_field = summary
+blacklist = Erotica,Romance
+
+[Catalogs_Feedbooks]
+Science Fiction = http://www.feedbooks.com/books/top.atom?category=FBFIC028000&range=week
+Short stories = http://www.feedbooks.com/books/top?category=FBFIC029000&range=week
+Fairy Tales, Folk Tales & Mythology = http://www.feedbooks.com/books/top?category=FBFIC010000&range=week
+Juvenile = http://www.feedbooks.com/books/top?category=FBJUV000000&range=week
+Action & Adventure = http://www.feedbooks.com/books/top?category=FBFIC002000&range=week
+Public Domain Books = http://www.feedbooks.com/publicdomain/catalog.atom
+#Feed Books Catalog Index = http://www.feedbooks.com/catalog
+
+[Internet Archive]
+name = Internet Archive
+query_uri = http://bookserver.archive.org/catalog/opensearch?q=
+opds_cover = http://opds-spec.org/image
+#opds_cover = http://opds-spec.org/image/thumbnail
+
+[Ceibal]
+name = Ceibal
+query_uri = http://biblioteca.ceibal.edu.uy/latest.atom?q=
+opds_cover = http://opds-spec.org/cover
+summary_field = summary
+
+[Catalogs_Ceibal]
+indice = http://biblioteca.ceibal.edu.uy/static_media/catalogo_inicial.htm
diff --git a/icons/books.svg b/icons/books.svg
new file mode 100644
index 0000000..f7a04ce
--- /dev/null
+++ b/icons/books.svg
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY fill_color "#AAAAAA">
+ <!ENTITY stroke_color "#FFFFFF">
+]>
+<svg xmlns="http://www.w3.org/2000/svg" width="55" height="55">
+ <g
+ transform="translate(0,-997.36218)"
+ id="layer1">
+ <g
+ transform="translate(-0.57504564,-1.02237)"
+ id="g5130">
+ <path
+ d="m 10.265977,1016.4311 32.174926,0 c 3.030554,-5.2317 1.641363,-8.6218 0,-11.9069 l -32.174926,0 z"
+ id="path5116"
+ style="fill:&fill_color;;fill-opacity:1;stroke:none" />
+ <path
+ d="m 8.9529503,1016.4311 33.4879527,0 c 3.030554,-5.2317 1.641363,-8.6218 0,-11.9069 l -33.4879527,0"
+ id="rect4601"
+ style="fill:none;stroke:&stroke_color;;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ </g>
+ <g
+ transform="matrix(-1,0,0,1,55.575046,14.38453)"
+ id="g5134">
+ <path
+ d="m 10.265977,1016.4311 32.174926,0 c 3.030554,-5.2317 1.641363,-8.6218 0,-11.9069 l -32.174926,0 z"
+ id="path5136"
+ style="fill:&fill_color;;fill-opacity:1;stroke:none" />
+ <path
+ d="m 8.9529503,1016.4311 33.4879527,0 c 3.030554,-5.2317 1.641363,-8.6218 0,-11.9069 l -33.4879527,0"
+ id="path5138"
+ style="fill:none;stroke:&stroke_color;;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ </g>
+ <g
+ transform="matrix(-1,0,0,1,52.607946,29.79143)"
+ id="g5140">
+ <path
+ d="m 10.265977,1016.4311 32.174926,0 c 3.030554,-5.2317 1.641363,-8.6218 0,-11.9069 l -32.174926,0 z"
+ id="path5142"
+ style="fill:&fill_color;;fill-opacity:1;stroke:none" />
+ <path
+ d="m 8.9529503,1016.4311 33.4879527,0 c 3.030554,-5.2317 1.641363,-8.6218 0,-11.9069 l -33.4879527,0"
+ id="path5144"
+ style="fill:none;stroke:&stroke_color;;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/catalogs.svg b/icons/catalogs.svg
new file mode 100644
index 0000000..1556b73
--- /dev/null
+++ b/icons/catalogs.svg
@@ -0,0 +1,93 @@
+<?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"
+ height="55px"
+ viewBox="0 0 55 55"
+ width="55px"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ stroke="#000"
+ fill="#eee"
+ id="svg3163"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="catalogs.svg">
+ <metadata
+ id="metadata3175">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3173" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1007"
+ id="namedview3171"
+ showgrid="false"
+ inkscape:zoom="5.4363636"
+ inkscape:cx="-38.53679"
+ inkscape:cy="27.5"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg3163" />
+ <g
+ id="g3794"
+ transform="matrix(0.90045793,0,0,0.88610465,132.19468,25.300159)">
+ <path
+ sodipodi:nodetypes="ccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect3177-3-5"
+ d="m -124.46056,-21.494132 -0.89822,4.756525 -4.26832,-0.537655 -14.89811,9.0304758 22.71871,36.3311012 6.19279,-3.730737 3.96339,2.580136 3.85722,-5.718139 0.81391,0 0,-1.220334 19.250751,-28.6604282 -14.579611,-9.5186088 -4.1322,0.684292 -0.53894,-3.996628 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:3.93412137;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <g
+ transform="translate(-143.84615,-25.384615)"
+ id="g3789">
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3177-3"
+ width="15.451505"
+ height="38.260868"
+ x="38.378708"
+ y="-14.139146"
+ transform="matrix(0.83378586,0.55208798,-0.55208798,0.83378586,0,0)" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3177"
+ width="15.451505"
+ height="38.260868"
+ x="20.234114"
+ y="6.438127" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3177-8"
+ width="15.451505"
+ height="38.260868"
+ x="-7.4373245"
+ y="16.90127"
+ transform="matrix(0.85164682,-0.5241161,0.5241161,0.85164682,0,0)" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/internet-icon.svg b/icons/internet-icon.svg
new file mode 100644
index 0000000..c8f466a
--- /dev/null
+++ b/icons/internet-icon.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#010101">
+ <!ENTITY fill_color "#FFFFFF">
+]><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="activity-browse">
+ <circle cx="27.375" cy="27.5" display="inline" fill="&fill_color;" r="19.903" stroke="&stroke_color;" stroke-width="3.5"/>
+ <g display="inline">
+ <path d="M27.376,7.598c0,0-11.205,8.394-11.205,19.976 c0,11.583,11.205,19.829,11.205,19.829" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5"/>
+ <path d="M27.376,7.598c0,0,11.066,9.141,11.066,19.976 c0,10.839-11.066,19.829-11.066,19.829" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5"/>
+ <line fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" x1="27.376" x2="27.376" y1="7.598" y2="47.402"/>
+ <line fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" x1="27.376" x2="27.376" y1="7.598" y2="47.402"/>
+ <line fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" x1="27.376" x2="27.376" y1="7.598" y2="47.402"/>
+ <line fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" x1="7.472" x2="47.278" y1="27.5" y2="27.5"/>
+ </g>
+</g></svg>
+
diff --git a/languagenames.py b/languagenames.py
new file mode 100644
index 0000000..88329ce
--- /dev/null
+++ b/languagenames.py
@@ -0,0 +1,53 @@
+#! /usr/bin/env python
+
+# Copyright (C) 2009 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
+
+from xml.etree import ElementTree
+import logging
+
+_ISO_639_XML_PATH = '/usr/share/xml/iso-codes/iso_639.xml'
+
+
+def singleton(object, instantiated=[]):
+ # From http://norvig.com/python-iaq.html
+ "Raise an exception if an obj of this class has been instantiated before"
+ assert object.__class__ not in instantiated, \
+ "%s is a Singleton class but is already instantiated" % object.__class__
+ instantiated.append(object.__class__)
+
+
+class LanguageNames(object):
+
+ def __init__(self):
+ singleton(self)
+ self._cache = None
+
+ def get_full_language_name(self, code):
+ if self._cache == None:
+ self._cache = {}
+ _xmldoc = ElementTree.parse(_ISO_639_XML_PATH)
+ _eroot = _xmldoc.getroot()
+ for child in _eroot.getchildren():
+ if child.attrib is not None:
+ lang_name = child.attrib.get('name', None)
+ lang_code = child.attrib.get('iso_639_1_code', None)
+
+ if lang_code is not None and lang_name is not None:
+ self._cache[lang_code] = lang_name
+ _xmldoc = None
+
+ return self._cache[code]
diff --git a/languagenames.pyc b/languagenames.pyc
new file mode 100644
index 0000000..afd8247
--- /dev/null
+++ b/languagenames.pyc
Binary files differ
diff --git a/listview.py b/listview.py
new file mode 100644
index 0000000..8356bfc
--- /dev/null
+++ b/listview.py
@@ -0,0 +1,95 @@
+#! /usr/bin/env python
+
+# Copyright (C) 2009 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
+
+from gi.repository import GObject
+from gi.repository import Gtk
+from gi.repository import Pango
+
+from gettext import gettext as _
+from extListview import ExtListView
+
+
+class ListView(ExtListView):
+ __txtRdr = Gtk.CellRendererText()
+ __txtRdr.props.wrap_mode = Pango.WrapMode.WORD
+ __txtRdr.props.wrap_width = 500
+ __txtRdr.props.width = 500
+ (ROW_TITLE, ROW_AUTHOR, ROW_PUBLISHER,
+ ROW_LANGUAGE, ROW_PUB_DATE, ROW_BOOK) = range(6)
+
+ columns = ((_('Title'), [(__txtRdr, GObject.TYPE_STRING)],
+ (ROW_TITLE,), False, True),
+ (_('Author'), [(__txtRdr, GObject.TYPE_STRING)],
+ (ROW_AUTHOR, ROW_TITLE), False, True),
+ (_('Publisher'), [(__txtRdr, GObject.TYPE_STRING)],
+ (ROW_AUTHOR, ROW_TITLE), False, False),
+ (_('Language'), [(__txtRdr, GObject.TYPE_STRING)],
+ (ROW_AUTHOR, ROW_TITLE), False, False),
+ (_('Publish Date'), [(__txtRdr, GObject.TYPE_STRING)],
+ (ROW_AUTHOR, ROW_TITLE), False, False),
+ (None, [(None, GObject.TYPE_PYOBJECT)], (None,), False, False))
+
+ __gsignals__ = {
+ 'selection-changed': (GObject.SignalFlags.RUN_LAST,
+ None,
+ ([])),
+ }
+
+ def __init__(self, lang_code_handler):
+ ExtListView.__init__(self, self.columns, sortable=True,
+ useMarkup=False, canShowHideColumns=True)
+ #self.enableDNDReordering() # Is this needed ?
+
+ self._lang_code_handler = lang_code_handler
+
+ selection = self.get_selection()
+ selection.set_mode(Gtk.SelectionMode.SINGLE)
+ selection.connect('changed', self.__selection_changed_cb)
+
+ def __selection_changed_cb(self, selection):
+ self.emit('selection-changed')
+
+ def populate(self, results):
+ self.populate_with_books(results.get_book_list())
+
+ def populate_with_books(self, books):
+ rows = []
+
+ for book in books:
+ lang = ''
+ try:
+ lang = self._lang_code_handler.get_full_language_name(
+ book.get_language())
+ except KeyError:
+ pass
+
+ rows.append([book.get_title(), book.get_author(),
+ book.get_publisher(), lang,
+ book.get_published_year(), book])
+
+ # README: I had to remove the self.clear() here because it
+ # made the listview to scroll to the top on Gtk3
+
+ self.insertRows(rows)
+
+ def get_selected_book(self):
+ try:
+ ret = self.getFirstSelectedRow()[self.ROW_BOOK]
+ except IndexError:
+ ret = None
+ return ret
diff --git a/listview.pyc b/listview.pyc
new file mode 100644
index 0000000..90dcdfd
--- /dev/null
+++ b/listview.pyc
Binary files differ
diff --git a/locale/af/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/af/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/af/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/af/activity.linfo b/locale/af/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/af/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ak/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ak/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..d71e657
--- /dev/null
+++ b/locale/ak/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ak/activity.linfo b/locale/ak/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ak/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/am/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/am/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/am/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/am/activity.linfo b/locale/am/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/am/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ar/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ar/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ar/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ar/activity.linfo b/locale/ar/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ar/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ar_SY/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ar_SY/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..c1ec5b0
--- /dev/null
+++ b/locale/ar_SY/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ar_SY/activity.linfo b/locale/ar_SY/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ar_SY/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ay/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ay/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ay/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ay/activity.linfo b/locale/ay/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ay/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/bg/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/bg/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/bg/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/bg/activity.linfo b/locale/bg/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/bg/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/bi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/bi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/bi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/bi/activity.linfo b/locale/bi/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/bi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/bn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/bn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/bn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/bn/activity.linfo b/locale/bn/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/bn/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/bn_IN/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/bn_IN/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/bn_IN/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/bn_IN/activity.linfo b/locale/bn_IN/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/bn_IN/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/bs/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/bs/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1d51c96
--- /dev/null
+++ b/locale/bs/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/bs/activity.linfo b/locale/bs/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/bs/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ca/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ca/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ca/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ca/activity.linfo b/locale/ca/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ca/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/cpp/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/cpp/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/cpp/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/cpp/activity.linfo b/locale/cpp/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/cpp/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/cs/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/cs/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/cs/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/cs/activity.linfo b/locale/cs/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/cs/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/da/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/da/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..d71e657
--- /dev/null
+++ b/locale/da/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/da/activity.linfo b/locale/da/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/da/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/de/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/de/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..ad46f16
--- /dev/null
+++ b/locale/de/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/de/activity.linfo b/locale/de/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/de/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/dz/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/dz/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/dz/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/dz/activity.linfo b/locale/dz/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/dz/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/el/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/el/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..ea3ec4b
--- /dev/null
+++ b/locale/el/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/el/activity.linfo b/locale/el/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/el/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/en/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/en/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..954481b
--- /dev/null
+++ b/locale/en/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/en/activity.linfo b/locale/en/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/en/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/en_GB/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/en_GB/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..38ac23c
--- /dev/null
+++ b/locale/en_GB/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/en_GB/activity.linfo b/locale/en_GB/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/en_GB/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/en_US/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/en_US/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..69e2589
--- /dev/null
+++ b/locale/en_US/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/en_US/activity.linfo b/locale/en_US/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/en_US/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/es/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/es/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..cc713c0
--- /dev/null
+++ b/locale/es/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/es/activity.linfo b/locale/es/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/es/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/fa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/fa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/fa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/fa/activity.linfo b/locale/fa/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/fa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/fa_AF/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/fa_AF/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/fa_AF/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/fa_AF/activity.linfo b/locale/fa_AF/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/fa_AF/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ff/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ff/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ff/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ff/activity.linfo b/locale/ff/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ff/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/fi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/fi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1d51c96
--- /dev/null
+++ b/locale/fi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/fi/activity.linfo b/locale/fi/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/fi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/fil/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/fil/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/fil/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/fil/activity.linfo b/locale/fil/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/fil/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/fr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/fr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..d9ea5af
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/fr/activity.linfo b/locale/fr/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/fr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/gu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/gu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/gu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/gu/activity.linfo b/locale/gu/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/gu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ha/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ha/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ha/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ha/activity.linfo b/locale/ha/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ha/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/he/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/he/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/he/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/he/activity.linfo b/locale/he/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/he/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/hi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/hi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/hi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/hi/activity.linfo b/locale/hi/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/hi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ht/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ht/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ht/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ht/activity.linfo b/locale/ht/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ht/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/hu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/hu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..4c13728
--- /dev/null
+++ b/locale/hu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/hu/activity.linfo b/locale/hu/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/hu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/hy/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/hy/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..6ee9126
--- /dev/null
+++ b/locale/hy/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/hy/activity.linfo b/locale/hy/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/hy/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/id/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/id/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..024f834
--- /dev/null
+++ b/locale/id/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/id/activity.linfo b/locale/id/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/id/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ig/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ig/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ig/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ig/activity.linfo b/locale/ig/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ig/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/is/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/is/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/is/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/is/activity.linfo b/locale/is/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/is/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/it/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/it/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..0959550
--- /dev/null
+++ b/locale/it/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/it/activity.linfo b/locale/it/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/it/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ja/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ja/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ja/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ja/activity.linfo b/locale/ja/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ja/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/km/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/km/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/km/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/km/activity.linfo b/locale/km/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/km/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/kn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/kn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1d51c96
--- /dev/null
+++ b/locale/kn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/kn/activity.linfo b/locale/kn/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/kn/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ko/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ko/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ko/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ko/activity.linfo b/locale/ko/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ko/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/kos/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/kos/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/kos/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/kos/activity.linfo b/locale/kos/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/kos/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ku/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ku/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..b912322
--- /dev/null
+++ b/locale/ku/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ku/activity.linfo b/locale/ku/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ku/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/lt/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/lt/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..d71e657
--- /dev/null
+++ b/locale/lt/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/lt/activity.linfo b/locale/lt/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/lt/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/lv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/lv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1d51c96
--- /dev/null
+++ b/locale/lv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/lv/activity.linfo b/locale/lv/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/lv/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/mg/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/mg/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/mg/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/mg/activity.linfo b/locale/mg/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/mg/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/mk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/mk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/mk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/mk/activity.linfo b/locale/mk/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/mk/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ml/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ml/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ml/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ml/activity.linfo b/locale/ml/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ml/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/mn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/mn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/mn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/mn/activity.linfo b/locale/mn/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/mn/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/mr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/mr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/mr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/mr/activity.linfo b/locale/mr/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/mr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ms/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ms/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ms/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ms/activity.linfo b/locale/ms/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ms/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/mvo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/mvo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/mvo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/mvo/activity.linfo b/locale/mvo/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/mvo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/na/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/na/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/na/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/na/activity.linfo b/locale/na/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/na/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/nah/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/nah/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..b912322
--- /dev/null
+++ b/locale/nah/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/nah/activity.linfo b/locale/nah/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/nah/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/nb/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/nb/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/nb/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/nb/activity.linfo b/locale/nb/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/nb/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ne/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ne/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..8a942bd
--- /dev/null
+++ b/locale/ne/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ne/activity.linfo b/locale/ne/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ne/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/nl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/nl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1c1e2a8
--- /dev/null
+++ b/locale/nl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/nl/activity.linfo b/locale/nl/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/nl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/nn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/nn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1d51c96
--- /dev/null
+++ b/locale/nn/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/nn/activity.linfo b/locale/nn/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/nn/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/pa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/pa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/pa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/pa/activity.linfo b/locale/pa/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/pa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/pap/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/pap/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/pap/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/pap/activity.linfo b/locale/pap/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/pap/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/pis/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/pis/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/pis/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/pis/activity.linfo b/locale/pis/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/pis/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/pl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/pl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/pl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/pl/activity.linfo b/locale/pl/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/pl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ps/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ps/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..160207d
--- /dev/null
+++ b/locale/ps/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ps/activity.linfo b/locale/ps/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ps/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/pt/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/pt/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/pt/activity.linfo b/locale/pt/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/pt/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/pt_BR/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/pt_BR/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..73ac284
--- /dev/null
+++ b/locale/pt_BR/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/pt_BR/activity.linfo b/locale/pt_BR/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/pt_BR/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/qu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/qu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/qu/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/qu/activity.linfo b/locale/qu/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/qu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ro/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ro/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ro/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ro/activity.linfo b/locale/ro/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ro/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ru/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ru/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ru/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ru/activity.linfo b/locale/ru/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ru/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/rw/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/rw/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/rw/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/rw/activity.linfo b/locale/rw/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/rw/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/sd/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/sd/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/sd/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/sd/activity.linfo b/locale/sd/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/sd/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/si/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/si/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/si/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/si/activity.linfo b/locale/si/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/si/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/sk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/sk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/sk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/sk/activity.linfo b/locale/sk/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/sk/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/sl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/sl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/sl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/sl/activity.linfo b/locale/sl/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/sl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/sm/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/sm/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..3ce9fed
--- /dev/null
+++ b/locale/sm/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/sm/activity.linfo b/locale/sm/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/sm/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/sq/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/sq/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..f0da807
--- /dev/null
+++ b/locale/sq/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/sq/activity.linfo b/locale/sq/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/sq/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/sr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/sr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1d51c96
--- /dev/null
+++ b/locale/sr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/sr/activity.linfo b/locale/sr/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/sr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/st/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/st/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1d51c96
--- /dev/null
+++ b/locale/st/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/st/activity.linfo b/locale/st/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/st/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/sv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/sv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/sv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/sv/activity.linfo b/locale/sv/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/sv/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/sw/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/sw/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/sw/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/sw/activity.linfo b/locale/sw/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/sw/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ta/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ta/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1cd060d
--- /dev/null
+++ b/locale/ta/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ta/activity.linfo b/locale/ta/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ta/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/te/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/te/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/te/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/te/activity.linfo b/locale/te/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/te/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/templates/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/templates/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..024f834
--- /dev/null
+++ b/locale/templates/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/templates/activity.linfo b/locale/templates/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/templates/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/th/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/th/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/th/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/th/activity.linfo b/locale/th/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/th/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ton/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ton/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1d51c96
--- /dev/null
+++ b/locale/ton/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ton/activity.linfo b/locale/ton/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ton/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/tpi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/tpi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/tpi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/tpi/activity.linfo b/locale/tpi/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/tpi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/tr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/tr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/tr/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/tr/activity.linfo b/locale/tr/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/tr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/tvl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/tvl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/tvl/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/tvl/activity.linfo b/locale/tvl/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/tvl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/tyv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/tyv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..d71e657
--- /dev/null
+++ b/locale/tyv/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/tyv/activity.linfo b/locale/tyv/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/tyv/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/tzm/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/tzm/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..b912322
--- /dev/null
+++ b/locale/tzm/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/tzm/activity.linfo b/locale/tzm/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/tzm/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/tzo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/tzo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/tzo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/tzo/activity.linfo b/locale/tzo/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/tzo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ug/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ug/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ug/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ug/activity.linfo b/locale/ug/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ug/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/uk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/uk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1d51c96
--- /dev/null
+++ b/locale/uk/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/uk/activity.linfo b/locale/uk/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/uk/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/ur/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/ur/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/ur/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/ur/activity.linfo b/locale/ur/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/ur/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/vi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/vi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..218fabc
--- /dev/null
+++ b/locale/vi/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/vi/activity.linfo b/locale/vi/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/vi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/wa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/wa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/wa/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/wa/activity.linfo b/locale/wa/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/wa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/yo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/yo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/yo/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/yo/activity.linfo b/locale/yo/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/yo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/zh_CN/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/zh_CN/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..9b8cd9b
--- /dev/null
+++ b/locale/zh_CN/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/zh_CN/activity.linfo b/locale/zh_CN/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/zh_CN/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/zh_HK/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/zh_HK/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..1d51c96
--- /dev/null
+++ b/locale/zh_HK/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/zh_HK/activity.linfo b/locale/zh_HK/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/zh_HK/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/locale/zh_TW/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo b/locale/zh_TW/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
new file mode 100644
index 0000000..5aeb588
--- /dev/null
+++ b/locale/zh_TW/LC_MESSAGES/uy.ceibal.GetBooksCeibalActivity.mo
Binary files differ
diff --git a/locale/zh_TW/activity.linfo b/locale/zh_TW/activity.linfo
new file mode 100644
index 0000000..621795b
--- /dev/null
+++ b/locale/zh_TW/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = EBook Reader
diff --git a/musica.svg b/musica.svg
new file mode 100644
index 0000000..b921d4f
--- /dev/null
+++ b/musica.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#010101">
+ <!ENTITY fill_color "#FFFFFF">
+]><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="activity-jukebox">
+ <path d="M17.666,7.884v32.841 c-2.587-0.614-7.914-0.612-10.755,1.764c-5.688,4.76-0.695,10.109,5.815,7.456c3.705-1.512,4.94-3.937,4.94-7.597V25.997 l30.952-3.516v12.974c-4.212-0.615-7.915-0.614-10.758,1.764c-5.688,4.76-0.695,10.109,5.815,7.454 c3.705-1.51,4.942-3.936,4.942-7.596V4.293L17.666,7.884z M48.618,15.86l-30.952,4.029l0-5.225l30.953-4.102V15.86z" display="inline" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5"/>
+</g></svg>
+
diff --git a/opds.py b/opds.py
new file mode 100644
index 0000000..46158f2
--- /dev/null
+++ b/opds.py
@@ -0,0 +1,602 @@
+#! /usr/bin/env python
+
+# Copyright (C) 2009 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
+
+from gi.repository import GObject
+from gi.repository import Gtk
+
+from sugar3 import network
+
+import logging
+import threading
+import os
+import urllib
+import time
+import csv
+
+import sys
+sys.path.insert(0, './')
+import feedparser
+
+_logger = logging.getLogger('get-ia-books-activity')
+
+_REL_OPDS_ACQUISTION = u'http://opds-spec.org/acquisition'
+_REL_SUBSECTION = 'subsection'
+_REL_OPDS_POPULAR = u'http://opds-spec.org/sort/popular'
+_REL_OPDS_NEW = u'http://opds-spec.org/sort/new'
+_REL_ALTERNATE = 'alternate'
+_REL_CRAWLABLE = 'http://opds-spec.org/crawlable'
+
+GObject.threads_init()
+
+
+class ReadURLDownloader(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:
+ length = self._info.headers.get('Content-Length')
+ if length is not None:
+ return int(length)
+ else:
+ return 0
+
+ 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
+
+
+class DownloadThread(threading.Thread):
+
+ def __init__(self, obj, midway):
+ threading.Thread.__init__(self)
+ self.midway = midway
+ self.obj = obj
+ self.stopthread = threading.Event()
+
+ def _download(self):
+
+ def entry_type(entry):
+ for link in entry['links']:
+ if link['rel'] in \
+ [_REL_OPDS_POPULAR, _REL_OPDS_NEW, _REL_SUBSECTION]:
+ return "CATALOG"
+ else:
+ return 'BOOK'
+
+ logging.debug('feedparser version %s', feedparser.__version__)
+ if not self.obj.is_local() and self.midway == False:
+ uri = self.obj._uri + self.obj._queryterm.replace(' ', '+')
+ headers = {}
+ if self.obj._language is not None and self.obj._language != 'all':
+ headers['Accept-Language'] = self.obj._language
+ uri = uri + '&lang=' + self.obj._language
+ logging.error('Searching URL %s headers %s' % (uri, headers))
+ feedobj = feedparser.parse(uri, request_headers=headers)
+ else:
+ feedobj = feedparser.parse(self.obj._uri)
+
+ # Get catalog Type
+ CATALOG_TYPE = 'COMMON'
+ if 'links' in feedobj['feed']:
+ for link in feedobj['feed']['links']:
+ if link['rel'] == _REL_CRAWLABLE:
+ CATALOG_TYPE = 'CRAWLABLE'
+ break
+
+ for entry in feedobj['entries']:
+ if entry_type(entry) == 'BOOK' and CATALOG_TYPE is not 'CRAWLABLE':
+ self.obj._booklist.append(Book(self.obj._configuration, entry))
+ elif entry_type(entry) == 'CATALOG' or CATALOG_TYPE == 'CRAWLABLE':
+ self.obj._cataloglist.append( \
+ Book(self.obj._configuration, entry))
+
+ self.obj._feedobj = feedobj
+ self.obj._ready = True
+ GObject.idle_add(self.obj.notify_updated, self.midway)
+ return False
+
+ def run(self):
+ self._download()
+
+ def stop(self):
+ self.stopthread.set()
+
+
+class Book(object):
+
+ def __init__(self, configuration, entry, basepath=None):
+ self._entry = entry
+ self._basepath = basepath
+ self._configuration = configuration
+
+ def get_title(self):
+ try:
+ ret = self._entry['title']
+ except KeyError:
+ ret = 'Unknown'
+
+ return ret
+
+ def get_author(self):
+ try:
+ ret = self._entry['author']
+ except KeyError:
+ ret = 'Unknown'
+
+ return ret
+
+ def get_download_links(self):
+ ret = {}
+ for link in self._entry['links']:
+ if link['rel'] == _REL_OPDS_ACQUISTION:
+ if self._basepath is not None and \
+ not (link['href'].startswith('http') or \
+ link['href'].startswith('ftp')):
+ ret[link['type']] = 'file://' \
+ + os.path.join(self._basepath, link['href'])
+ else:
+ ret[link['type']] = link['href']
+ elif link['rel'] in \
+ [_REL_OPDS_POPULAR, _REL_OPDS_NEW, _REL_SUBSECTION]:
+ ret[link['type']] = link['href']
+ elif link['rel'] == _REL_ALTERNATE:
+ ret[link['type']] = link['href']
+ else:
+ pass
+ return ret
+
+ def get_publisher(self):
+ try:
+ ret = self._entry['dcterms_publisher']
+ except KeyError:
+ ret = 'Unknown'
+
+ return ret
+
+ def get_published_year(self):
+ try:
+ ret = self._entry['published']
+ except KeyError:
+ ret = 'Unknown'
+
+ return ret
+
+ def get_language(self):
+ try:
+ ret = self._entry['dcterms_language']
+ except KeyError:
+ ret = 'Unknown'
+
+ return ret
+
+ def get_image_url(self):
+ try:
+ ret = {}
+ for link in self._entry['links']:
+ if link['rel'] == self._configuration['opds_cover']:
+ if self._basepath is not None and \
+ not (link['href'].startswith('http') or \
+ link['href'].startswith('ftp')):
+ ret[link['type']] = 'file://' \
+ + os.path.join(self._basepath, link['href'])
+ else:
+ ret[link['type']] = link['href']
+ except KeyError:
+ ret = 'Unknown'
+ return ret
+
+ def get_summary(self):
+ if self._configuration is not None \
+ and 'summary_field' in self._configuration:
+ try:
+ ret = self._entry[self._configuration['summary_field']]
+ except KeyError:
+ ret = 'Unknown'
+ else:
+ ret = 'Unknown'
+ return ret
+
+ def get_object_id(self):
+ try:
+ ret = self._entry['object_id']
+ except KeyError:
+ ret = 'Unknown'
+
+ return ret
+
+ def match(self, terms):
+ #TODO: Make this more comprehensive
+ for term in terms.split('+'):
+ if term in self.get_title():
+ return True
+ if term in self.get_author():
+ return True
+ if term in self.get_publisher():
+ return True
+ return False
+
+
+class QueryResult(GObject.GObject):
+
+ __gsignals__ = {
+ 'updated': (GObject.SignalFlags.RUN_FIRST,
+ None,
+ ([bool])),
+ }
+
+ def __init__(self, configuration, queryterm, language):
+ GObject.GObject.__init__(self)
+ self._configuration = configuration
+ self._uri = self._configuration['query_uri']
+ self._queryterm = queryterm
+ self._language = language
+ self._feedobj = None
+ self._next_uri = ''
+ self._ready = False
+ self._booklist = []
+ self._cataloglist = []
+ self.threads = []
+ self._start_download()
+
+ def _start_download(self, midway=False):
+ d_thread = DownloadThread(self, midway)
+ self.threads.append(d_thread)
+ d_thread.start()
+
+ def notify_updated(self, midway):
+ self.emit('updated', midway)
+
+ def __len__(self):
+ return len(self._booklist)
+
+ def has_next(self):
+ '''
+ Returns True if more result pages are
+ available for the resultset
+ '''
+ if not 'links' in self._feedobj['feed']:
+ return False
+ for link in self._feedobj['feed']['links']:
+ if link['rel'] == u'next':
+ self._next_uri = link['href']
+ return True
+
+ return False
+
+ def update_with_next(self):
+ '''
+ Updates the booklist with the next resultset
+ '''
+ if len(self._next_uri) > 0:
+ self._ready = False
+ self._uri = self._next_uri
+ self.cancel() # XXX: Is this needed ?
+ self._start_download(midway=True)
+
+ def cancel(self):
+ '''
+ Cancels the query job
+ '''
+ for d_thread in self.threads:
+ d_thread.stop()
+
+ def get_book_n(self, n):
+ '''
+ Gets the n-th book
+ '''
+ return self._booklist[n]
+
+ def get_book_list(self):
+ '''
+ Gets the entire booklist
+ '''
+ return self._booklist
+
+ def get_catalog_list(self):
+ '''
+ Gets the entire catalog list
+ '''
+ return self._cataloglist
+
+ def is_ready(self):
+ '''
+ Returns False if a query is in progress
+ '''
+ return self._ready
+
+ def is_local(self):
+ '''
+ Returns True in case of a local school
+ server or a local device
+ (yay! for sneakernet)
+ '''
+ return False
+
+
+class LocalVolumeQueryResult(QueryResult):
+
+ def __init__(self, path, queryterm, language):
+ configuration = {'query_uri': os.path.join(path, 'catalog.xml')}
+ QueryResult.__init__(self, configuration, queryterm, language)
+
+ def is_local(self):
+ return True
+
+ def get_book_list(self):
+ ret = []
+ if self._queryterm is None or self._queryterm is '':
+ for entry in self._feedobj['entries']:
+ ret.append(Book(entry, basepath=os.path.dirname(self._uri)))
+ else:
+ for entry in self._feedobj['entries']:
+ book = Book(entry, basepath=os.path.dirname(self._uri))
+ if book.match(self._queryterm.replace(' ', '+')):
+ ret.append(book)
+ return ret
+
+
+class RemoteQueryResult(QueryResult):
+
+ def __init__(self, configuration, queryterm, language):
+ QueryResult.__init__(self, configuration, queryterm, language)
+
+
+class IABook(Book):
+
+ def __init__(self, configuration, entry, basepath=None):
+ Book.__init__(self, configuration, entry, basepath=None)
+
+ def get_download_links(self):
+ return self._entry['links']
+
+ def get_image_url(self):
+ return {'jpg': self._entry['cover_image']}
+
+
+class DownloadIAThread(threading.Thread):
+
+ def __init__(self, obj, midway):
+ threading.Thread.__init__(self)
+ self.midway = midway
+ self.obj = obj
+ self._download_content_length = 0
+ self._download_content_type = None
+ self._booklist = []
+ queryterm = self.obj._queryterm
+ # search_tuple = queryterm.lower().split()
+ FL = urllib.quote('fl[]')
+ SORT = urllib.quote('sort[]')
+ self.search_url = 'http://www.archive.org/advancedsearch.php?q=' + \
+ urllib.quote('(title:(' + self.obj._queryterm.lower() + ') OR ' + \
+ 'creator:(' + queryterm.lower() + ')) AND format:(DJVU)')
+ self.search_url += '&' + FL + '=creator&' + FL + '=description&' + \
+ FL + '=format&' + FL + '=identifier&' + FL + '=language'
+ self.search_url += '&' + FL + '=publisher&' + FL + '=title&' + \
+ FL + '=volume'
+ self.search_url += '&' + SORT + '=title&' + SORT + '&' + \
+ SORT + '=&rows=500&save=yes&fmt=csv&xmlsearch=Search'
+ self.stopthread = threading.Event()
+
+ def _download(self):
+ GObject.idle_add(self.download_csv, self.search_url)
+
+ def download_csv(self, url):
+ logging.error('get csv from %s', url)
+ path = os.path.join(self.obj._activity.get_activity_root(), 'instance',
+ 'tmp%i.csv' % time.time())
+ print 'path=', path
+ getter = ReadURLDownloader(url)
+ getter.connect("finished", self._get_csv_result_cb)
+ getter.connect("progress", self._get_csv_progress_cb)
+ getter.connect("error", self._get_csv_error_cb)
+ _logger.debug("Starting download to %s...", path)
+ try:
+ getter.start(path)
+ except:
+ pass
+ self._download_content_type = getter.get_content_type()
+
+ def _get_csv_progress_cb(self, getter, bytes_downloaded):
+ if self._download_content_length > 0:
+ _logger.debug("Downloaded %u of %u bytes...",
+ bytes_downloaded, self._download_content_length)
+ else:
+ _logger.debug("Downloaded %u bytes...",
+ bytes_downloaded)
+
+ def _get_csv_error_cb(self, getter, err):
+ _logger.debug("Error getting CSV: %s", err)
+ self._download_content_length = 0
+ self._download_content_type = None
+
+ def _get_csv_result_cb(self, getter, tempfile, suggested_name):
+ print 'Content type:', self._download_content_type
+ if self._download_content_type.startswith('text/html'):
+ # got an error page instead
+ self._get_csv_error_cb(getter, 'HTTP Error')
+ return
+ self.process_downloaded_csv(tempfile, suggested_name)
+
+ def process_downloaded_csv(self, tempfile, suggested_name):
+ reader = csv.reader(open(tempfile, 'rb'))
+ reader.next() # skip the first header row.
+ for row in reader:
+ if len(row) < 7:
+ _logger.debug("Server Error: %s", self.search_url)
+ return
+ entry = {}
+ entry['author'] = row[0]
+ entry['description'] = row[1]
+ entry['format'] = row[2]
+ entry['identifier'] = row[3]
+ entry['dcterms_language'] = row[4]
+ entry['dcterms_publisher'] = row[5]
+ entry['title'] = row[6]
+ volume = row[7]
+ if volume is not None and len(volume) > 0:
+ entry['title'] = row[6] + 'Volume ' + volume
+
+ entry['links'] = {}
+ url_base = 'http://www.archive.org/download/' + \
+ row[3] + '/' + row[3]
+
+ if entry['format'].find('DjVu') > -1:
+ entry['links']['image/x.djvu'] = url_base + '.djvu'
+ if entry['format'].find('Grayscale LuraTech PDF') > -1:
+ # Fake mime type
+ entry['links']['application/pdf-bw'] = url_base + '_bw.pdf'
+ if entry['format'].find('PDF') > -1:
+ entry['links']['application/pdf'] = url_base + '_text.pdf'
+ if entry['format'].find('EPUB') > -1:
+ entry['links']['application/epub+zip'] = url_base + '.epub'
+ entry['cover_image'] = 'http://www.archive.org/download/' + \
+ row[3] + '/page/cover_thumb.jpg'
+
+ self.obj._booklist.append(IABook(None, entry, ''))
+
+ os.remove(tempfile)
+ GObject.idle_add(self.obj.notify_updated, self.midway)
+ self.obj._ready = True
+ return False
+
+ def run(self):
+ self._download()
+
+ def stop(self):
+ self.stopthread.set()
+
+
+class InternetArchiveQueryResult(QueryResult):
+
+ # Search in internet archive does not use OPDS
+ # because the server implementation is not working very well
+
+ def __init__(self, queryterm, language, activity):
+ GObject.GObject.__init__(self)
+ self._activity = activity
+ self._queryterm = queryterm
+ self._language = language
+ self._next_uri = ''
+ self._ready = False
+ self._booklist = []
+ self._cataloglist = []
+ self.threads = []
+ self._start_download()
+
+ def notify_updated(self, midway):
+ self.emit('updated', midway)
+
+ def _start_download(self, midway=False):
+ d_thread = DownloadIAThread(self, midway)
+ self.threads.append(d_thread)
+ d_thread.start()
+
+
+class ImageDownloaderThread(threading.Thread):
+
+ def __init__(self, obj):
+ threading.Thread.__init__(self)
+ self.obj = obj
+ self._getter = ReadURLDownloader(self.obj._url)
+ self._download_content_length = 0
+ self._download_content_type = None
+ self.stopthread = threading.Event()
+
+ def _download_image(self):
+ path = os.path.join(self.obj._activity.get_activity_root(),
+ 'instance', 'tmp%i' % time.time())
+ self._getter.connect("finished", self._get_image_result_cb)
+ self._getter.connect("progress", self._get_image_progress_cb)
+ self._getter.connect("error", self._get_image_error_cb)
+ _logger.debug("Starting download to %s...", path)
+ try:
+ self._getter.start(path)
+ except:
+ _logger.debug("Connection timed out for")
+ GObject.idle_add(self.obj.notify_updated, None)
+
+ self._download_content_length = \
+ self._getter.get_content_length()
+ self._download_content_type = self._getter.get_content_type()
+
+ def _get_image_result_cb(self, getter, tempfile, suggested_name):
+ _logger.debug("Got Cover Image %s (%s)", tempfile, suggested_name)
+ self._getter = None
+ if not self.stopthread.is_set():
+ GObject.idle_add(self.obj.notify_updated, tempfile)
+
+ def _get_image_progress_cb(self, getter, bytes_downloaded):
+ if self.stopthread.is_set():
+ try:
+ _logger.debug('The download %s was cancelled' % getter._fname)
+ getter.cancel()
+ except:
+ _logger.debug('Got an exception while trying ' + \
+ 'to cancel download')
+ if self._download_content_length > 0:
+ _logger.debug("Downloaded %u of %u bytes...", bytes_downloaded,
+ self._download_content_length)
+ else:
+ _logger.debug("Downloaded %u bytes...",
+ bytes_downloaded)
+ while Gtk.events_pending():
+ Gtk.main_iteration()
+
+ def _get_image_error_cb(self, getter, err):
+ _logger.debug("Error getting image: %s", err)
+ self._download_content_length = 0
+ self._download_content_type = None
+ self._getter = None
+ GObject.idle_add(self.obj.notify_updated, None)
+
+ def run(self):
+ self._download_image()
+
+ def stop(self):
+ self.stopthread.set()
+
+
+class ImageDownloader(GObject.GObject):
+
+ __gsignals__ = {
+ 'updated': (GObject.SignalFlags.RUN_FIRST,
+ None,
+ ([GObject.TYPE_STRING])),
+ }
+
+ def __init__(self, activity, url):
+ GObject.GObject.__init__(self)
+ self.threads = []
+ self._activity = activity
+ self._url = url
+ self._start_download()
+
+ def _start_download(self):
+ d_thread = ImageDownloaderThread(self)
+ self.threads.append(d_thread)
+ d_thread.start()
+
+ def notify_updated(self, temp_file):
+ self.emit('updated', temp_file)
+
+ def stop_download(self):
+ for thread in self.threads:
+ thread.stop()
diff --git a/opds.pyc b/opds.pyc
new file mode 100644
index 0000000..7db3ebc
--- /dev/null
+++ b/opds.pyc
Binary files differ
diff --git a/po/GetBooks.pot b/po/GetBooks.pot
new file mode 100644
index 0000000..4a2611a
--- /dev/null
+++ b/po/GetBooks.pot
@@ -0,0 +1,146 @@
+# 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: 2011-08-08 10:43-0300\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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:98
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:260
+msgid "Any language"
+msgstr ""
+
+#: GetIABooksActivity.py:272 GetIABooksActivity.py:394
+#: GetIABooksActivity.py:481 GetIABooksActivity.py:487
+msgid "Catalogs"
+msgstr ""
+
+#: GetIABooksActivity.py:313 GetIABooksActivity.py:777
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:353
+msgid "My books"
+msgstr ""
+
+#: GetIABooksActivity.py:368
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:538
+msgid "Format:"
+msgstr ""
+
+#: GetIABooksActivity.py:551
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:578
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:599
+msgid "Selected book"
+msgstr ""
+
+#: GetIABooksActivity.py:618
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:620
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:624
+msgid "Summary:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:633
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:634
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:761
+msgid "You must enter at least 3 letters."
+msgstr ""
+
+#: GetIABooksActivity.py:784
+#, python-format
+msgid "New catalog list %s was found"
+msgstr ""
+
+#: GetIABooksActivity.py:788
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:804
+msgid "Sorry, we only found english books."
+msgstr ""
+
+#: GetIABooksActivity.py:897
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:897
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:942
+#, python-format
+msgid "Error: Could not download %s. "
+msgstr ""
+
+#: GetIABooksActivity.py:1000
+msgid "Download completed"
+msgstr ""
+
+#: GetIABooksActivity.py:1008
+msgid "Show in Journal"
+msgstr ""
+
+#: GetIABooksActivity.py:1011
+msgid "Ok"
+msgstr ""
+
+#: listview.py:39
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:43
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:45
+msgid "Language"
+msgstr ""
+
+#: listview.py:47
+msgid "Publish Date"
+msgstr ""
diff --git a/po/af.po b/po/af.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/af.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ak.po b/po/ak.po
new file mode 100644
index 0000000..73af20b
--- /dev/null
+++ b/po/ak.po
@@ -0,0 +1,110 @@
+# 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: 2010-01-20 00:33-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.7.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/am.po b/po/am.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/am.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ar.po b/po/ar.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ar.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ar_SY.po b/po/ar_SY.po
new file mode 100644
index 0000000..3f32c9e
--- /dev/null
+++ b/po/ar_SY.po
@@ -0,0 +1,142 @@
+# 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.
+# 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.
+# 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.
+# 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.
+# 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: 2010-01-20 00:33-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.3.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ay.po b/po/ay.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ay.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/bg.po b/po/bg.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/bi.po b/po/bi.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/bi.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/bn.po b/po/bn.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/bn.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/bn_IN.po b/po/bn_IN.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/bn_IN.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/bs.po b/po/bs.po
new file mode 100644
index 0000000..73d305d
--- /dev/null
+++ b/po/bs.po
@@ -0,0 +1,110 @@
+# 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: 2010-01-20 00:33-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.6.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/cpp.po b/po/cpp.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/cpp.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/da.po b/po/da.po
new file mode 100644
index 0000000..73af20b
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,110 @@
+# 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: 2010-01-20 00:33-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.7.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..a6172ee
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,112 @@
+# 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: 2010-01-20 00:33-0500\n"
+"PO-Revision-Date: 2010-03-27 23:22+0200\n"
+"Last-Translator: shellige <email@hellige-online.de>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr "Bücher erhalten"
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr "Buch erhalten"
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB Band"
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr "Bücher"
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr "Schlagwörter (Autor oder Titel) eingeben um die Suche zu beginnen."
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr "Titel:\t\t"
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr "Autor:\t\t"
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr "Herausgeber:\t"
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr "Sprache:\t"
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr "Link:\t\t"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr "Fehler"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr "Du mußt mindestens ein Suchwort eingeben."
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr "Suche wird ausgeführt, bitte warten..."
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr "Sorry, es konnten keine Bücher gefunden werden."
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr "Verbindungszeit überschritten für "
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+"Fehler: Konnte %s nicht laden. Der angegebene Pfad scheint falsch zu sein."
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr "Erfolg: %s dem Journal zugefügt."
+
+#: listview.py:40
+msgid "Title"
+msgstr "Titel"
+
+#: listview.py:41
+msgid "Author"
+msgstr "Autor"
+
+#: listview.py:42
+msgid "Publisher"
+msgstr "Herausgeber"
+
+#: listview.py:43
+msgid "Language"
+msgstr "Sprache"
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr "Veröffentlichung"
diff --git a/po/dz.po b/po/dz.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/dz.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/el.po b/po/el.po
new file mode 100644
index 0000000..c42b095
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,117 @@
+# 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-11-26 16:55+0530\n"
+"PO-Revision-Date: 2009-12-17 13:47-0400\n"
+"Last-Translator: Γιάννης Κασκαμανίδης <ttnfy17@yahoo.gr>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: el\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 "Get Books"
+msgstr "Προμήθεια βιβλίων"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr "Προμήθεια βιβλίου"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB Ένταση"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr "Βιβλία"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+"Εισάγετε λέξεις από το ονοματεπώνυμο του συγγραφέα ή τον τίτλο του βιβλίου, "
+"για να ξεκινήσει η αναζήτηση."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr "Τίτλος:\t\t"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr "Συγγραφέας:\t\t"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr "Εκδότης:\t"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr "Γλώσσα:\t"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr "Σύνδεσμος:\t\t"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr "Σφάλμα"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr "Πρέπει να εισάγετε τουλάχιστον μια λέξη για αναζήτηση."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr "Εκτέλεση αναζήτησης, παρακαλώ περιμένετε..."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr "Συγνώμη, αλλά δεν είναι δυνατόν να βρεθούν βιβλία."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr "Λήξη χρόνου σύνδεσης για "
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+"Σφάλμα: Αδυναμία λήψης του%s . Η διαδρομή στον κατάλογο φαίνεται να είναι "
+"λανθασμένη."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr "Επιτυχία: %s προστέθηκαν στο Ημερολόγιο."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr "Τίτλος"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr "Συγγραφέας"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr "Εκδότης"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr "Γλώσσα"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr "Ημερομηνία έκδοσης"
diff --git a/po/en.po b/po/en.po
new file mode 100644
index 0000000..f300436
--- /dev/null
+++ b/po/en.po
@@ -0,0 +1,189 @@
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-04-29 00:31-0400\n"
+"PO-Revision-Date: 2011-06-03 07:35+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: en\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 "Get Books"
+msgstr "Get Books"
+
+#: GetIABooksActivity.py:96
+msgid "Books"
+msgstr "Books"
+
+#: GetIABooksActivity.py:250
+msgid "Any language"
+msgstr "Any language"
+
+#: GetIABooksActivity.py:262
+msgid "Catalogs"
+msgstr "Catalogs"
+
+#: GetIABooksActivity.py:308 GetIABooksActivity.py:668
+msgid "Performing lookup, please wait..."
+msgstr "Performing lookup, please wait..."
+
+#: GetIABooksActivity.py:348
+msgid "My books"
+msgstr "My books"
+
+#: GetIABooksActivity.py:363
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB Volume"
+
+#: GetIABooksActivity.py:433
+msgid "Format:"
+msgstr "Format:"
+
+#: GetIABooksActivity.py:446
+msgid "Get Book"
+msgstr "Get Book"
+
+#: GetIABooksActivity.py:472
+msgid "Enter words from the Author or Title to begin search."
+msgstr "Enter words from the Author or Title to begin search."
+
+#: GetIABooksActivity.py:493
+msgid "Selected book"
+msgstr "Selected book"
+
+#: GetIABooksActivity.py:512
+msgid "Title:\t\t"
+msgstr "Title:\t\t"
+
+#: GetIABooksActivity.py:514
+msgid "Author:\t\t"
+msgstr "Author:\t\t"
+
+#: GetIABooksActivity.py:516
+msgid "Publisher:\t"
+msgstr "Publisher:\t"
+
+#: GetIABooksActivity.py:525
+msgid "Language:\t"
+msgstr "Language:\t"
+
+#: GetIABooksActivity.py:531
+msgid "Link:\t\t"
+msgstr "Link:\t\t"
+
+#: GetIABooksActivity.py:652
+msgid "You must enter at least 3 letters."
+msgstr "You must enter at least 3 letters."
+
+#: GetIABooksActivity.py:676
+msgid "Sorry, no books could be found."
+msgstr "Sorry, no books could be found."
+
+#: GetIABooksActivity.py:691
+msgid "Sorry, we only found english books."
+msgstr "Sorry, we only found english books."
+
+#: GetIABooksActivity.py:752
+msgid "Error"
+msgstr "Error"
+
+#: GetIABooksActivity.py:752
+msgid "Connection timed out for "
+msgstr "Connection timed out for "
+
+#: GetIABooksActivity.py:797
+#, python-format
+msgid "Error: Could not download %s. "
+msgstr "Error: Could not download %s. "
+
+#: GetIABooksActivity.py:853
+msgid "Download completed"
+msgstr "Download completed"
+
+#: GetIABooksActivity.py:861
+msgid "Show in Journal"
+msgstr "Show in Journal"
+
+#: GetIABooksActivity.py:864
+msgid "Ok"
+msgstr "Ok"
+
+#: listview.py:39
+msgid "Title"
+msgstr "Title"
+
+#: listview.py:41
+msgid "Author"
+msgstr "Author"
+
+#: listview.py:43
+msgid "Publisher"
+msgstr "Publisher"
+
+#: listview.py:45
+msgid "Language"
+msgstr "Language"
+
+#: listview.py:47
+msgid "Publish Date"
+msgstr "Publish Date"
+
+#~ msgid "You must enter at least one search word."
+#~ msgstr "You must enter at least one search word."
+
+#, python-format
+#~ msgid ""
+#~ "Error: Could not download %s . The path in the catalog seems to be incorrect"
+#~ msgstr ""
+#~ "Error: Could not download %s . The path in the catalog seems to be incorrect"
+
+#, python-format
+#~ msgid "Success: %s was added to Journal."
+#~ msgstr "Success: %s was added to Journal."
diff --git a/po/en_GB.po b/po/en_GB.po
new file mode 100644
index 0000000..22c59b0
--- /dev/null
+++ b/po/en_GB.po
@@ -0,0 +1,174 @@
+# 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.
+# 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.
+# 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.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-04-29 00:31-0400\n"
+"PO-Revision-Date: 2011-06-03 08:16+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: en_GB\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 "Get Books"
+msgstr "Get Books"
+
+#: GetIABooksActivity.py:96
+msgid "Books"
+msgstr "Books"
+
+#: GetIABooksActivity.py:250
+msgid "Any language"
+msgstr "Any language"
+
+#: GetIABooksActivity.py:262
+msgid "Catalogs"
+msgstr "Catalogs"
+
+#: GetIABooksActivity.py:308 GetIABooksActivity.py:668
+msgid "Performing lookup, please wait..."
+msgstr "Performing lookup, please wait..."
+
+#: GetIABooksActivity.py:348
+msgid "My books"
+msgstr "My books"
+
+#: GetIABooksActivity.py:363
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB Volume"
+
+#: GetIABooksActivity.py:433
+msgid "Format:"
+msgstr "Format:"
+
+#: GetIABooksActivity.py:446
+msgid "Get Book"
+msgstr "Get Book"
+
+#: GetIABooksActivity.py:472
+msgid "Enter words from the Author or Title to begin search."
+msgstr "Enter words from the Author or Title to begin search."
+
+#: GetIABooksActivity.py:493
+msgid "Selected book"
+msgstr "Selected book"
+
+#: GetIABooksActivity.py:512
+msgid "Title:\t\t"
+msgstr "Title:\t\t"
+
+#: GetIABooksActivity.py:514
+msgid "Author:\t\t"
+msgstr "Author:\t\t"
+
+#: GetIABooksActivity.py:516
+msgid "Publisher:\t"
+msgstr "Publisher:\t"
+
+#: GetIABooksActivity.py:525
+msgid "Language:\t"
+msgstr "Language:\t"
+
+#: GetIABooksActivity.py:531
+msgid "Link:\t\t"
+msgstr "Link:\t\t"
+
+#: GetIABooksActivity.py:652
+msgid "You must enter at least 3 letters."
+msgstr "You must enter at least 3 letters."
+
+#: GetIABooksActivity.py:676
+msgid "Sorry, no books could be found."
+msgstr "Sorry, no books could be found."
+
+#: GetIABooksActivity.py:691
+msgid "Sorry, we only found english books."
+msgstr "Sorry, we only found English books."
+
+#: GetIABooksActivity.py:752
+msgid "Error"
+msgstr "Error"
+
+#: GetIABooksActivity.py:752
+msgid "Connection timed out for "
+msgstr "Connection timed out for "
+
+#: GetIABooksActivity.py:797
+#, python-format
+msgid "Error: Could not download %s. "
+msgstr "Error: Could not download %s. "
+
+#: GetIABooksActivity.py:853
+msgid "Download completed"
+msgstr "Download completed"
+
+#: GetIABooksActivity.py:861
+msgid "Show in Journal"
+msgstr "Show in Journal"
+
+#: GetIABooksActivity.py:864
+msgid "Ok"
+msgstr "Ok"
+
+#: listview.py:39
+msgid "Title"
+msgstr "Title"
+
+#: listview.py:41
+msgid "Author"
+msgstr "Author"
+
+#: listview.py:43
+msgid "Publisher"
+msgstr "Publisher"
+
+#: listview.py:45
+msgid "Language"
+msgstr "Language"
+
+#: listview.py:47
+msgid "Publish Date"
+msgstr "Publish Date"
+
+#~ msgid "You must enter at least one search word."
+#~ msgstr "You must enter at least one search word."
+
+#, python-format
+#~ msgid ""
+#~ "Error: Could not download %s . The path in the catalog seems to be incorrect"
+#~ msgstr ""
+#~ "Error: Could not download %s . The path in the catalogue seems to be "
+#~ "incorrect"
+
+#, python-format
+#~ msgid "Success: %s was added to Journal."
+#~ msgstr "Success: %s was added to Journal."
diff --git a/po/en_US.po b/po/en_US.po
new file mode 100644
index 0000000..b0a2a3c
--- /dev/null
+++ b/po/en_US.po
@@ -0,0 +1,177 @@
+# 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.
+# 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.
+# 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.
+# 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: 2011-04-29 00:31-0400\n"
+"PO-Revision-Date: 2011-06-02 07:50+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: en_US\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 "Get Books"
+msgstr "Get Books"
+
+#: GetIABooksActivity.py:96
+msgid "Books"
+msgstr "Books"
+
+#: GetIABooksActivity.py:250
+msgid "Any language"
+msgstr "Any language"
+
+#: GetIABooksActivity.py:262
+msgid "Catalogs"
+msgstr "Catalogs"
+
+#: GetIABooksActivity.py:308 GetIABooksActivity.py:668
+msgid "Performing lookup, please wait..."
+msgstr "Performing lookup, please wait..."
+
+#: GetIABooksActivity.py:348
+msgid "My books"
+msgstr "My books"
+
+#: GetIABooksActivity.py:363
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB Volume"
+
+#: GetIABooksActivity.py:433
+msgid "Format:"
+msgstr "Format:"
+
+#: GetIABooksActivity.py:446
+msgid "Get Book"
+msgstr "Get Book"
+
+#: GetIABooksActivity.py:472
+msgid "Enter words from the Author or Title to begin search."
+msgstr "Enter words from the Author or Title to begin search."
+
+#: GetIABooksActivity.py:493
+msgid "Selected book"
+msgstr "Selected book"
+
+#: GetIABooksActivity.py:512
+msgid "Title:\t\t"
+msgstr "Title:\t\t"
+
+#: GetIABooksActivity.py:514
+msgid "Author:\t\t"
+msgstr "Author:\t\t"
+
+#: GetIABooksActivity.py:516
+msgid "Publisher:\t"
+msgstr "Publisher:\t"
+
+#: GetIABooksActivity.py:525
+msgid "Language:\t"
+msgstr "Language:\t"
+
+#: GetIABooksActivity.py:531
+msgid "Link:\t\t"
+msgstr "Link:\t\t"
+
+#: GetIABooksActivity.py:652
+msgid "You must enter at least 3 letters."
+msgstr "You must enter at least 3 letters."
+
+#: GetIABooksActivity.py:676
+msgid "Sorry, no books could be found."
+msgstr "Sorry, no books could be found."
+
+#: GetIABooksActivity.py:691
+msgid "Sorry, we only found english books."
+msgstr "Sorry, we only found english books."
+
+#: GetIABooksActivity.py:752
+msgid "Error"
+msgstr "Error"
+
+#: GetIABooksActivity.py:752
+msgid "Connection timed out for "
+msgstr "Connection timed out for "
+
+#: GetIABooksActivity.py:797
+#, python-format
+msgid "Error: Could not download %s. "
+msgstr "Error: Could not download %s. "
+
+#: GetIABooksActivity.py:853
+msgid "Download completed"
+msgstr "Download completed"
+
+#: GetIABooksActivity.py:861
+msgid "Show in Journal"
+msgstr "Show in Journal"
+
+#: GetIABooksActivity.py:864
+msgid "Ok"
+msgstr "Ok"
+
+#: listview.py:39
+msgid "Title"
+msgstr "Title"
+
+#: listview.py:41
+msgid "Author"
+msgstr "Author"
+
+#: listview.py:43
+msgid "Publisher"
+msgstr "Publisher"
+
+#: listview.py:45
+msgid "Language"
+msgstr "Language"
+
+#: listview.py:47
+msgid "Publish Date"
+msgstr "Publish Date"
+
+#~ msgid "You must enter at least one search word."
+#~ msgstr "You must enter at least one search word."
+
+#, python-format
+#~ msgid ""
+#~ "Error: Could not download %s . The path in the catalog seems to be incorrect"
+#~ msgstr ""
+#~ "Error: Could not download %s . The path in the catalog seems to be incorrect"
+
+#, python-format
+#~ msgid "Success: %s was added to Journal."
+#~ msgstr "Success: %s was added to Journal."
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 0000000..486a677
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,298 @@
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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: 2010-01-20 00:33-0500\n"
+"PO-Revision-Date: 2010-12-23 18:06+0200\n"
+"Last-Translator: Gonzalo <godiard@sugarlabs.org>\n"
+"Language-Team: Spanish <LL@li.org>\n"
+"Language: es\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 "Get Books"
+msgstr "Biblioteca Ceibal"
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr "Descargar archivo"
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB Volumen"
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr "Libros"
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+"Introduzca palabras que describan el autor o título para empezar búsqueda."
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr "Título:\t\t"
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr "Autor:\t\t"
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr "Editor:\t"
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr "Lenguaje:\t"
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr "Link:\t\t"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr "Error"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr "Debes indroducir al menos una palabra para buscar."
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr "Realizando busqueda, por favor espere..."
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr "Lo sentimos, no se pudieron encontrar libros."
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr "Se perdio la conexión para "
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+"Error: No se pudo descargar %s . La ruta en el catalogo parece incorrecta"
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr "Éxito: %s se añadio al diario."
+
+#: listview.py:40
+msgid "Title"
+msgstr "Título"
+
+#: listview.py:41
+msgid "Author"
+msgstr "Autor"
+
+#: listview.py:42
+msgid "Publisher"
+msgstr "Editor"
+
+#: listview.py:43
+msgid "Language"
+msgstr "Lenguaje"
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr "Fecha de publicación"
+
+#: GetBooksActivity.py:275
+msgid "Catalogs"
+msgstr "Catalogos"
+
+#: GetBooksActivity
+msgid "Format:"
+msgstr "Formato:"
+
+msgid "Selected book"
+msgstr "Libro Seleccionado"
+
+msgid "Summary:\t"
+msgstr "Sumario:\t"
+
+msgid "You must enter at least 3 letters."
+msgstr "Debes ingresar al menos 3 letras."
+
+msgid "New catalog list %s was found"
+msgstr "Se encontró la nueva categoría de nombre: %s"
+
+msgid "Sorry, we only found english books."
+msgstr "Lo siento, solo encontramos libros en inglés."
+
+msgid "Any language"
+msgstr "Cualquier lenguaje"
+
+msgid "Show in Journal"
+msgstr "Mostrar en el Diario"
+
+msgid "My books"
+msgstr "Mis libros"
+
diff --git a/po/fa.po b/po/fa.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/fa.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/fa_AF.po b/po/fa_AF.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/fa_AF.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ff.po b/po/ff.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ff.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/fi.po b/po/fi.po
new file mode 100644
index 0000000..73d305d
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,110 @@
+# 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: 2010-01-20 00:33-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.6.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/fil.po b/po/fil.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/fil.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..2f7b4bd
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,133 @@
+# 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.
+# 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.
+# 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.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-01-20 00:33-0500\n"
+"PO-Revision-Date: 2010-02-24 23:37+0200\n"
+"Last-Translator: samy boutayeb <s.boutayeb@free.fr>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Get Books"
+msgstr "Livres à moi"
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr "Obtenir un livre"
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "Volume %.2f Go"
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr "Livres"
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr "Entrer les mots de l'auteur ou du titre pour commencer la recherche."
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr "Titre :\t\t"
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr "Auteur :\t\t"
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr "Éditeur :\t"
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr "Langue :\t"
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr "Lien :\t\t"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr "Erreur"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr "Entrez au moins un mot pour la recherche."
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr "Recherche en cours, patientez..."
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr "Désolé, aucun livre n'a été trouvé."
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr "Délai de connexion écoulé pour "
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+"Erreur : Téléchargement de %s impossible. Le chemin indiqué dans le "
+"catalogue est incorrect"
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr "Opération réussie : %s a été ajouté au Journal."
+
+#: listview.py:40
+msgid "Title"
+msgstr "Titre"
+
+#: listview.py:41
+msgid "Author"
+msgstr "Auteur"
+
+#: listview.py:42
+msgid "Publisher"
+msgstr "Éditeur"
+
+#: listview.py:43
+msgid "Language"
+msgstr "Langue"
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr "Date de publication"
diff --git a/po/gu.po b/po/gu.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/gu.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ha.po b/po/ha.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ha.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/he.po b/po/he.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/he.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/hi.po b/po/hi.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/hi.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ht.po b/po/ht.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ht.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..cb2cb68
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\n"
+"PO-Revision-Date: 2009-12-21 22:51-0400\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr "Hiba"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/hy.po b/po/hy.po
new file mode 100644
index 0000000..f03db1a
--- /dev/null
+++ b/po/hy.po
@@ -0,0 +1,174 @@
+# 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.
+# 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.
+# 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.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-04-29 00:31-0400\n"
+"PO-Revision-Date: 2011-07-29 19:38+0200\n"
+"Last-Translator: <anush.mkrtchyan@ca1492.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: hy\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 "Get Books"
+msgstr "Գտնել Գրքեր"
+
+#: GetIABooksActivity.py:96
+msgid "Books"
+msgstr "Գրքեր"
+
+#: GetIABooksActivity.py:250
+msgid "Any language"
+msgstr "Ցանկացած լեզու"
+
+#: GetIABooksActivity.py:262
+msgid "Catalogs"
+msgstr "Կատալոգներ"
+
+#: GetIABooksActivity.py:308 GetIABooksActivity.py:668
+msgid "Performing lookup, please wait..."
+msgstr "Կատարվում է որոնումը, խնդրվում է սպասել..."
+
+#: GetIABooksActivity.py:348
+msgid "My books"
+msgstr "Իմ գրքերը"
+
+#: GetIABooksActivity.py:363
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB Ծավալ"
+
+#: GetIABooksActivity.py:433
+msgid "Format:"
+msgstr "Ձևաչափ`"
+
+#: GetIABooksActivity.py:446
+msgid "Get Book"
+msgstr "Գտնել Գիրք"
+
+#: GetIABooksActivity.py:472
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+"Մուտքագրեք հեղինակի անունը կամ վերնագրի մասը գրքի որոնումը սկսելու համար:"
+
+#: GetIABooksActivity.py:493
+msgid "Selected book"
+msgstr "ընտրված գիրք"
+
+#: GetIABooksActivity.py:512
+msgid "Title:\t\t"
+msgstr "Վերնագիր.\t\t"
+
+#: GetIABooksActivity.py:514
+msgid "Author:\t\t"
+msgstr "Հեղինակ.\t\t"
+
+#: GetIABooksActivity.py:516
+msgid "Publisher:\t"
+msgstr "Հրատարակիչ.\t"
+
+#: GetIABooksActivity.py:525
+msgid "Language:\t"
+msgstr "Լեզու.\t"
+
+#: GetIABooksActivity.py:531
+msgid "Link:\t\t"
+msgstr "Հղում.\t\t"
+
+#: GetIABooksActivity.py:652
+msgid "You must enter at least 3 letters."
+msgstr "Դուք պետք է մուտքագրեք առնվազն 3 տառ:"
+
+#: GetIABooksActivity.py:676
+msgid "Sorry, no books could be found."
+msgstr "Ներեցեք, ոչ մի գիրք չի գտնվել:"
+
+#: GetIABooksActivity.py:691
+msgid "Sorry, we only found english books."
+msgstr "ներեցեք, մենք գտանք միայն անգլերեն գրքեր:"
+
+#: GetIABooksActivity.py:752
+msgid "Error"
+msgstr "Վրիպում"
+
+#: GetIABooksActivity.py:752
+msgid "Connection timed out for "
+msgstr "Կապը ժամասպառվել է "
+
+#: GetIABooksActivity.py:797
+#, python-format
+msgid "Error: Could not download %s. "
+msgstr "Սխալմունք: Չհաջողվեց բեռնել %s: "
+
+#: GetIABooksActivity.py:853
+msgid "Download completed"
+msgstr "բեռնումը ավարտված է"
+
+#: GetIABooksActivity.py:861
+msgid "Show in Journal"
+msgstr "Ցույց տալ ամսագրում"
+
+#: GetIABooksActivity.py:864
+msgid "Ok"
+msgstr "լավ"
+
+#: listview.py:39
+msgid "Title"
+msgstr "Վերնագիր"
+
+#: listview.py:41
+msgid "Author"
+msgstr "Հեղինակ"
+
+#: listview.py:43
+msgid "Publisher"
+msgstr "Հրատարակիչ"
+
+#: listview.py:45
+msgid "Language"
+msgstr "Լեզու"
+
+#: listview.py:47
+msgid "Publish Date"
+msgstr "Հրատարակման թիվը"
+
+#~ msgid "You must enter at least one search word."
+#~ msgstr "Դուք պետք է մուտքագրեք նվազագույնը մեկ որոնման բառ:"
+
+#, python-format
+#~ msgid ""
+#~ "Error: Could not download %s . The path in the catalog seems to be incorrect"
+#~ msgstr ""
+#~ "Վրիպում. Հնարավոր չէ բեռնել %s . Գրացուցակում հայտարարված ուղին ոչ ճշգրիտ է:"
+
+#, python-format
+#~ msgid "Success: %s was added to Journal."
+#~ msgstr "Հաջողում. %s ավելացվեց մատյանում:"
diff --git a/po/id.po b/po/id.po
new file mode 100644
index 0000000..9f42041
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,138 @@
+# 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.
+# 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.
+# 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.
+# 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.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-01-20 00:33-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.5.2\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ig.po b/po/ig.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ig.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/is.po b/po/is.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/is.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..7b04625
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,133 @@
+# 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.
+# 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.
+# 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.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-01-20 00:33-0500\n"
+"PO-Revision-Date: 2010-03-25 22:28+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\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 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr "Trova Libri"
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr "Trova un Libro"
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB Volume"
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr "Libri"
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr "Inserisci dati su autore o titolo per iniziare la ricerca."
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr "Titolo:\t\t"
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr "Autore:\t\t"
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr "Editore:\t"
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr "Lingua:\t"
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr "Link:\t\t"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr "Errore"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr "Bisogna inserire almeno una parola per la ricerca."
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr "Ricerca in corso, per favore attendere..."
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr "Spiacente, non ho trovato libri."
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr "Connessione fuori tempo massimo per "
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+"Errore: Non posso scaricare %s . Il percorso presente nel catalogo parrebbe "
+"sbagliato"
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr "Successo: %s è stato copiato nel Diario."
+
+#: listview.py:40
+msgid "Title"
+msgstr "Titolo"
+
+#: listview.py:41
+msgid "Author"
+msgstr "Autore"
+
+#: listview.py:42
+msgid "Publisher"
+msgstr "Editore"
+
+#: listview.py:43
+msgid "Language"
+msgstr "Lingua"
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr "Data di pubblicazione"
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/km.po b/po/km.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/km.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/kn.po b/po/kn.po
new file mode 100644
index 0000000..73d305d
--- /dev/null
+++ b/po/kn.po
@@ -0,0 +1,110 @@
+# 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: 2010-01-20 00:33-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.6.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ko.po b/po/ko.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/kos.po b/po/kos.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/kos.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ku.po b/po/ku.po
new file mode 100644
index 0000000..73cfdeb
--- /dev/null
+++ b/po/ku.po
@@ -0,0 +1,139 @@
+# 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: 2011-04-29 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.7.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:96
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:250
+msgid "Any language"
+msgstr ""
+
+#: GetIABooksActivity.py:262
+msgid "Catalogs"
+msgstr ""
+
+#: GetIABooksActivity.py:308 GetIABooksActivity.py:668
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:348
+msgid "My books"
+msgstr ""
+
+#: GetIABooksActivity.py:363
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:433
+msgid "Format:"
+msgstr ""
+
+#: GetIABooksActivity.py:446
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:472
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:493
+msgid "Selected book"
+msgstr ""
+
+#: GetIABooksActivity.py:512
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:514
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:516
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:525
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:531
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:652
+msgid "You must enter at least 3 letters."
+msgstr ""
+
+#: GetIABooksActivity.py:676
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:691
+msgid "Sorry, we only found english books."
+msgstr ""
+
+#: GetIABooksActivity.py:752
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:752
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:797
+#, python-format
+msgid "Error: Could not download %s. "
+msgstr ""
+
+#: GetIABooksActivity.py:853
+msgid "Download completed"
+msgstr ""
+
+#: GetIABooksActivity.py:861
+msgid "Show in Journal"
+msgstr ""
+
+#: GetIABooksActivity.py:864
+msgid "Ok"
+msgstr ""
+
+#: listview.py:39
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:43
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:45
+msgid "Language"
+msgstr ""
+
+#: listview.py:47
+msgid "Publish Date"
+msgstr ""
diff --git a/po/lt.po b/po/lt.po
new file mode 100644
index 0000000..73af20b
--- /dev/null
+++ b/po/lt.po
@@ -0,0 +1,110 @@
+# 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: 2010-01-20 00:33-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.7.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/lv.po b/po/lv.po
new file mode 100644
index 0000000..73d305d
--- /dev/null
+++ b/po/lv.po
@@ -0,0 +1,110 @@
+# 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: 2010-01-20 00:33-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.6.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/messages.mo b/po/messages.mo
new file mode 100644
index 0000000..e17b49e
--- /dev/null
+++ b/po/messages.mo
Binary files differ
diff --git a/po/mg.po b/po/mg.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/mg.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/mk.po b/po/mk.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/mk.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ml.po b/po/ml.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ml.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/mn.po b/po/mn.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/mn.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/mr.po b/po/mr.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/mr.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ms.po b/po/ms.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ms.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/mvo.po b/po/mvo.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/mvo.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/na.po b/po/na.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/na.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/nah.po b/po/nah.po
new file mode 100644
index 0000000..73cfdeb
--- /dev/null
+++ b/po/nah.po
@@ -0,0 +1,139 @@
+# 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: 2011-04-29 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.7.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:96
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:250
+msgid "Any language"
+msgstr ""
+
+#: GetIABooksActivity.py:262
+msgid "Catalogs"
+msgstr ""
+
+#: GetIABooksActivity.py:308 GetIABooksActivity.py:668
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:348
+msgid "My books"
+msgstr ""
+
+#: GetIABooksActivity.py:363
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:433
+msgid "Format:"
+msgstr ""
+
+#: GetIABooksActivity.py:446
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:472
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:493
+msgid "Selected book"
+msgstr ""
+
+#: GetIABooksActivity.py:512
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:514
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:516
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:525
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:531
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:652
+msgid "You must enter at least 3 letters."
+msgstr ""
+
+#: GetIABooksActivity.py:676
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:691
+msgid "Sorry, we only found english books."
+msgstr ""
+
+#: GetIABooksActivity.py:752
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:752
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:797
+#, python-format
+msgid "Error: Could not download %s. "
+msgstr ""
+
+#: GetIABooksActivity.py:853
+msgid "Download completed"
+msgstr ""
+
+#: GetIABooksActivity.py:861
+msgid "Show in Journal"
+msgstr ""
+
+#: GetIABooksActivity.py:864
+msgid "Ok"
+msgstr ""
+
+#: listview.py:39
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:43
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:45
+msgid "Language"
+msgstr ""
+
+#: listview.py:47
+msgid "Publish Date"
+msgstr ""
diff --git a/po/nb.po b/po/nb.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ne.po b/po/ne.po
new file mode 100644
index 0000000..2681150
--- /dev/null
+++ b/po/ne.po
@@ -0,0 +1,113 @@
+# 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-11-26 16:55+0530\n"
+"PO-Revision-Date: 2009-12-21 23:51-0400\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ne\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr "त्रुति"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 0000000..a386dd5
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,136 @@
+# 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.
+# 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.
+# 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.
+# 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: 2010-01-20 00:33-0500\n"
+"PO-Revision-Date: 2010-06-29 10:14+0200\n"
+"Last-Translator: whe <heppew@yahoo.com>\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 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr "Neem Boeken"
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr "Neem Boek"
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB Volume"
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr "Boeken"
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr "Voer woorden van de Auteur of Titel in om zoeken te beginnen."
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr "Titel:\t\t"
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr "Auteur:\t\t"
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr "Uitgever:\t"
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr "Taal:\t"
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr "Link:\t\t"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr "Fout"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr "Je moet tenminste één zoekwoord invoeren."
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr "Aan het opzoeken, even geduld aub..."
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr "Sorry, geen boeken gevonden."
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr "Tijdoverschrijding bij verbinding voor "
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+"Fout: Kan niet downloaden %s . Het pad in de catalogus lijkt niet correct"
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr "Succes: %s is aan Dagboek toegevoegd."
+
+#: listview.py:40
+msgid "Title"
+msgstr "Titel"
+
+#: listview.py:41
+msgid "Author"
+msgstr "Auteur"
+
+#: listview.py:42
+msgid "Publisher"
+msgstr "Uitgever"
+
+#: listview.py:43
+msgid "Language"
+msgstr "Taal"
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr "Uitgeefdatum"
diff --git a/po/nn.po b/po/nn.po
new file mode 100644
index 0000000..73d305d
--- /dev/null
+++ b/po/nn.po
@@ -0,0 +1,110 @@
+# 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: 2010-01-20 00:33-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.6.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/pa.po b/po/pa.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/pa.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/pap.po b/po/pap.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/pap.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/pis.po b/po/pis.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/pis.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ps.po b/po/ps.po
new file mode 100644
index 0000000..68581a1
--- /dev/null
+++ b/po/ps.po
@@ -0,0 +1,113 @@
+# 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-11-26 16:55+0530\n"
+"PO-Revision-Date: 2009-12-22 00:06-0400\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ps\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr "تیروتنه"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/pt.po b/po/pt.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644
index 0000000..f9868ec
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,115 @@
+# 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-11-26 16:55+0530\n"
+"PO-Revision-Date: 2010-01-11 21:06-0400\n"
+"Last-Translator: Robson Mendonça <robsonmwoc@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: pt_BR\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr "Livros"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr "Escreva o nome do Autor ou Título para começar a busca."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr "Título:\t\t"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr "Autor:\t\t"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr "Editora:\t"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr "Idioma:\t"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr "Endereço:\t\t"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr "Erro"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr "Você deve digitar pelo menos uma palavra."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr "Realizando a pesquisa, por favor espere..."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr "Desculpe, nenhum livro pode ser encontrado."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr "Conexão expirou para"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+"Erro: Não foi possível baixar %s. O caminho para o catálogo parece estar "
+"errado."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr "Sucesso: %s foi adicionado ao Diário."
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr "Título"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr "Autor"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr "Editora"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr "Idioma"
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr "Data de publicação"
diff --git a/po/qu.po b/po/qu.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/qu.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ro.po b/po/ro.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/rw.po b/po/rw.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/rw.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/sd.po b/po/sd.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/sd.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/si.po b/po/si.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/si.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/sk.po b/po/sk.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/sl.po b/po/sl.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/sm.po b/po/sm.po
new file mode 100644
index 0000000..9c5e42a
--- /dev/null
+++ b/po/sm.po
@@ -0,0 +1,123 @@
+# 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.
+# 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.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-01-20 00:33-0500\n"
+"PO-Revision-Date: 2010-07-28 13:10+0200\n"
+"Last-Translator: Tabitha <tabitha.roder@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: sm\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+#, fuzzy
+msgid "Language:\t"
+msgstr "Gagana"
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr "Gagana"
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/sq.po b/po/sq.po
new file mode 100644
index 0000000..f010ae8
--- /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.
+# 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.
+# 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.
+# 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.
+# 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.
+# 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: 2010-01-20 00:33-0500\n"
+"PO-Revision-Date: 2010-02-16 07:15+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: sq\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 "Get Books"
+msgstr "Merr Libra"
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr "Merr Libër"
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB Sasi"
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr "Libra"
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr "Shkruani fjalë nga Autori apo Titulli për të filluar kërkimin."
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr "Titulli:\t\t"
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr "Autori:\t\t"
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr "Botuesi:\t"
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr "Gjuha:\t"
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr "Lidhja:\t\t"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr "Gabim"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr "Ju duhet të shënoni në të paktën një fjalë të kërkimit."
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr "Duke e zbatuar rregullimin, ju lutem prisni..."
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr "Na vjen keq, asnjë libër nuk u gjet."
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr "Lidhje u ndërpre jashtë për "
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+"Gabim: Nuk mund të shkarkoni %s. Kalimi në katalogun duket të jetë e pasaktë"
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr "Suksesi: %s është shtuar në Protokoll."
+
+#: listview.py:40
+msgid "Title"
+msgstr "Titulli"
+
+#: listview.py:41
+msgid "Author"
+msgstr "Autori"
+
+#: listview.py:42
+msgid "Publisher"
+msgstr "Botuesi"
+
+#: listview.py:43
+msgid "Language"
+msgstr "Gjuha"
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr "Data e Botimit"
diff --git a/po/sr.po b/po/sr.po
new file mode 100644
index 0000000..603b1dd
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,130 @@
+# 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.
+# 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.
+# 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.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-01-20 00:33-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.6.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/st.po b/po/st.po
new file mode 100644
index 0000000..73d305d
--- /dev/null
+++ b/po/st.po
@@ -0,0 +1,110 @@
+# 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: 2010-01-20 00:33-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.6.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/sw.po b/po/sw.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/sw.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ta.po b/po/ta.po
new file mode 100644
index 0000000..9b1718b
--- /dev/null
+++ b/po/ta.po
@@ -0,0 +1,133 @@
+# 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.
+# 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.
+# 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.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-01-20 00:33-0500\n"
+"PO-Revision-Date: 2010-08-01 21:00+0200\n"
+"Last-Translator: தங்கமணி <thangam.arunx@gmail.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 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr "புத்தகங்களை வாங்கு"
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr "புத்தகத்தை வாங்கு"
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB கணஅளவு"
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr "புத்தகங்கள்"
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr "ஆசிரியரிகளிடமிருந்து வார்த்தைகளை தட்டு (அ) தேடலை தலைப்புடன் தொடங்கு"
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr "தலைப்பு:\t\t"
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr "ஆசிரியர்:\t\t"
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr "வெளியீடுபவர்:\t"
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr "மொழி:\t"
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr "இணைப்பு:\t\t"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr "தவறு"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr "நீங்கள் தயவுசெய்து ஒரு வார்தையாவது தட்டினால் தான் தேடமுடியும்"
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr "பார்த்தல் செயலுல், தயவுசெய்து காத்திருக்கவும்..."
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr "மன்னிக்கவும், ஒரு புத்தகமும் தென்படவில்லை"
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr "இணைப்பின் கால அவகாசம் மிகுதியானது"
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+"பிழை: பதிவிறக்க முடியவில்லை %s . பட்டியலில் உள்ள பாதை தவறாக தெறிகிறது "
+" "
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr "வெற்றி: %s சஞ்சிகையுடன் சேர்க்கப்பட்டது"
+
+#: listview.py:40
+msgid "Title"
+msgstr "தலைப்பு"
+
+#: listview.py:41
+msgid "Author"
+msgstr "ஆசிரியர்"
+
+#: listview.py:42
+msgid "Publisher"
+msgstr "வெளியிடுபவர்"
+
+#: listview.py:43
+msgid "Language"
+msgstr "மொழி"
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr "வளியீடு திகதி"
diff --git a/po/te.po b/po/te.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/te.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/templates.po b/po/templates.po
new file mode 100644
index 0000000..fdd4f6d
--- /dev/null
+++ b/po/templates.po
@@ -0,0 +1,126 @@
+# 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.
+# 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.
+# 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: 2010-01-20 00:33-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.5.2\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/th.po b/po/th.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/th.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ton.po b/po/ton.po
new file mode 100644
index 0000000..603b1dd
--- /dev/null
+++ b/po/ton.po
@@ -0,0 +1,130 @@
+# 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.
+# 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.
+# 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.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-01-20 00:33-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.6.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/tpi.po b/po/tpi.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/tpi.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/tr.po b/po/tr.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/tvl.po b/po/tvl.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/tvl.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/tyv.po b/po/tyv.po
new file mode 100644
index 0000000..73af20b
--- /dev/null
+++ b/po/tyv.po
@@ -0,0 +1,110 @@
+# 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: 2010-01-20 00:33-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.7.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/tzm.po b/po/tzm.po
new file mode 100644
index 0000000..73cfdeb
--- /dev/null
+++ b/po/tzm.po
@@ -0,0 +1,139 @@
+# 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: 2011-04-29 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.7.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:96
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:250
+msgid "Any language"
+msgstr ""
+
+#: GetIABooksActivity.py:262
+msgid "Catalogs"
+msgstr ""
+
+#: GetIABooksActivity.py:308 GetIABooksActivity.py:668
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:348
+msgid "My books"
+msgstr ""
+
+#: GetIABooksActivity.py:363
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:433
+msgid "Format:"
+msgstr ""
+
+#: GetIABooksActivity.py:446
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:472
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:493
+msgid "Selected book"
+msgstr ""
+
+#: GetIABooksActivity.py:512
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:514
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:516
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:525
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:531
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:652
+msgid "You must enter at least 3 letters."
+msgstr ""
+
+#: GetIABooksActivity.py:676
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:691
+msgid "Sorry, we only found english books."
+msgstr ""
+
+#: GetIABooksActivity.py:752
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:752
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:797
+#, python-format
+msgid "Error: Could not download %s. "
+msgstr ""
+
+#: GetIABooksActivity.py:853
+msgid "Download completed"
+msgstr ""
+
+#: GetIABooksActivity.py:861
+msgid "Show in Journal"
+msgstr ""
+
+#: GetIABooksActivity.py:864
+msgid "Ok"
+msgstr ""
+
+#: listview.py:39
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:43
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:45
+msgid "Language"
+msgstr ""
+
+#: listview.py:47
+msgid "Publish Date"
+msgstr ""
diff --git a/po/tzo.po b/po/tzo.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/tzo.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ug.po b/po/ug.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ug.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/uk.po b/po/uk.po
new file mode 100644
index 0000000..c9aaca1
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,126 @@
+# 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.
+# 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.
+# 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: 2010-01-20 00:33-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.6.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/ur.po b/po/ur.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/ur.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/vi.po b/po/vi.po
new file mode 100644
index 0000000..d9a6011
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,119 @@
+# 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.
+# 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: 2010-01-20 00:33-0500\n"
+"PO-Revision-Date: 2010-03-07 14:55+0200\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 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr "Lấy sách"
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr "Lấy sách"
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "Khối tin %.2f GB"
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr "Sách"
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr "Gõ từ của Tác giả hay Tên sách để bắt đầu tìm kiếm."
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr "Tên sách:\t\t"
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr "Tác giả:\t\t"
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr "Nhà xuất bản:\t"
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr "Ngôn ngữ:\t"
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr "Liên kết:\t\t"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr "Lỗi"
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr "Phải gõ ít nhất một từ cần tìm."
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr "Đang tra tìm, hãy đợi..."
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr "Tiếc là không tìm thấy cuốn sách nào."
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr "Kết nối quá hạn trong "
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr "Lỗi: không thể tải về %s . Thế là phân loại chứa một đường dẫn sai"
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr "Thành công: %s đã được thêm vào Nhật ký."
+
+#: listview.py:40
+msgid "Title"
+msgstr "Tên sách"
+
+#: listview.py:41
+msgid "Author"
+msgstr "Tác giả"
+
+#: listview.py:42
+msgid "Publisher"
+msgstr "Nhà xuất bản"
+
+#: listview.py:43
+msgid "Language"
+msgstr "Ngôn ngữ"
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr "Ngày xuất bản"
diff --git a/po/wa.po b/po/wa.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/wa.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/yo.po b/po/yo.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/yo.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 0000000..bb88904
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,112 @@
+# 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-11-26 16:55+0530\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 "Get Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:150
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:208
+msgid "Books"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:224
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:282
+msgid "Title:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:284
+msgid "Author:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:286
+msgid "Publisher:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:287
+msgid "Language:\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:292
+msgid "Link:\t\t"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Error"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:313
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:321
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:330
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:339
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:390
+msgid "Connection timed out for "
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:427
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/GetIABooksActivity.py:457
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:40
+msgid "Title"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:41
+msgid "Author"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:43
+msgid "Language"
+msgstr ""
+
+#: /home/sayamindu/Work/Devel/get-ia-books/listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/zh_HK.po b/po/zh_HK.po
new file mode 100644
index 0000000..328bbdd
--- /dev/null
+++ b/po/zh_HK.po
@@ -0,0 +1,118 @@
+# 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.
+# 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: 2010-01-20 00:33-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.6.0\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr ""
+
+#: GetIABooksActivity.py:94
+msgid "Get Book"
+msgstr ""
+
+#: GetIABooksActivity.py:159
+#, python-format
+msgid "%.2f GB Volume"
+msgstr ""
+
+#: GetIABooksActivity.py:217
+msgid "Books"
+msgstr ""
+
+#: GetIABooksActivity.py:233
+msgid "Enter words from the Author or Title to begin search."
+msgstr ""
+
+#: GetIABooksActivity.py:292
+msgid "Title:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:294
+msgid "Author:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:296
+msgid "Publisher:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:297
+msgid "Language:\t"
+msgstr ""
+
+#: GetIABooksActivity.py:302
+msgid "Link:\t\t"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+#: GetIABooksActivity.py:403
+msgid "Error"
+msgstr ""
+
+#: GetIABooksActivity.py:323 GetIABooksActivity.py:331
+msgid "You must enter at least one search word."
+msgstr ""
+
+#: GetIABooksActivity.py:340
+msgid "Performing lookup, please wait..."
+msgstr ""
+
+#: GetIABooksActivity.py:349
+msgid "Sorry, no books could be found."
+msgstr ""
+
+#: GetIABooksActivity.py:403
+msgid "Connection timed out for "
+msgstr ""
+
+#: GetIABooksActivity.py:440
+#, python-format
+msgid ""
+"Error: Could not download %s . The path in the catalog seems to be incorrect"
+msgstr ""
+
+#: GetIABooksActivity.py:470
+#, python-format
+msgid "Success: %s was added to Journal."
+msgstr ""
+
+#: listview.py:40
+msgid "Title"
+msgstr ""
+
+#: listview.py:41
+msgid "Author"
+msgstr ""
+
+#: listview.py:42
+msgid "Publisher"
+msgstr ""
+
+#: listview.py:43
+msgid "Language"
+msgstr ""
+
+#: listview.py:44
+msgid "Publish Date"
+msgstr ""
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 0000000..31f0f69
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,180 @@
+# 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.
+# 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.
+# 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.
+# 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.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-04-29 00:31-0400\n"
+"PO-Revision-Date: 2011-06-06 00:44+0200\n"
+"Last-Translator: Yuan Chao <yuanchao@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Get Books"
+msgstr "愛讀書"
+
+#: GetIABooksActivity.py:96
+msgid "Books"
+msgstr "書籍"
+
+#: GetIABooksActivity.py:250
+msgid "Any language"
+msgstr "任何語言"
+
+#: GetIABooksActivity.py:262
+msgid "Catalogs"
+msgstr "目錄"
+
+#: GetIABooksActivity.py:308 GetIABooksActivity.py:668
+msgid "Performing lookup, please wait..."
+msgstr "搜尋中,請稍待。"
+
+#: GetIABooksActivity.py:348
+msgid "My books"
+msgstr "我的收藏"
+
+#: GetIABooksActivity.py:363
+#, python-format
+msgid "%.2f GB Volume"
+msgstr "%.2f GB 容量"
+
+#: GetIABooksActivity.py:433
+msgid "Format:"
+msgstr "格式: "
+
+#: GetIABooksActivity.py:446
+msgid "Get Book"
+msgstr "取書"
+
+#: GetIABooksActivity.py:472
+msgid "Enter words from the Author or Title to begin search."
+msgstr "請輸入作者或書名來進行查詢。"
+
+#: GetIABooksActivity.py:493
+msgid "Selected book"
+msgstr "選擇書籍"
+
+#: GetIABooksActivity.py:512
+msgid "Title:\t\t"
+msgstr "書名:\t\t"
+
+#: GetIABooksActivity.py:514
+msgid "Author:\t\t"
+msgstr "作者:\t\t"
+
+#: GetIABooksActivity.py:516
+msgid "Publisher:\t"
+msgstr "出版商:\t"
+
+#: GetIABooksActivity.py:525
+msgid "Language:\t"
+msgstr "語言:\t"
+
+#: GetIABooksActivity.py:531
+msgid "Link:\t\t"
+msgstr "連結:\t\t"
+
+#: GetIABooksActivity.py:652
+msgid "You must enter at least 3 letters."
+msgstr "您至少要輸入三個字。"
+
+#: GetIABooksActivity.py:676
+msgid "Sorry, no books could be found."
+msgstr "抱歉,找不到相符的書籍。"
+
+#: GetIABooksActivity.py:691
+msgid "Sorry, we only found english books."
+msgstr "抱歉,只能找到英文書籍。"
+
+#: GetIABooksActivity.py:752
+msgid "Error"
+msgstr "錯誤"
+
+#: GetIABooksActivity.py:752
+msgid "Connection timed out for "
+msgstr "連線逾時 "
+
+#: GetIABooksActivity.py:797
+#, python-format
+msgid "Error: Could not download %s. "
+msgstr "錯誤,無法下載 %s 。"
+
+#: GetIABooksActivity.py:853
+msgid "Download completed"
+msgstr "下載完成"
+
+#: GetIABooksActivity.py:861
+msgid "Show in Journal"
+msgstr "顯示日誌"
+
+#: GetIABooksActivity.py:864
+msgid "Ok"
+msgstr "確定"
+
+#: listview.py:39
+msgid "Title"
+msgstr "書名"
+
+#: listview.py:41
+msgid "Author"
+msgstr "作者"
+
+#: listview.py:43
+msgid "Publisher"
+msgstr "出版商"
+
+#: listview.py:45
+msgid "Language"
+msgstr "語言"
+
+#: listview.py:47
+msgid "Publish Date"
+msgstr "發行日期"
+
+#~ msgid "You must enter at least one search word."
+#~ msgstr "您必須輸入至少一個搜尋字串。"
+
+#, python-format
+#~ msgid ""
+#~ "Error: Could not download %s . The path in the catalog seems to be incorrect"
+#~ msgstr "錯誤:無法下載。目錄中的路徑似乎有錯誤。"
+
+#, python-format
+#~ msgid "Success: %s was added to Journal."
+#~ msgstr "成功:%s 已經新增到日誌當中。"
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..2f2c143
--- /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 sugar3.activity import bundlebuilder
+
+bundlebuilder.start()