some translation stuff
authorRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Tue, 25 May 2010 12:40:56 +0000 (14:40 +0200)
committerRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Tue, 25 May 2010 12:42:20 +0000 (14:42 +0200)
added modeltranslation
added infopages, deleted static pages from templates
catalogue.Book._short_html now modeltranslated
added Ukrainian l10n
some minor fixes

60 files changed:
apps/catalogue/locale/de/LC_MESSAGES/django.po
apps/catalogue/locale/en/LC_MESSAGES/django.po
apps/catalogue/locale/es/LC_MESSAGES/django.po
apps/catalogue/locale/fr/LC_MESSAGES/django.po
apps/catalogue/locale/lt/LC_MESSAGES/django.po
apps/catalogue/locale/pl/LC_MESSAGES/django.po
apps/catalogue/locale/ru/LC_MESSAGES/django.po
apps/catalogue/locale/uk/LC_MESSAGES/django.po [new file with mode: 0644]
apps/catalogue/migrations/0009__short_html_translation.py [new file with mode: 0644]
apps/catalogue/models.py
apps/chunks/locale/uk/LC_MESSAGES/django.po [new file with mode: 0644]
apps/infopages/__init__.py [new file with mode: 0644]
apps/infopages/admin.py [new file with mode: 0644]
apps/infopages/migrations/0001_initial.py [new file with mode: 0644]
apps/infopages/migrations/__init__.py [new file with mode: 0644]
apps/infopages/models.py [new file with mode: 0644]
apps/lessons/locale/uk/LC_MESSAGES/django.po [new file with mode: 0644]
apps/modeltranslation/__init__.py [new file with mode: 0644]
apps/modeltranslation/admin.py [new file with mode: 0644]
apps/modeltranslation/fields.py [new file with mode: 0644]
apps/modeltranslation/management/__init__.py [new file with mode: 0644]
apps/modeltranslation/management/commands/__init__.py [new file with mode: 0644]
apps/modeltranslation/management/commands/update_translation_fields.py [new file with mode: 0644]
apps/modeltranslation/models.py [new file with mode: 0644]
apps/modeltranslation/tests.py [new file with mode: 0644]
apps/modeltranslation/testurls.py [new file with mode: 0644]
apps/modeltranslation/translator.py [new file with mode: 0644]
apps/modeltranslation/utils.py [new file with mode: 0644]
apps/newtagging/locale/uk/LC_MESSAGES/django.po [new file with mode: 0644]
apps/sponsors/locale/de/LC_MESSAGES/django.po [new file with mode: 0644]
apps/sponsors/locale/uk/LC_MESSAGES/django.po [new file with mode: 0644]
wolnelektury/locale/de/LC_MESSAGES/django.mo
wolnelektury/locale/de/LC_MESSAGES/django.po
wolnelektury/locale/en/LC_MESSAGES/django.mo
wolnelektury/locale/en/LC_MESSAGES/django.po
wolnelektury/locale/es/LC_MESSAGES/django.mo
wolnelektury/locale/es/LC_MESSAGES/django.po
wolnelektury/locale/fr/LC_MESSAGES/django.mo
wolnelektury/locale/fr/LC_MESSAGES/django.po
wolnelektury/locale/lt/LC_MESSAGES/django.mo
wolnelektury/locale/lt/LC_MESSAGES/django.po
wolnelektury/locale/pl/LC_MESSAGES/django.mo
wolnelektury/locale/pl/LC_MESSAGES/django.po
wolnelektury/locale/ru/LC_MESSAGES/django.mo
wolnelektury/locale/ru/LC_MESSAGES/django.po
wolnelektury/locale/uk/LC_MESSAGES/django.mo [new file with mode: 0644]
wolnelektury/locale/uk/LC_MESSAGES/django.po [new file with mode: 0644]
wolnelektury/settings.py
wolnelektury/static/js/catalogue.js
wolnelektury/templates/catalogue/book_fragments.html
wolnelektury/templates/catalogue/search_multiple_hits.html
wolnelektury/templates/catalogue/search_too_short.html
wolnelektury/templates/catalogue/tagged_object_list.html
wolnelektury/templates/info/about_us.html [deleted file]
wolnelektury/templates/info/base.html [new file with mode: 0644]
wolnelektury/templates/info/help_us.html [deleted file]
wolnelektury/templates/info/join_us.html
wolnelektury/templates/info/voluntary_services.html [deleted file]
wolnelektury/translation.py [new file with mode: 0644]
wolnelektury/urls.py

index 5362b95..fa770ff 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-18 10:57+0200\n"
+"POT-Creation-Date: 2010-05-25 11:21+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: fields.py:45
+#: fields.py:47
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
@@ -201,38 +201,38 @@ msgstr ""
 msgid "book stubs"
 msgstr ""
 
 msgid "book stubs"
 msgstr ""
 
-#: views.py:308
+#: views.py:339
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 msgid "This book is not on the shelf"
 msgstr ""
 
 msgid "This book is not on the shelf"
 msgstr ""
 
-#: views.py:448
+#: views.py:479
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
-#: views.py:463
+#: views.py:494
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
-#: views.py:522
+#: views.py:553
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
index 5362b95..fa770ff 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-18 10:57+0200\n"
+"POT-Creation-Date: 2010-05-25 11:21+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: fields.py:45
+#: fields.py:47
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
@@ -201,38 +201,38 @@ msgstr ""
 msgid "book stubs"
 msgstr ""
 
 msgid "book stubs"
 msgstr ""
 
-#: views.py:308
+#: views.py:339
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 msgid "This book is not on the shelf"
 msgstr ""
 
 msgid "This book is not on the shelf"
 msgstr ""
 
-#: views.py:448
+#: views.py:479
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
-#: views.py:463
+#: views.py:494
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
-#: views.py:522
+#: views.py:553
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
index 5362b95..fa770ff 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-18 10:57+0200\n"
+"POT-Creation-Date: 2010-05-25 11:21+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: fields.py:45
+#: fields.py:47
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
@@ -201,38 +201,38 @@ msgstr ""
 msgid "book stubs"
 msgstr ""
 
 msgid "book stubs"
 msgstr ""
 
-#: views.py:308
+#: views.py:339
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 msgid "This book is not on the shelf"
 msgstr ""
 
 msgid "This book is not on the shelf"
 msgstr ""
 
-#: views.py:448
+#: views.py:479
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
-#: views.py:463
+#: views.py:494
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
-#: views.py:522
+#: views.py:553
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
index 5362b95..fa770ff 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-18 10:57+0200\n"
+"POT-Creation-Date: 2010-05-25 11:21+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: fields.py:45
+#: fields.py:47
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
@@ -201,38 +201,38 @@ msgstr ""
 msgid "book stubs"
 msgstr ""
 
 msgid "book stubs"
 msgstr ""
 
-#: views.py:308
+#: views.py:339
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 msgid "This book is not on the shelf"
 msgstr ""
 
 msgid "This book is not on the shelf"
 msgstr ""
 
-#: views.py:448
+#: views.py:479
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
-#: views.py:463
+#: views.py:494
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
-#: views.py:522
+#: views.py:553
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
index 5362b95..fa770ff 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-18 10:57+0200\n"
+"POT-Creation-Date: 2010-05-25 11:21+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: fields.py:45
+#: fields.py:47
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
@@ -201,38 +201,38 @@ msgstr ""
 msgid "book stubs"
 msgstr ""
 
 msgid "book stubs"
 msgstr ""
 
-#: views.py:308
+#: views.py:339
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 msgid "This book is not on the shelf"
 msgstr ""
 
 msgid "This book is not on the shelf"
 msgstr ""
 
-#: views.py:448
+#: views.py:479
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
-#: views.py:463
+#: views.py:494
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
-#: views.py:522
+#: views.py:553
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
index 109cc28..83b0bc7 100644 (file)
@@ -2,12 +2,12 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 # Copyright (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"
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-18 10:57+0200\n"
+"POT-Creation-Date: 2010-05-25 11:21+0200\n"
 "PO-Revision-Date: 2010-05-19 16:15\n"
 "Last-Translator: <radoslaw.czajka@nowoczesnapolska.org.pl>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "PO-Revision-Date: 2010-05-19 16:15\n"
 "Last-Translator: <radoslaw.czajka@nowoczesnapolska.org.pl>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Translated-Using: django-rosetta 0.5.3\n"
 
 "Content-Transfer-Encoding: 8bit\n"
 "X-Translated-Using: django-rosetta 0.5.3\n"
 
-#: fields.py:45
+#: fields.py:47
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr "Wprowadź prawidłową wartość JSON. Błąd: %s"
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr "Wprowadź prawidłową wartość JSON. Błąd: %s"
@@ -201,38 +201,38 @@ msgstr "zapowiedź książki"
 msgid "book stubs"
 msgstr "zapowiedzi książek"
 
 msgid "book stubs"
 msgstr "zapowiedzi książek"
 
-#: views.py:308
+#: views.py:339
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr "<p>Aby zarządzać swoimi półkami, musisz się zalogować.</p>"
 
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr "<p>Aby zarządzać swoimi półkami, musisz się zalogować.</p>"
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr "<p>Półki zostały zapisane.</p>"
 
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr "<p>Półki zostały zapisane.</p>"
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr "Usunięto"
 
 msgid "Book was successfully removed from the shelf"
 msgstr "Usunięto"
 
-#: views.py:352
+#: views.py:383
 msgid "This book is not on the shelf"
 msgstr "Książki nie ma na półce"
 
 msgid "This book is not on the shelf"
 msgstr "Książki nie ma na półce"
 
-#: views.py:448
+#: views.py:479
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr "<p>Półka <strong>%s</strong> została utworzona</p>"
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr "<p>Półka <strong>%s</strong> została utworzona</p>"
 
-#: views.py:463
+#: views.py:494
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr "<p>Półka <strong>%s</strong> została usunięta</p>"
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr "<p>Półka <strong>%s</strong> została usunięta</p>"
 
-#: views.py:522
+#: views.py:553
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -243,11 +243,11 @@ msgstr ""
 "\n"
 "%(tb)s"
 
 "\n"
 "%(tb)s"
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr "Książka zaimportowana"
 
 msgid "Book imported successfully"
 msgstr "Książka zaimportowana"
 
-#: views.py:526
+#: views.py:557
 #, python-format
 msgid "Error importing file: %r"
 msgstr "Błąd podczas importowania pliku: %r"
 #, python-format
 msgid "Error importing file: %r"
 msgstr "Błąd podczas importowania pliku: %r"
index 5362b95..fa770ff 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-18 10:57+0200\n"
+"POT-Creation-Date: 2010-05-25 11:21+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: fields.py:45
+#: fields.py:47
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
@@ -201,38 +201,38 @@ msgstr ""
 msgid "book stubs"
 msgstr ""
 
 msgid "book stubs"
 msgstr ""
 
-#: views.py:308
+#: views.py:339
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
 msgid "<p>To maintain your shelves you need to be logged in.</p>"
 msgstr ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 msgid "This book is not on the shelf"
 msgstr ""
 
 msgid "This book is not on the shelf"
 msgstr ""
 
-#: views.py:448
+#: views.py:479
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
 msgstr ""
 
-#: views.py:463
+#: views.py:494
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
 #, python-format
 msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
 msgstr ""
 
-#: views.py:522
+#: views.py:553
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
 #, python-format
 msgid "Today is %(month)s, %(day)s."
 msgstr ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
 #, python-format
 msgid "Error importing file: %r"
 msgstr ""
diff --git a/apps/catalogue/locale/uk/LC_MESSAGES/django.po b/apps/catalogue/locale/uk/LC_MESSAGES/django.po
new file mode 100644 (file)
index 0000000..fa770ff
--- /dev/null
@@ -0,0 +1,258 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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-05-25 11:21+0200\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"
+
+#: fields.py:47
+#, python-format
+msgid "Enter a valid JSON value. Error: %s"
+msgstr ""
+
+#: forms.py:28
+msgid "title, author, theme/topic, epoch, kind, genre"
+msgstr ""
+
+#: forms.py:44
+msgid "Shelves"
+msgstr ""
+
+#: forms.py:57
+msgid "Name of the new shelf"
+msgstr ""
+
+#: models.py:24 models.py:363
+msgid "author"
+msgstr ""
+
+#: models.py:25
+msgid "epoch"
+msgstr ""
+
+#: models.py:26
+msgid "kind"
+msgstr ""
+
+#: models.py:27
+msgid "genre"
+msgstr ""
+
+#: models.py:28
+msgid "theme"
+msgstr ""
+
+#: models.py:29
+msgid "set"
+msgstr ""
+
+#: models.py:30 models.py:322
+msgid "book"
+msgstr ""
+
+#: models.py:44 migrations/0001_initial.py:47
+msgid "name"
+msgstr ""
+
+#: models.py:45 models.py:103 models.py:365 migrations/0001_initial.py:19
+#: migrations/0001_initial.py:48
+msgid "slug"
+msgstr ""
+
+#: models.py:46 migrations/0001_initial.py:49
+msgid "sort key"
+msgstr ""
+
+#: models.py:47 migrations/0001_initial.py:50
+msgid "category"
+msgstr ""
+
+#: models.py:49 models.py:60 models.py:104 models.py:185
+#: migrations/0001_initial.py:20 migrations/0001_initial.py:51
+msgid "description"
+msgstr ""
+
+#: models.py:50 migrations/0001_initial.py:52
+msgid "main page"
+msgstr ""
+
+#: models.py:50 migrations/0001_initial.py:52
+msgid "Show tag on main page"
+msgstr ""
+
+#: models.py:53 migrations/0001_initial.py:54
+msgid "book count"
+msgstr ""
+
+#: models.py:54
+msgid "year of death"
+msgstr ""
+
+#: models.py:80 migrations/0001_initial.py:61
+msgid "tag"
+msgstr ""
+
+#: models.py:81
+msgid "tags"
+msgstr ""
+
+#: models.py:102 models.py:362 migrations/0001_initial.py:18
+msgid "title"
+msgstr ""
+
+#: models.py:105 migrations/0001_initial.py:21
+msgid "creation date"
+msgstr ""
+
+#: models.py:106 migrations/0001_initial.py:22
+msgid "short HTML"
+msgstr ""
+
+#: models.py:107 migrations/0001_initial.py:23
+msgid "parent number"
+msgstr ""
+
+#: models.py:108
+msgid "extra information"
+msgstr ""
+
+#: models.py:114 migrations/0001_initial.py:24
+msgid "XML file"
+msgstr ""
+
+#: models.py:115 migrations/0001_initial.py:25
+msgid "HTML file"
+msgstr ""
+
+#: models.py:116 migrations/0001_initial.py:26
+msgid "PDF file"
+msgstr ""
+
+#: models.py:117 migrations/0001_initial.py:27
+msgid "ODT file"
+msgstr ""
+
+#: models.py:118 migrations/0001_initial.py:28
+msgid "TXT file"
+msgstr ""
+
+#: models.py:119
+msgid "MP3 file"
+msgstr ""
+
+#: models.py:120
+msgid "OGG file"
+msgstr ""
+
+#: models.py:141
+msgid "Read online"
+msgstr ""
+
+#: models.py:221
+#, python-format
+msgid "Book %s already exists"
+msgstr ""
+
+#: models.py:264
+#, python-format
+msgid "Book with slug = \"%s\" does not exist."
+msgstr ""
+
+#: models.py:323
+msgid "books"
+msgstr ""
+
+#: models.py:357
+msgid "fragment"
+msgstr ""
+
+#: models.py:358
+msgid "fragments"
+msgstr ""
+
+#: models.py:364
+msgid "goes to public domain"
+msgstr ""
+
+#: models.py:366
+msgid "translator"
+msgstr ""
+
+#: models.py:367
+msgid "year of translator's death"
+msgstr ""
+
+#: models.py:385
+msgid "book stub"
+msgstr ""
+
+#: models.py:386
+msgid "book stubs"
+msgstr ""
+
+#: views.py:339
+msgid "<p>To maintain your shelves you need to be logged in.</p>"
+msgstr ""
+
+#: views.py:357
+msgid "<p>Shelves were sucessfully saved.</p>"
+msgstr ""
+
+#: views.py:381
+msgid "Book was successfully removed from the shelf"
+msgstr ""
+
+#: views.py:383
+msgid "This book is not on the shelf"
+msgstr ""
+
+#: views.py:479
+#, python-format
+msgid "<p>Shelf <strong>%s</strong> was successfully created</p>"
+msgstr ""
+
+#: views.py:494
+#, python-format
+msgid "<p>Shelf <strong>%s</strong> was successfully removed</p>"
+msgstr ""
+
+#: views.py:553
+#, python-format
+msgid "Today is %(month)s, %(day)s."
+msgstr ""
+
+#: views.py:554
+#, python-format
+msgid ""
+"An error occurred: %(exception)s\n"
+"\n"
+"%(tb)s"
+msgstr ""
+
+#: views.py:555
+msgid "Book imported successfully"
+msgstr ""
+
+#: views.py:557
+#, python-format
+msgid "Error importing file: %r"
+msgstr ""
+
+#: migrations/0001_initial.py:62
+msgid "content type"
+msgstr ""
+
+#: migrations/0001_initial.py:63
+msgid "object id"
+msgstr ""
diff --git a/apps/catalogue/migrations/0009__short_html_translation.py b/apps/catalogue/migrations/0009__short_html_translation.py
new file mode 100644 (file)
index 0000000..c67fc22
--- /dev/null
@@ -0,0 +1,172 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+    
+    def forwards(self, orm):
+        
+        # Adding field 'Book._short_html_pl'
+        db.add_column('catalogue_book', '_short_html_pl', self.gf('django.db.models.fields.TextField')(), keep_default=False)
+
+        # Adding field 'Book._short_html_de'
+        db.add_column('catalogue_book', '_short_html_de', self.gf('django.db.models.fields.TextField')(), keep_default=False)
+
+        # Adding field 'Book._short_html_en'
+        db.add_column('catalogue_book', '_short_html_en', self.gf('django.db.models.fields.TextField')(), keep_default=False)
+
+        # Adding field 'Book._short_html_lt'
+        db.add_column('catalogue_book', '_short_html_lt', self.gf('django.db.models.fields.TextField')(), keep_default=False)
+
+        # Adding field 'Book._short_html_fr'
+        db.add_column('catalogue_book', '_short_html_fr', self.gf('django.db.models.fields.TextField')(), keep_default=False)
+
+        # Adding field 'Book._short_html_ru'
+        db.add_column('catalogue_book', '_short_html_ru', self.gf('django.db.models.fields.TextField')(), keep_default=False)
+
+        # Adding field 'Book._short_html_es'
+        db.add_column('catalogue_book', '_short_html_es', self.gf('django.db.models.fields.TextField')(), keep_default=False)
+
+        # Adding field 'Book._short_html_uk'
+        db.add_column('catalogue_book', '_short_html_uk', self.gf('django.db.models.fields.TextField')(), keep_default=False)
+
+    
+    def backwards(self, orm):
+        
+        # Deleting field 'Book._short_html_pl'
+        db.delete_column('catalogue_book', '_short_html_pl')
+
+        # Deleting field 'Book._short_html_de'
+        db.delete_column('catalogue_book', '_short_html_de')
+
+        # Deleting field 'Book._short_html_en'
+        db.delete_column('catalogue_book', '_short_html_en')
+
+        # Deleting field 'Book._short_html_lt'
+        db.delete_column('catalogue_book', '_short_html_lt')
+
+        # Deleting field 'Book._short_html_fr'
+        db.delete_column('catalogue_book', '_short_html_fr')
+
+        # Deleting field 'Book._short_html_ru'
+        db.delete_column('catalogue_book', '_short_html_ru')
+
+        # Deleting field 'Book._short_html_es'
+        db.delete_column('catalogue_book', '_short_html_es')
+
+        # Deleting field 'Book._short_html_uk'
+        db.delete_column('catalogue_book', '_short_html_uk')
+    
+    
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'catalogue.book': {
+            'Meta': {'object_name': 'Book'},
+            '_short_html': ('django.db.models.fields.TextField', [], {}),
+            '_short_html_de': ('django.db.models.fields.TextField', [], {}),
+            '_short_html_en': ('django.db.models.fields.TextField', [], {}),
+            '_short_html_es': ('django.db.models.fields.TextField', [], {}),
+            '_short_html_fr': ('django.db.models.fields.TextField', [], {}),
+            '_short_html_lt': ('django.db.models.fields.TextField', [], {}),
+            '_short_html_pl': ('django.db.models.fields.TextField', [], {}),
+            '_short_html_ru': ('django.db.models.fields.TextField', [], {}),
+            '_short_html_uk': ('django.db.models.fields.TextField', [], {}),
+            'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'extra_info': ('catalogue.fields.JSONField', [], {}),
+            'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}),
+            'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}),
+            'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}),
+            'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'})
+        },
+        'catalogue.bookstub': {
+            'Meta': {'object_name': 'BookStub'},
+            'author': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'pd': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'translator': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'translator_death': ('django.db.models.fields.TextField', [], {'blank': 'True'})
+        },
+        'catalogue.fragment': {
+            'Meta': {'object_name': 'Fragment'},
+            '_short_html': ('django.db.models.fields.TextField', [], {}),
+            'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'short_text': ('django.db.models.fields.TextField', [], {}),
+            'text': ('django.db.models.fields.TextField', [], {})
+        },
+        'catalogue.tag': {
+            'Meta': {'object_name': 'Tag'},
+            'book_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+            'death': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}),
+            'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+            'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'})
+        },
+        'catalogue.tagrelation': {
+            'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"},
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+            'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        }
+    }
+    
+    complete_apps = ['catalogue']
index 59011fd..ec225d4 100644 (file)
@@ -160,7 +160,8 @@ class Book(models.Model):
     def save(self, force_insert=False, force_update=False, reset_short_html=True):
         if reset_short_html:
             # Reset _short_html during save
     def save(self, force_insert=False, force_update=False, reset_short_html=True):
         if reset_short_html:
             # Reset _short_html during save
-            self._short_html = ''
+            for key in filter(lambda x: x.startswith('_short_html'), self.__dict__):
+                self.key = ''
         
         book = super(Book, self).save(force_insert, force_update)
         
         
         book = super(Book, self).save(force_insert, force_update)
         
diff --git a/apps/chunks/locale/uk/LC_MESSAGES/django.po b/apps/chunks/locale/uk/LC_MESSAGES/django.po
new file mode 100644 (file)
index 0000000..90a86b5
--- /dev/null
@@ -0,0 +1,53 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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-05-25 11:22+0200\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"
+
+#: models.py:10 models.py:24
+msgid "key"
+msgstr ""
+
+#: models.py:10
+msgid "A unique name for this chunk of content"
+msgstr ""
+
+#: models.py:11
+msgid "description"
+msgstr ""
+
+#: models.py:12
+msgid "content"
+msgstr ""
+
+#: models.py:16
+msgid "chunk"
+msgstr ""
+
+#: models.py:17
+msgid "chunks"
+msgstr ""
+
+#: models.py:24
+msgid "A unique name for this attachment"
+msgstr ""
+
+#: models.py:29
+msgid "attachment"
+msgstr ""
+
+#: models.py:29
+msgid "attachments"
+msgstr ""
diff --git a/apps/infopages/__init__.py b/apps/infopages/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/apps/infopages/admin.py b/apps/infopages/admin.py
new file mode 100644 (file)
index 0000000..66f2996
--- /dev/null
@@ -0,0 +1,9 @@
+from django.contrib import admin
+
+from modeltranslation.admin import TranslationAdmin
+from infopages.models import InfoPage
+
+class InfoPageAdmin(TranslationAdmin):
+    list_display = ('title',)
+
+admin.site.register(InfoPage, InfoPageAdmin)
\ No newline at end of file
diff --git a/apps/infopages/migrations/0001_initial.py b/apps/infopages/migrations/0001_initial.py
new file mode 100644 (file)
index 0000000..a317db8
--- /dev/null
@@ -0,0 +1,105 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+    
+    def forwards(self, orm):
+        
+        # Adding model 'InfoPage'
+        db.create_table('infopages_infopage', (
+            ('title_de', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('page_title', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('left_column_uk', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('right_column_pl', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('page_title_en', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('page_title_es', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('left_column_lt', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('title_fr', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('right_column_ru', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('left_column_fr', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('title', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('title_lt', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('right_column', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('right_column_es', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('right_column_en', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('left_column_de', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('title_uk', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('right_column_fr', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('left_column', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('right_column_uk', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('title_en', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('left_column_pl', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('left_column_ru', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('right_column_lt', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('title_es', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('page_title_fr', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('page_title_uk', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('page_title_de', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=120, db_index=True)),
+            ('page_title_lt', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('right_column_de', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('page_title_pl', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('left_column_es', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('left_column_en', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('title_pl', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('title_ru', self.gf('django.db.models.fields.CharField')(max_length=120)),
+            ('page_title_ru', self.gf('django.db.models.fields.CharField')(max_length=120)),
+        ))
+        db.send_create_signal('infopages', ['InfoPage'])
+    
+    
+    def backwards(self, orm):
+        
+        # Deleting model 'InfoPage'
+        db.delete_table('infopages_infopage')
+    
+    
+    models = {
+        'infopages.infopage': {
+            'Meta': {'object_name': 'InfoPage'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'left_column': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'left_column_de': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'left_column_en': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'left_column_es': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'left_column_fr': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'left_column_lt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'left_column_pl': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'left_column_ru': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'left_column_uk': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'page_title': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'page_title_de': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'page_title_en': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'page_title_es': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'page_title_fr': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'page_title_lt': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'page_title_pl': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'page_title_ru': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'page_title_uk': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'right_column': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'right_column_de': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'right_column_en': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'right_column_es': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'right_column_fr': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'right_column_lt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'right_column_pl': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'right_column_ru': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'right_column_uk': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'title_de': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'title_en': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'title_es': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'title_fr': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'title_lt': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'title_pl': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'title_ru': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'title_uk': ('django.db.models.fields.CharField', [], {'max_length': '120'})
+        }
+    }
+    
+    complete_apps = ['infopages']
diff --git a/apps/infopages/migrations/__init__.py b/apps/infopages/migrations/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/apps/infopages/models.py b/apps/infopages/models.py
new file mode 100644 (file)
index 0000000..15dd94f
--- /dev/null
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+#
+from django.db import models
+from django.utils.translation import ugettext_lazy as _
+
+class InfoPage(models.Model):
+    """
+    An InfoPage is used to display a two-column flatpage
+    """
+    
+    page_title = models.CharField(_('page title'), max_length=120)
+    slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True)
+    title = models.CharField(_('title'), max_length=120)
+    left_column = models.TextField(_('left column'), blank=True)
+    right_column = models.TextField(_('right column'), blank=True)
+
+    class Meta:
+        ordering = ('slug',)
+        verbose_name = _('info page')
+        verbose_name_plural = _('info pages')
+    
+    def __unicode__(self):
+        return self.title
+
diff --git a/apps/lessons/locale/uk/LC_MESSAGES/django.po b/apps/lessons/locale/uk/LC_MESSAGES/django.po
new file mode 100644 (file)
index 0000000..e9b8e76
--- /dev/null
@@ -0,0 +1,49 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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-05-25 11:22+0200\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"
+
+#: models.py:12
+msgid "title"
+msgstr ""
+
+#: models.py:13
+msgid "slug"
+msgstr ""
+
+#: models.py:14
+msgid "file"
+msgstr ""
+
+#: models.py:15
+msgid "author"
+msgstr ""
+
+#: models.py:16
+msgid "slideshare ID"
+msgstr ""
+
+#: models.py:17
+msgid "description"
+msgstr ""
+
+#: models.py:29
+msgid "document"
+msgstr ""
+
+#: models.py:29
+msgid "documents"
+msgstr ""
diff --git a/apps/modeltranslation/__init__.py b/apps/modeltranslation/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/apps/modeltranslation/admin.py b/apps/modeltranslation/admin.py
new file mode 100644 (file)
index 0000000..b51e3a3
--- /dev/null
@@ -0,0 +1,140 @@
+# -*- coding: utf-8 -*-
+from copy import deepcopy
+
+from django import forms, template
+from django.conf import settings
+from django.contrib import admin
+from django.contrib.contenttypes import generic
+
+from modeltranslation.translator import translator
+from modeltranslation.utils import get_translation_fields
+# Ensure that models are registered for translation before TranslationAdmin
+# runs. The import is supposed to resolve a race condition between model import
+# and translation registration in production (see issue 19).
+import modeltranslation.models
+
+
+class TranslationAdminBase(object):
+    """
+    Mixin class which adds patch_translation_field functionality.
+    """
+    def patch_translation_field(self, db_field, field, **kwargs):
+        trans_opts = translator.get_options_for_model(self.model)
+
+        # Hide the original field by making it non-editable.
+        if db_field.name in trans_opts.fields:
+            db_field.editable = False
+
+        # For every localized field copy the widget from the original field
+        if db_field.name in trans_opts.localized_fieldnames_rev:
+            orig_fieldname = trans_opts.localized_fieldnames_rev[db_field.name]
+            orig_formfield = self.formfield_for_dbfield( \
+                                self.model._meta.get_field(orig_fieldname),
+                                                           **kwargs)
+
+            # In case the original form field was required, make the default
+            # translation field required instead.
+            if db_field.language == settings.LANGUAGES[0][0] and \
+               orig_formfield.required:
+                orig_formfield.required = False
+                orig_formfield.blank = True
+                field.required = True
+                field.blank = False
+
+            field.widget = deepcopy(orig_formfield.widget)
+
+
+class TranslationAdmin(admin.ModelAdmin, TranslationAdminBase):
+    def __init__(self, *args, **kwargs):
+        super(TranslationAdmin, self).__init__(*args, **kwargs)
+
+        trans_opts = translator.get_options_for_model(self.model)
+
+        # Replace original field with translation field for each language
+        if self.fields:
+            fields_new = list(self.fields)
+            for field in self.fields:
+                if field in trans_opts.fields:
+                    index = fields_new.index(field)
+                    translation_fields = get_translation_fields(field)
+                    fields_new[index:index + 1] = translation_fields
+            self.fields = fields_new
+
+        if self.fieldsets:
+            fieldsets_new = list(self.fieldsets)
+            for (name, dct) in self.fieldsets:
+                if 'fields' in dct:
+                    fields_new = list(dct['fields'])
+                    for field in dct['fields']:
+                        if field in trans_opts.fields:
+                            index = fields_new.index(field)
+                            translation_fields = get_translation_fields(field)
+                            fields_new[index:index + 1] = translation_fields
+                    dct['fields'] = fields_new
+            self.fieldsets = fieldsets_new
+
+        if self.list_editable:
+            editable_new = list(self.list_editable)
+            display_new = list(self.list_display)
+            for field in self.list_editable:
+                if field in trans_opts.fields:
+                    index = editable_new.index(field)
+                    display_index = display_new.index(field)
+                    translation_fields = get_translation_fields(field)
+                    editable_new[index:index + 1] = translation_fields
+                    display_new[display_index:display_index + 1] = \
+                        translation_fields
+            self.list_editable = editable_new
+            self.list_display = display_new
+
+        if self.prepopulated_fields:
+            prepopulated_fields_new = dict(self.prepopulated_fields)
+            for (k, v) in self.prepopulated_fields.items():
+                translation_fields = get_translation_fields(v[0])
+                prepopulated_fields_new[k] = tuple([translation_fields[0]])
+            self.prepopulated_fields = prepopulated_fields_new
+
+    def formfield_for_dbfield(self, db_field, **kwargs):
+        # Call the baseclass function to get the formfield
+        field = super(TranslationAdmin, self).formfield_for_dbfield(db_field,
+                                                                    **kwargs)
+        self.patch_translation_field(db_field, field, **kwargs)
+        return field
+
+
+class TranslationTabularInline(admin.TabularInline, TranslationAdminBase):
+    def formfield_for_dbfield(self, db_field, **kwargs):
+        # Call the baseclass function to get the formfield
+        field = super(TranslationTabularInline,
+                      self).formfield_for_dbfield(db_field, **kwargs)
+        self.patch_translation_field(db_field, field, **kwargs)
+        return field
+
+
+class TranslationStackedInline(admin.StackedInline, TranslationAdminBase):
+    def formfield_for_dbfield(self, db_field, **kwargs):
+        # Call the baseclass function to get the formfield
+        field = super(TranslationStackedInline,
+                      self).formfield_for_dbfield(db_field, **kwargs)
+        self.patch_translation_field(db_field, field, **kwargs)
+        return field
+
+
+class TranslationGenericTabularInline(generic.GenericTabularInline,
+                                      TranslationAdminBase):
+    def formfield_for_dbfield(self, db_field, **kwargs):
+        # Call the baseclass function to get the formfield
+        field = super(TranslationGenericTabularInline,
+                      self).formfield_for_dbfield(db_field, **kwargs)
+        self.patch_translation_field(db_field, field, **kwargs)
+        return field
+
+
+class TranslationGenericStackedInline(generic.GenericStackedInline,
+                                      TranslationAdminBase):
+    def formfield_for_dbfield(self, db_field, **kwargs):
+        # Call the baseclass function to get the formfield
+        field = super(TranslationGenericStackedInline,
+                      self).formfield_for_dbfield(db_field, **kwargs)
+        self.patch_translation_field(db_field, field, **kwargs)
+        return field
diff --git a/apps/modeltranslation/fields.py b/apps/modeltranslation/fields.py
new file mode 100644 (file)
index 0000000..5498d6b
--- /dev/null
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+from django.conf import settings
+from django.db.models.fields import Field, CharField
+
+from modeltranslation.utils import get_language, build_localized_fieldname
+
+
+class TranslationField(Field):
+    """
+    The translation field functions as a proxy to the original field which is
+    wrapped.
+
+    For every field defined in the model's ``TranslationOptions`` localized
+    versions of that field are added to the model depending on the languages
+    given in ``settings.LANGUAGES``.
+
+    If for example there is a model ``News`` with a field ``title`` which is
+    registered for translation and the ``settings.LANGUAGES`` contains the
+    ``de`` and ``en`` languages, the fields ``title_de`` and ``title_en`` will
+    be added to the model class. These fields are realized using this
+    descriptor.
+
+    The translation field needs to know which language it contains therefore
+    that needs to be specified when the field is created.
+    """
+    def __init__(self, translated_field, language, *args, **kwargs):
+        # Store the originally wrapped field for later
+        self.translated_field = translated_field
+        self.language = language
+
+        # Update the dict of this field with the content of the original one
+        # This might be a bit radical?! Seems to work though...
+        self.__dict__.update(translated_field.__dict__)
+
+        # Translation are always optional (for now - maybe add some parameters
+        # to the translation options for configuring this)
+        self.null = True
+        self.blank = True
+
+        # Adjust the name of this field to reflect the language
+        self.attname = build_localized_fieldname(translated_field.name,
+                                                 language)
+        self.name = self.attname
+
+        # Copy the verbose name and append a language suffix (will e.g. in the
+        # admin). This might be a proxy function so we have to check that here.
+        if hasattr(translated_field.verbose_name, '_proxy____unicode_cast'):
+            verbose_name = \
+                translated_field.verbose_name._proxy____unicode_cast()
+        else:
+            verbose_name = translated_field.verbose_name
+        self.verbose_name = '%s [%s]' % (verbose_name, language)
+
+    def pre_save(self, model_instance, add):
+        val = super(TranslationField, self).pre_save(model_instance, add)
+        if get_language() == self.language and not add:
+            # Rule is: 3. Assigning a value to a translation field of the
+            # default language also updates the original field
+            model_instance.__dict__[self.translated_field.name] = val
+        return val
+
+    def get_internal_type(self):
+        return self.translated_field.get_internal_type()
+
+    #def contribute_to_class(self, cls, name):
+        #super(TranslationField, self).contribute_to_class(cls, name)
+        ##setattr(cls, 'get_%s_display' % self.name,
+                ##curry(cls._get_FIELD_display, field=self))
+
+    def south_field_triple(self):
+        """Returns a suitable description of this field for South."""
+        # We'll just introspect the _actual_ field.
+        from south.modelsinspector import introspector
+        field_class = '%s.%s' % (self.translated_field.__class__.__module__,
+                                 self.translated_field.__class__.__name__)
+        args, kwargs = introspector(self.translated_field)
+        # That's our definition!
+        return (field_class, args, kwargs)
+
+    def formfield(self, *args, **kwargs):
+        """Preserves the widget of the translated field."""
+        trans_formfield = self.translated_field.formfield(*args, **kwargs)
+        defaults = {'widget': type(trans_formfield.widget)}
+        defaults.update(kwargs)
+        return super(TranslationField, self).formfield(*args, **defaults)
+
+
+#class CurrentLanguageField(CharField):
+    #def __init__(self, **kwargs):
+        #super(CurrentLanguageField, self).__init__(null=True, max_length=5,
+              #**kwargs)
+
+    #def contribute_to_class(self, cls, name):
+        #super(CurrentLanguageField, self).contribute_to_class(cls, name)
+        #registry = CurrentLanguageFieldRegistry()
+        #registry.add_field(cls, self)
+
+
+#class CurrentLanguageFieldRegistry(object):
+    #_registry = {}
+
+    #def add_field(self, model, field):
+        #reg = self.__class__._registry.setdefault(model, [])
+        #reg.append(field)
+
+    #def get_fields(self, model):
+        #return self.__class__._registry.get(model, [])
+
+    #def __contains__(self, model):
+        #return model in self.__class__._registry
diff --git a/apps/modeltranslation/management/__init__.py b/apps/modeltranslation/management/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/apps/modeltranslation/management/commands/__init__.py b/apps/modeltranslation/management/commands/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/apps/modeltranslation/management/commands/update_translation_fields.py b/apps/modeltranslation/management/commands/update_translation_fields.py
new file mode 100644 (file)
index 0000000..adb5e6d
--- /dev/null
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+from django.conf import settings
+from django.core.management.base import (BaseCommand, CommandError,
+                                         NoArgsCommand)
+
+from modeltranslation.translator import translator
+from modeltranslation.utils import build_localized_fieldname
+
+
+class Command(NoArgsCommand):
+    help = 'Updates the default translation fields of all or the specified' \
+           'translated application using the value of the original field.'
+
+    def handle(self, **options):
+        default_lang = settings.LANGUAGES[0][0]
+        print "Using default language:", default_lang
+
+        for model, trans_opts in translator._registry.items():
+            print "Updating data of model '%s'" % model
+            for obj in model.objects.all():
+                for fieldname in trans_opts.fields:
+                    def_lang_fieldname = \
+                        build_localized_fieldname(fieldname, default_lang)
+                    #print "setting %s from %s to %s." % \
+                          #(def_lang_fieldname, fieldname,
+                           #obj.__dict__[fieldname])
+                    if not getattr(obj, def_lang_fieldname):
+                        setattr(obj, def_lang_fieldname,
+                                obj.__dict__[fieldname])
+                obj.save()
diff --git a/apps/modeltranslation/models.py b/apps/modeltranslation/models.py
new file mode 100644 (file)
index 0000000..739c897
--- /dev/null
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+import sys
+
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+from django.db import models
+
+from modeltranslation.translator import translator
+
+# Every model registered with the modeltranslation.translator.translator
+# is patched to contain additional localized versions for every
+# field specified in the model's translation options.
+
+# Import the project's global "translation.py" which registers model
+# classes and their translation options with the translator object.
+if getattr(settings, 'TRANSLATION_REGISTRY', False):
+    try:
+        __import__(settings.TRANSLATION_REGISTRY, {}, {}, [''])
+    except ImportError:
+        sys.stderr.write("modeltranslation: Can't import module '%s'.\n"
+                         "(If the module exists, it's causing an "
+                         "ImportError somehow.)\n" %\
+                         settings.TRANSLATION_REGISTRY)
+        # For some reason ImportErrors raised in translation.py or in modules
+        # that are included from there become swallowed. Work around this
+        # problem by printing the traceback explicitly.
+        import traceback
+        traceback.print_exc()
+
+    # After importing all translation modules, all translation classes are
+    # registered with the translator.
+    if settings.DEBUG:
+        try:
+            if sys.argv[1] in ('runserver', 'runserver_plus'):
+                translated_model_names = ', '.join(
+                    t.__name__ for t in translator._registry.keys())
+                print('modeltranslation: Registered %d models for '
+                      'translation (%s).' % (len(translator._registry),
+                                             translated_model_names))
+        except IndexError:
+            pass
+else:
+    raise ImproperlyConfigured("You haven't set the TRANSLATION_REGISTRY "
+                               "setting yet.")
diff --git a/apps/modeltranslation/tests.py b/apps/modeltranslation/tests.py
new file mode 100644 (file)
index 0000000..3e0f39b
--- /dev/null
@@ -0,0 +1,258 @@
+# -*- coding: utf-8 -*-
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.contrib.contenttypes.models import ContentType
+from django.db import models
+from django.test import TestCase
+from django.utils.thread_support import currentThread
+from django.utils.translation import get_language
+from django.utils.translation import trans_real
+
+# TODO: tests for TranslationAdmin
+
+from modeltranslation import translator
+
+settings.LANGUAGES = (('de', 'Deutsch'),
+                      ('en', 'English'))
+
+
+class TestModel(models.Model):
+    title = models.CharField(max_length=255)
+    text = models.TextField(null=True)
+
+
+class TestTranslationOptions(translator.TranslationOptions):
+    fields = ('title', 'text',)
+
+
+translator.translator._registry = {}
+translator.translator.register(TestModel, TestTranslationOptions)
+
+
+class ModelTranslationTest(TestCase):
+    """Basic tests for the modeltranslation application."""
+    urls = 'modeltranslation.testurls'
+
+    def setUp(self):
+        trans_real.activate("de")
+
+    def tearDown(self):
+        trans_real.deactivate()
+
+    def test_registration(self):
+        self.client.post('/set_language/', data={'language': 'de'})
+        #self.client.session['django_language'] = 'de-de'
+        #self.client.cookies[settings.LANGUAGE_COOKIE_NAME] = 'de-de'
+
+        langs = tuple(l[0] for l in settings.LANGUAGES)
+        self.failUnlessEqual(2, len(langs))
+        self.failUnless('de' in langs)
+        self.failUnless('en' in langs)
+        self.failUnless(translator.translator)
+
+        # Check that only one model is registered for translation
+        self.failUnlessEqual(len(translator.translator._registry), 1)
+
+        # Try to unregister a model that is not registered
+        self.assertRaises(translator.NotRegistered,
+                          translator.translator.unregister, User)
+
+        # Try to get options for a model that is not registered
+        self.assertRaises(translator.NotRegistered,
+                          translator.translator.get_options_for_model, User)
+
+    def test_translated_models(self):
+        # First create an instance of the test model to play with
+        inst = TestModel.objects.create(title="Testtitle", text="Testtext")
+        field_names = dir(inst)
+        self.failUnless('id' in field_names)
+        self.failUnless('title' in field_names)
+        self.failUnless('text' in field_names)
+        self.failUnless('title_de' in field_names)
+        self.failUnless('title_en' in field_names)
+        self.failUnless('text_de' in field_names)
+        self.failUnless('text_en' in field_names)
+
+        inst.delete()
+
+    def test_set_translation(self):
+        self.failUnlessEqual(get_language(), "de")
+        # First create an instance of the test model to play with
+        title1_de = "title de"
+        title1_en = "title en"
+        title2_de = "title2 de"
+        inst1 = TestModel(title_en=title1_en, text="Testtext")
+        inst1.title = title1_de
+        inst2 = TestModel(title=title2_de, text="Testtext")
+        inst1.save()
+        inst2.save()
+
+        self.failUnlessEqual(inst1.title, title1_de)
+        self.failUnlessEqual(inst1.title_en, title1_en)
+
+        self.failUnlessEqual(inst2.title, title2_de)
+        self.failUnlessEqual(inst2.title_en, None)
+
+        del inst1
+        del inst2
+
+        # Check that the translation fields are correctly saved and provide the
+        # correct value when retrieving them again.
+        n = TestModel.objects.get(title=title1_de)
+        self.failUnlessEqual(n.title, title1_de)
+        self.failUnlessEqual(n.title_en, title1_en)
+
+    def test_titleonly(self):
+        title1_de = "title de"
+        n = TestModel.objects.create(title=title1_de)
+        self.failUnlessEqual(n.title, title1_de)
+        # Because the original field "title" was specified in the constructor
+        # it is directly passed into the instance's __dict__ and the descriptor
+        # which updates the associated default translation field is not called
+        # and the default translation will be None.
+        self.failUnlessEqual(n.title_de, None)
+        self.failUnlessEqual(n.title_en, None)
+
+        # Now assign the title, that triggers the descriptor and the default
+        # translation field is updated
+        n.title = title1_de
+        self.failUnlessEqual(n.title, title1_de)
+        self.failUnlessEqual(n.title_de, title1_de)
+        self.failUnlessEqual(n.title_en, None)
+
+    def test_rule1(self):
+        """
+        Rule 1: Reading the value from the original field returns the value in
+        translated to the current language.
+        """
+        title1_de = "title de"
+        title1_en = "title en"
+        text_de = "Dies ist ein deutscher Satz"
+        text_en = "This is an english sentence"
+
+        # Test 1.
+        n = TestModel.objects.create(title_de=title1_de, title_en=title1_en,
+                                     text_de=text_de, text_en=text_en)
+        n.save()
+
+        # language is set to "de" at this point
+        self.failUnlessEqual(get_language(), "de")
+        self.failUnlessEqual(n.title, title1_de)
+        self.failUnlessEqual(n.title_de, title1_de)
+        self.failUnlessEqual(n.title_en, title1_en)
+        self.failUnlessEqual(n.text, text_de)
+        self.failUnlessEqual(n.text_de, text_de)
+        self.failUnlessEqual(n.text_en, text_en)
+        # Now switch to "en"
+        trans_real.activate("en")
+        self.failUnlessEqual(get_language(), "en")
+        # Title should now be return the english one (just by switching the
+        # language)
+        self.failUnlessEqual(n.title, title1_en)
+        self.failUnlessEqual(n.text, text_en)
+
+        n = TestModel.objects.create(title_de=title1_de, title_en=title1_en,
+                                     text_de=text_de, text_en=text_en)
+        n.save()
+        # language is set to "en" at this point
+        self.failUnlessEqual(n.title, title1_en)
+        self.failUnlessEqual(n.title_de, title1_de)
+        self.failUnlessEqual(n.title_en, title1_en)
+        self.failUnlessEqual(n.text, text_en)
+        self.failUnlessEqual(n.text_de, text_de)
+        self.failUnlessEqual(n.text_en, text_en)
+        trans_real.activate("de")
+        self.failUnlessEqual(get_language(), "de")
+        self.failUnlessEqual(n.title, title1_de)
+        self.failUnlessEqual(n.text, text_de)
+        trans_real.deactivate()
+
+    def test_rule2(self):
+        """
+        Rule 2: Assigning a value to the original field also updates the value
+        in the associated translation field of the default language
+        """
+        self.failUnlessEqual(get_language(), "de")
+        title1_de = "title de"
+        title1_en = "title en"
+        n = TestModel.objects.create(title_de=title1_de, title_en=title1_en)
+        self.failUnlessEqual(n.title, title1_de)
+        self.failUnlessEqual(n.title_de, title1_de)
+        self.failUnlessEqual(n.title_en, title1_en)
+
+        title2 = "Neuer Titel"
+        n.title = title2
+        n.save()
+        self.failUnlessEqual(n.title, title2)
+        self.failUnlessEqual(n.title, n.title_de)
+
+        trans_real.activate("en")
+        self.failUnlessEqual(get_language(), "en")
+        title3 = "new title"
+
+        n.title = title3
+        n.title_de = title1_de
+        n.save()
+        self.failUnlessEqual(n.title, title3)
+        self.failUnlessEqual(n.title, n.title_en)
+        self.failUnlessEqual(title1_de, n.title_de)
+
+        trans_real.deactivate()
+
+    def test_rule3(self):
+        """
+        Rule 3: Assigning a value to a translation field of the default
+        language also updates the original field - note that the value of the
+        original field will not be updated until the model instance is saved.
+        """
+        title1_de = "title de"
+        title1_en = "title en"
+        n = TestModel.objects.create(title_de=title1_de, title_en=title1_en)
+        self.failUnlessEqual(get_language(), "de")
+        self.failUnlessEqual(n.title, title1_de)
+        self.failUnlessEqual(n.title_de, title1_de)
+        self.failUnlessEqual(n.title_en, title1_en)
+
+        n.title_de = "Neuer Titel"
+        n.save()
+        self.failUnlessEqual(n.title, n.title_de)
+
+        # Now switch to "en"
+        trans_real.activate("en")
+        self.failUnlessEqual(get_language(), "en")
+        n.title_en = "New title"
+        # the n.title field is not updated before the instance is saved
+        n.save()
+        self.failUnlessEqual(n.title, n.title_en)
+        trans_real.deactivate()
+
+    def test_rule4(self):
+        """
+        Rule 4: If both fields - the original and the translation field of the
+        default language - are updated at the same time, the translation field
+        wins.
+        """
+        self.failUnlessEqual(get_language(), "de")
+        title1_de = "title de"
+        title1_en = "title en"
+        n = TestModel.objects.create(title_de=title1_de, title_en=title1_en)
+        self.failUnlessEqual(n.title, title1_de)
+        self.failUnlessEqual(n.title_de, title1_de)
+        self.failUnlessEqual(n.title_en, title1_en)
+
+        title2_de = "neu de"
+        title2_en = "new en"
+        title_foo = "foo"
+        n.title = title_foo
+        n.title_de = title2_de
+        n.title_en = title2_en
+        n.save()
+        self.failUnlessEqual(n.title, title2_de)
+        self.failUnlessEqual(n.title_de, title2_de)
+        self.failUnlessEqual(n.title_en, title2_en)
+
+        n.title = title_foo
+        n.save()
+        self.failUnlessEqual(n.title, title_foo)
+        self.failUnlessEqual(n.title_de, title_foo)
+        self.failUnlessEqual(n.title_en, title2_en)
diff --git a/apps/modeltranslation/testurls.py b/apps/modeltranslation/testurls.py
new file mode 100644 (file)
index 0000000..8cb4d86
--- /dev/null
@@ -0,0 +1,7 @@
+# -*- coding: utf-8 -*-
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+    url(r'^set_language/$', 'django.views.i18n.set_language', {},
+        name='set_language'),
+)
diff --git a/apps/modeltranslation/translator.py b/apps/modeltranslation/translator.py
new file mode 100644 (file)
index 0000000..0a55362
--- /dev/null
@@ -0,0 +1,191 @@
+# -*- coding: utf-8 -*-
+from django.conf import settings
+#from django.contrib.contenttypes.models import ContentType
+from django.db import models
+from django.db.models import signals
+from django.db.models.base import ModelBase
+from django.utils.functional import curry
+
+from modeltranslation.fields import TranslationField
+from modeltranslation.utils import (TranslationFieldDescriptor,
+                                    build_localized_fieldname)
+
+
+class AlreadyRegistered(Exception):
+    pass
+
+
+class NotRegistered(Exception):
+    pass
+
+
+class TranslationOptions(object):
+    """
+    The TranslationOptions object is used to specify the fields to translate.
+
+    The options are registered in combination with a model class at the
+    ``modeltranslation.translator.translator`` instance.
+
+    It caches the content type of the translated model for faster lookup later
+    on.
+    """
+    def __init__(self, *args, **kwargs):
+        # self.translation_model = None
+        #self.model_ct = None
+        self.localized_fieldnames = list()
+
+
+def add_localized_fields(model):
+    """
+    Monkey patchs the original model class to provide additional fields for
+    every language. Only do that for fields which are defined in the
+    translation options of the model.
+
+    Returns a dict mapping the original fieldname to a list containing the
+    names of the localized fields created for the original field.
+    """
+    localized_fields = dict()
+    translation_opts = translator.get_options_for_model(model)
+    for field_name in translation_opts.fields:
+        localized_fields[field_name] = list()
+        for l in settings.LANGUAGES:
+            # Construct the name for the localized field
+            localized_field_name = build_localized_fieldname(field_name, l[0])
+            # Check if the model already has a field by that name
+            if hasattr(model, localized_field_name):
+                raise ValueError("Error adding translation field. The model "\
+                                 "'%s' already contains a field named '%s'. "\
+                                 % (instance.__class__.__name__,
+                                    localized_field_name))
+
+            # This approach implements the translation fields as full valid
+            # django model fields and therefore adds them via add_to_class
+            localized_field = model.add_to_class( \
+                localized_field_name,
+                TranslationField(model._meta.get_field(field_name), l[0]))
+            localized_fields[field_name].append(localized_field_name)
+    return localized_fields
+
+
+#def translated_model_initialized(field_names, instance, **kwargs):
+    #print "translated_model_initialized instance:", \
+          #instance, ", field:", field_names
+    #for field_name in field_names:
+        #initial_val = getattr(instance, field_name)
+        #print "  field: %s, initialval: %s" % (field_name, initial_val)
+        #setattr(instance.__class__, field_name,
+                #TranslationFieldDescriptor(field_name, initial_val))
+
+
+#def translated_model_initializing(sender, args, kwargs, **signal_kwargs):
+    #print "translated_model_initializing", sender, args, kwargs
+    #trans_opts = translator.get_options_for_model(sender)
+    #for field_name in trans_opts.fields:
+        #setattr(sender, field_name, TranslationFieldDescriptor(field_name))
+
+
+class Translator(object):
+    """
+    A Translator object encapsulates an instance of a translator. Models are
+    registered with the Translator using the register() method.
+    """
+    def __init__(self):
+        # model_class class -> translation_opts instance
+        self._registry = {}
+
+    def register(self, model_or_iterable, translation_opts, **options):
+        """
+        Registers the given model(s) with the given translation options.
+
+        The model(s) should be Model classes, not instances.
+
+        If a model is already registered for translation, this will raise
+        AlreadyRegistered.
+        """
+        # Don't import the humongous validation code unless required
+        if translation_opts and settings.DEBUG:
+            from django.contrib.admin.validation import validate
+        else:
+            validate = lambda model, adminclass: None
+
+        #if not translation_opts:
+            #translation_opts = TranslationOptions
+        if isinstance(model_or_iterable, ModelBase):
+            model_or_iterable = [model_or_iterable]
+
+        for model in model_or_iterable:
+            if model in self._registry:
+                raise AlreadyRegistered('The model %s is already registered '
+                                        'for translation' % model.__name__)
+
+            # If we got **options then dynamically construct a subclass of
+            # translation_opts with those **options.
+            if options:
+                # For reasons I don't quite understand, without a __module__
+                # the created class appears to "live" in the wrong place,
+                # which causes issues later on.
+                options['__module__'] = __name__
+                translation_opts = type("%sAdmin" % model.__name__,
+                                        (translation_opts,), options)
+
+            # Validate (which might be a no-op)
+            #validate(translation_opts, model)
+
+            # Store the translation class associated to the model
+            self._registry[model] = translation_opts
+
+            # Get the content type of the original model and store it on the
+            # translation options for faster lookup later on.
+            #translation_opts.model_ct = \
+                #ContentType.objects.get_for_model(model)
+
+            # Add the localized fields to the model and store the names of
+            # these fields in the model's translation options for faster lookup
+            # later on.
+            translation_opts.localized_fieldnames = add_localized_fields(model)
+
+            # Create a reverse dict mapping the localized_fieldnames to the
+            # original fieldname
+            rev_dict = dict()
+            for orig_name, loc_names in \
+                translation_opts.localized_fieldnames.items():
+                for ln in loc_names:
+                    rev_dict[ln] = orig_name
+
+            translation_opts.localized_fieldnames_rev = rev_dict
+
+        # print "Applying descriptor field for model %s" % model
+        for field_name in translation_opts.fields:
+            setattr(model, field_name, TranslationFieldDescriptor(field_name))
+
+        #signals.pre_init.connect(translated_model_initializing, sender=model,
+                                 #weak=False)
+
+    def unregister(self, model_or_iterable):
+        """
+        Unregisters the given model(s).
+
+        If a model isn't already registered, this will raise NotRegistered.
+        """
+        if isinstance(model_or_iterable, ModelBase):
+            model_or_iterable = [model_or_iterable]
+        for model in model_or_iterable:
+            if model not in self._registry:
+                raise NotRegistered('The model "%s" is not registered for '
+                                    'translation' % model.__name__)
+            del self._registry[model]
+
+    def get_options_for_model(self, model):
+        """
+        Returns the translation options for the given ``model``. If the
+        ``model`` is not registered a ``NotRegistered`` exception is raised.
+        """
+        try:
+            return self._registry[model]
+        except KeyError:
+            raise NotRegistered('The model "%s" is not registered for '
+                                'translation' % model.__name__)
+
+
+# This global object represents the singleton translator object
+translator = Translator()
diff --git a/apps/modeltranslation/utils.py b/apps/modeltranslation/utils.py
new file mode 100644 (file)
index 0000000..aeb57d1
--- /dev/null
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+from django.db import models
+from django.conf import settings
+from django.core.exceptions import ValidationError
+from django.contrib.contenttypes.models import ContentType
+from django.utils.translation import get_language as _get_language
+
+
+def get_language():
+    """
+    Return an active language code that is guaranteed to be in
+    settings.LANGUAGES (Django does not seem to guarantee this for us.)
+
+    """
+    lang = _get_language()
+    available_languages = [l[0] for l in settings.LANGUAGES]
+    if lang not in available_languages and '-' in lang:
+        lang = lang.split('-')[0]
+    if lang in available_languages:
+        return lang
+    return available_languages[0]
+
+
+def get_translation_fields(field):
+    """Returns a list of localized fieldnames for a given field."""
+    return [build_localized_fieldname(field, l[0]) for l in settings.LANGUAGES]
+
+
+def build_localized_fieldname(field_name, lang):
+    return '%s_%s' % (field_name, lang.replace('-', '_'))
+
+
+class TranslationFieldDescriptor(object):
+    """A descriptor used for the original translated field."""
+    def __init__(self, name, initial_val=""):
+        """
+        The ``name`` is the name of the field (which is not available in the
+        descriptor by default - this is Python behaviour).
+        """
+        self.name = name
+        self.val = initial_val
+
+    def __set__(self, instance, value):
+        lang = get_language()
+        loc_field_name = build_localized_fieldname(self.name, lang)
+        # also update the translation field of the current language
+        setattr(instance, loc_field_name, value)
+        # update the original field via the __dict__ to prevent calling the
+        # descriptor
+        instance.__dict__[self.name] = value
+
+    def __get__(self, instance, owner):
+        if not instance:
+            raise ValueError(u"Translation field '%s' can only be "
+                              "accessed via an instance not via "
+                              "a class." % self.name)
+        lang = get_language()
+        loc_field_name = build_localized_fieldname(self.name, lang)
+        if hasattr(instance, loc_field_name):
+            return getattr(instance, loc_field_name) or \
+                   instance.__dict__[self.name]
+        return instance.__dict__[self.name]
+
+
+#def create_model(name, fields=None, app_label='', module='', options=None,
+                 #admin_opts=None):
+    #"""
+    #Create specified model.
+    #This is taken from http://code.djangoproject.com/wiki/DynamicModels
+    #"""
+    #class Meta:
+        ## Using type('Meta', ...) gives a dictproxy error during model
+        ## creation
+        #pass
+
+    #if app_label:
+        ## app_label must be set using the Meta inner class
+        #setattr(Meta, 'app_label', app_label)
+
+    ## Update Meta with any options that were provided
+    #if options is not None:
+        #for key, value in options.iteritems():
+            #setattr(Meta, key, value)
+
+    ## Set up a dictionary to simulate declarations within a class
+    #attrs = {'__module__': module, 'Meta': Meta}
+
+    ## Add in any fields that were provided
+    #if fields:
+        #attrs.update(fields)
+
+    ## Create the class, which automatically triggers ModelBase processing
+    #model = type(name, (models.Model,), attrs)
+
+    ## Create an Admin class if admin options were provided
+    #if admin_opts is not None:
+        #class Admin(admin.ModelAdmin):
+            #pass
+        #for key, value in admin_opts:
+            #setattr(Admin, key, value)
+        #admin.site.register(model, Admin)
+
+    #return model
+
+
+def copy_field(field):
+    """
+    Instantiate a new field, with all of the values from the old one, except
+    the to and to_field in the case of related fields.
+
+    This taken from http://www.djangosnippets.org/snippets/442/
+    """
+    base_kw = dict([(n, getattr(field, n, '_null')) for n in \
+              models.fields.Field.__init__.im_func.func_code.co_varnames])
+    if isinstance(field, models.fields.related.RelatedField):
+        rel = base_kw.get('rel')
+        rel_kw = dict([(n, getattr(rel, n, '_null')) for n in \
+                 rel.__init__.im_func.func_code.co_varnames])
+        if isinstance(field, models.fields.related.ForeignKey):
+            base_kw['to_field'] = rel_kw.pop('field_name')
+        base_kw.update(rel_kw)
+    base_kw.pop('self')
+    return field.__class__(**base_kw)
diff --git a/apps/newtagging/locale/uk/LC_MESSAGES/django.po b/apps/newtagging/locale/uk/LC_MESSAGES/django.po
new file mode 100644 (file)
index 0000000..f4bf97f
--- /dev/null
@@ -0,0 +1,50 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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-05-25 11:22+0200\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"
+
+#: admin.py:38
+msgid "tags"
+msgstr ""
+
+#: models.py:491
+msgid "tag"
+msgstr ""
+
+#: models.py:492
+msgid "content type"
+msgstr ""
+
+#: models.py:493
+msgid "object id"
+msgstr ""
+
+#: views.py:30
+msgid "tagged_object_list must be called with a queryset or a model."
+msgstr ""
+
+#: views.py:32
+msgid "tagged_object_list must be called with a tag model."
+msgstr ""
+
+#: views.py:34
+msgid "tagged_object_list must be called with a tag."
+msgstr ""
+
+#: views.py:38
+#, python-format
+msgid "No tags found matching \"%s\"."
+msgstr ""
diff --git a/apps/sponsors/locale/de/LC_MESSAGES/django.po b/apps/sponsors/locale/de/LC_MESSAGES/django.po
new file mode 100644 (file)
index 0000000..05536bc
--- /dev/null
@@ -0,0 +1,37 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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-05-25 14:24+0200\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"
+
+#: models.py:14 models.py:37
+msgid "name"
+msgstr ""
+
+#: models.py:15
+msgid "description"
+msgstr ""
+
+#: models.py:17
+msgid "logo"
+msgstr ""
+
+#: models.py:24
+msgid "url"
+msgstr ""
+
+#: models.py:38
+msgid "sponsors"
+msgstr ""
diff --git a/apps/sponsors/locale/uk/LC_MESSAGES/django.po b/apps/sponsors/locale/uk/LC_MESSAGES/django.po
new file mode 100644 (file)
index 0000000..d146b23
--- /dev/null
@@ -0,0 +1,37 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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-05-25 11:22+0200\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"
+
+#: models.py:14 models.py:37
+msgid "name"
+msgstr ""
+
+#: models.py:15
+msgid "description"
+msgstr ""
+
+#: models.py:17
+msgid "logo"
+msgstr ""
+
+#: models.py:24
+msgid "url"
+msgstr ""
+
+#: models.py:38
+msgid "sponsors"
+msgstr ""
index 7b038fe..55259ba 100644 (file)
Binary files a/wolnelektury/locale/de/LC_MESSAGES/django.mo and b/wolnelektury/locale/de/LC_MESSAGES/django.mo differ
index e1c2ee1..bc5d3d5 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-19 16:20+0200\n"
+"POT-Creation-Date: 2010-05-25 14:29+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ msgstr ""
 msgid "Spanish"
 msgstr ""
 
 msgid "Spanish"
 msgstr ""
 
+#: settings.py:44
+msgid "Ukrainian"
+msgstr ""
+
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
@@ -146,7 +150,9 @@ msgstr ""
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
@@ -154,7 +160,9 @@ msgstr ""
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
@@ -180,7 +188,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
@@ -191,7 +199,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
-#: templates/catalogue/tagged_object_list.html:41
+#: templates/catalogue/tagged_object_list.html:41 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
@@ -315,6 +323,10 @@ msgstr ""
 msgid "in work "
 msgstr ""
 
 msgid "in work "
 msgstr ""
 
+#: templates/catalogue/book_fragments.html:5
+msgid "on"
+msgstr ""
+
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
@@ -558,21 +570,35 @@ msgid ""
 "\t\t\t"
 msgstr ""
 
 "\t\t\t"
 msgstr ""
 
+#: templates/catalogue/search_multiple_hits.html:5
+#: templates/catalogue/search_too_short.html:5
+msgid "Searching in"
+msgstr ""
+
+#: templates/catalogue/search_multiple_hits.html:14
+msgid "More than one result matching the criteria found."
+msgstr ""
+
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:15
+#: templates/catalogue/search_no_hits.html:14
+#: templates/catalogue/tagged_object_list.html:102
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:17
+#: templates/catalogue/search_no_hits.html:16
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
+#: templates/catalogue/search_too_short.html:14
+msgid "Sorry! Search query must have at least two characters."
+msgstr ""
+
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
@@ -701,10 +727,6 @@ msgstr ""
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
-#: templates/catalogue/tagged_object_list.html:102
-msgid "No works of this author found."
-msgstr ""
-
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
@@ -713,6 +735,29 @@ msgstr ""
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
+#: templates/info/base.html:10
+msgid "return to the main page"
+msgstr ""
+
+#: templates/info/join_us.html:2
+#, python-format
+msgid ""
+"We have over 1000 works published in Wolne Lektury!\n"
+"Help us expand the library and set new readings free by\n"
+"making a donation or transferring 1%% of your income tax."
+msgstr ""
+
+#: templates/info/join_us.html:5 templates/info/join_us.html.py:10
+msgid "More..."
+msgstr ""
+
+#: templates/info/join_us.html:7
+msgid ""
+"Become an editor of Wolne Lektury! Find out if\n"
+"we're currently working on a reading you're looking for and prepare\n"
+"a publication by yourself by logging into the Editorial Platform."
+msgstr ""
+
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
index 7b038fe..55259ba 100644 (file)
Binary files a/wolnelektury/locale/en/LC_MESSAGES/django.mo and b/wolnelektury/locale/en/LC_MESSAGES/django.mo differ
index e1c2ee1..bc5d3d5 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-19 16:20+0200\n"
+"POT-Creation-Date: 2010-05-25 14:29+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ msgstr ""
 msgid "Spanish"
 msgstr ""
 
 msgid "Spanish"
 msgstr ""
 
+#: settings.py:44
+msgid "Ukrainian"
+msgstr ""
+
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
@@ -146,7 +150,9 @@ msgstr ""
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
@@ -154,7 +160,9 @@ msgstr ""
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
@@ -180,7 +188,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
@@ -191,7 +199,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
-#: templates/catalogue/tagged_object_list.html:41
+#: templates/catalogue/tagged_object_list.html:41 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
@@ -315,6 +323,10 @@ msgstr ""
 msgid "in work "
 msgstr ""
 
 msgid "in work "
 msgstr ""
 
+#: templates/catalogue/book_fragments.html:5
+msgid "on"
+msgstr ""
+
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
@@ -558,21 +570,35 @@ msgid ""
 "\t\t\t"
 msgstr ""
 
 "\t\t\t"
 msgstr ""
 
+#: templates/catalogue/search_multiple_hits.html:5
+#: templates/catalogue/search_too_short.html:5
+msgid "Searching in"
+msgstr ""
+
+#: templates/catalogue/search_multiple_hits.html:14
+msgid "More than one result matching the criteria found."
+msgstr ""
+
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:15
+#: templates/catalogue/search_no_hits.html:14
+#: templates/catalogue/tagged_object_list.html:102
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:17
+#: templates/catalogue/search_no_hits.html:16
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
+#: templates/catalogue/search_too_short.html:14
+msgid "Sorry! Search query must have at least two characters."
+msgstr ""
+
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
@@ -701,10 +727,6 @@ msgstr ""
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
-#: templates/catalogue/tagged_object_list.html:102
-msgid "No works of this author found."
-msgstr ""
-
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
@@ -713,6 +735,29 @@ msgstr ""
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
+#: templates/info/base.html:10
+msgid "return to the main page"
+msgstr ""
+
+#: templates/info/join_us.html:2
+#, python-format
+msgid ""
+"We have over 1000 works published in Wolne Lektury!\n"
+"Help us expand the library and set new readings free by\n"
+"making a donation or transferring 1%% of your income tax."
+msgstr ""
+
+#: templates/info/join_us.html:5 templates/info/join_us.html.py:10
+msgid "More..."
+msgstr ""
+
+#: templates/info/join_us.html:7
+msgid ""
+"Become an editor of Wolne Lektury! Find out if\n"
+"we're currently working on a reading you're looking for and prepare\n"
+"a publication by yourself by logging into the Editorial Platform."
+msgstr ""
+
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
index e98412d..55259ba 100644 (file)
Binary files a/wolnelektury/locale/es/LC_MESSAGES/django.mo and b/wolnelektury/locale/es/LC_MESSAGES/django.mo differ
index 2d61afc..bc5d3d5 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-19 16:21+0200\n"
+"POT-Creation-Date: 2010-05-25 14:29+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ msgstr ""
 msgid "Spanish"
 msgstr ""
 
 msgid "Spanish"
 msgstr ""
 
+#: settings.py:44
+msgid "Ukrainian"
+msgstr ""
+
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
@@ -146,7 +150,9 @@ msgstr ""
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
@@ -154,7 +160,9 @@ msgstr ""
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
@@ -180,7 +188,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
@@ -191,7 +199,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
-#: templates/catalogue/tagged_object_list.html:41
+#: templates/catalogue/tagged_object_list.html:41 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
@@ -315,6 +323,10 @@ msgstr ""
 msgid "in work "
 msgstr ""
 
 msgid "in work "
 msgstr ""
 
+#: templates/catalogue/book_fragments.html:5
+msgid "on"
+msgstr ""
+
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
@@ -558,21 +570,35 @@ msgid ""
 "\t\t\t"
 msgstr ""
 
 "\t\t\t"
 msgstr ""
 
+#: templates/catalogue/search_multiple_hits.html:5
+#: templates/catalogue/search_too_short.html:5
+msgid "Searching in"
+msgstr ""
+
+#: templates/catalogue/search_multiple_hits.html:14
+msgid "More than one result matching the criteria found."
+msgstr ""
+
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:15
+#: templates/catalogue/search_no_hits.html:14
+#: templates/catalogue/tagged_object_list.html:102
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:17
+#: templates/catalogue/search_no_hits.html:16
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
+#: templates/catalogue/search_too_short.html:14
+msgid "Sorry! Search query must have at least two characters."
+msgstr ""
+
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
@@ -701,10 +727,6 @@ msgstr ""
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
-#: templates/catalogue/tagged_object_list.html:102
-msgid "No works of this author found."
-msgstr ""
-
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
@@ -713,6 +735,29 @@ msgstr ""
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
+#: templates/info/base.html:10
+msgid "return to the main page"
+msgstr ""
+
+#: templates/info/join_us.html:2
+#, python-format
+msgid ""
+"We have over 1000 works published in Wolne Lektury!\n"
+"Help us expand the library and set new readings free by\n"
+"making a donation or transferring 1%% of your income tax."
+msgstr ""
+
+#: templates/info/join_us.html:5 templates/info/join_us.html.py:10
+msgid "More..."
+msgstr ""
+
+#: templates/info/join_us.html:7
+msgid ""
+"Become an editor of Wolne Lektury! Find out if\n"
+"we're currently working on a reading you're looking for and prepare\n"
+"a publication by yourself by logging into the Editorial Platform."
+msgstr ""
+
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
index e98412d..55259ba 100644 (file)
Binary files a/wolnelektury/locale/fr/LC_MESSAGES/django.mo and b/wolnelektury/locale/fr/LC_MESSAGES/django.mo differ
index 2d61afc..bc5d3d5 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-19 16:21+0200\n"
+"POT-Creation-Date: 2010-05-25 14:29+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ msgstr ""
 msgid "Spanish"
 msgstr ""
 
 msgid "Spanish"
 msgstr ""
 
+#: settings.py:44
+msgid "Ukrainian"
+msgstr ""
+
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
@@ -146,7 +150,9 @@ msgstr ""
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
@@ -154,7 +160,9 @@ msgstr ""
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
@@ -180,7 +188,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
@@ -191,7 +199,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
-#: templates/catalogue/tagged_object_list.html:41
+#: templates/catalogue/tagged_object_list.html:41 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
@@ -315,6 +323,10 @@ msgstr ""
 msgid "in work "
 msgstr ""
 
 msgid "in work "
 msgstr ""
 
+#: templates/catalogue/book_fragments.html:5
+msgid "on"
+msgstr ""
+
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
@@ -558,21 +570,35 @@ msgid ""
 "\t\t\t"
 msgstr ""
 
 "\t\t\t"
 msgstr ""
 
+#: templates/catalogue/search_multiple_hits.html:5
+#: templates/catalogue/search_too_short.html:5
+msgid "Searching in"
+msgstr ""
+
+#: templates/catalogue/search_multiple_hits.html:14
+msgid "More than one result matching the criteria found."
+msgstr ""
+
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:15
+#: templates/catalogue/search_no_hits.html:14
+#: templates/catalogue/tagged_object_list.html:102
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:17
+#: templates/catalogue/search_no_hits.html:16
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
+#: templates/catalogue/search_too_short.html:14
+msgid "Sorry! Search query must have at least two characters."
+msgstr ""
+
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
@@ -701,10 +727,6 @@ msgstr ""
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
-#: templates/catalogue/tagged_object_list.html:102
-msgid "No works of this author found."
-msgstr ""
-
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
@@ -713,6 +735,29 @@ msgstr ""
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
+#: templates/info/base.html:10
+msgid "return to the main page"
+msgstr ""
+
+#: templates/info/join_us.html:2
+#, python-format
+msgid ""
+"We have over 1000 works published in Wolne Lektury!\n"
+"Help us expand the library and set new readings free by\n"
+"making a donation or transferring 1%% of your income tax."
+msgstr ""
+
+#: templates/info/join_us.html:5 templates/info/join_us.html.py:10
+msgid "More..."
+msgstr ""
+
+#: templates/info/join_us.html:7
+msgid ""
+"Become an editor of Wolne Lektury! Find out if\n"
+"we're currently working on a reading you're looking for and prepare\n"
+"a publication by yourself by logging into the Editorial Platform."
+msgstr ""
+
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
index e98412d..55259ba 100644 (file)
Binary files a/wolnelektury/locale/lt/LC_MESSAGES/django.mo and b/wolnelektury/locale/lt/LC_MESSAGES/django.mo differ
index 2d61afc..bc5d3d5 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-19 16:21+0200\n"
+"POT-Creation-Date: 2010-05-25 14:29+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ msgstr ""
 msgid "Spanish"
 msgstr ""
 
 msgid "Spanish"
 msgstr ""
 
+#: settings.py:44
+msgid "Ukrainian"
+msgstr ""
+
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
@@ -146,7 +150,9 @@ msgstr ""
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
@@ -154,7 +160,9 @@ msgstr ""
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
@@ -180,7 +188,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
@@ -191,7 +199,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
-#: templates/catalogue/tagged_object_list.html:41
+#: templates/catalogue/tagged_object_list.html:41 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
@@ -315,6 +323,10 @@ msgstr ""
 msgid "in work "
 msgstr ""
 
 msgid "in work "
 msgstr ""
 
+#: templates/catalogue/book_fragments.html:5
+msgid "on"
+msgstr ""
+
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
@@ -558,21 +570,35 @@ msgid ""
 "\t\t\t"
 msgstr ""
 
 "\t\t\t"
 msgstr ""
 
+#: templates/catalogue/search_multiple_hits.html:5
+#: templates/catalogue/search_too_short.html:5
+msgid "Searching in"
+msgstr ""
+
+#: templates/catalogue/search_multiple_hits.html:14
+msgid "More than one result matching the criteria found."
+msgstr ""
+
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:15
+#: templates/catalogue/search_no_hits.html:14
+#: templates/catalogue/tagged_object_list.html:102
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:17
+#: templates/catalogue/search_no_hits.html:16
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
+#: templates/catalogue/search_too_short.html:14
+msgid "Sorry! Search query must have at least two characters."
+msgstr ""
+
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
@@ -701,10 +727,6 @@ msgstr ""
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
-#: templates/catalogue/tagged_object_list.html:102
-msgid "No works of this author found."
-msgstr ""
-
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
@@ -713,6 +735,29 @@ msgstr ""
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
+#: templates/info/base.html:10
+msgid "return to the main page"
+msgstr ""
+
+#: templates/info/join_us.html:2
+#, python-format
+msgid ""
+"We have over 1000 works published in Wolne Lektury!\n"
+"Help us expand the library and set new readings free by\n"
+"making a donation or transferring 1%% of your income tax."
+msgstr ""
+
+#: templates/info/join_us.html:5 templates/info/join_us.html.py:10
+msgid "More..."
+msgstr ""
+
+#: templates/info/join_us.html:7
+msgid ""
+"Become an editor of Wolne Lektury! Find out if\n"
+"we're currently working on a reading you're looking for and prepare\n"
+"a publication by yourself by logging into the Editorial Platform."
+msgstr ""
+
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
index 539cc5c..bb03298 100644 (file)
Binary files a/wolnelektury/locale/pl/LC_MESSAGES/django.mo and b/wolnelektury/locale/pl/LC_MESSAGES/django.mo differ
index eb7420a..05eb66f 100644 (file)
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-19 16:21+0200\n"
-"PO-Revision-Date: 2010-05-19 15:40\n"
+"POT-Creation-Date: 2010-05-25 14:29+0200\n"
+"PO-Revision-Date: 2010-05-25 14:27\n"
 "Last-Translator: <radoslaw.czajka@nowoczesnapolska.org.pl>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "MIME-Version: 1.0\n"
 "Last-Translator: <radoslaw.czajka@nowoczesnapolska.org.pl>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -17,17 +17,17 @@ msgstr ""
 "X-Translated-Using: django-rosetta 0.5.3\n"
 
 #: settings.py:37
 "X-Translated-Using: django-rosetta 0.5.3\n"
 
 #: settings.py:37
+msgid "Polish"
+msgstr "polski"
+
+#: settings.py:38
 msgid "German"
 msgstr "niemiecki"
 
 msgid "German"
 msgstr "niemiecki"
 
-#: settings.py:38
+#: settings.py:39
 msgid "English"
 msgstr "angielski"
 
 msgid "English"
 msgstr "angielski"
 
-#: settings.py:39
-msgid "Polish"
-msgstr "polski"
-
 #: settings.py:40
 msgid "Lithuanian"
 msgstr "litewski"
 #: settings.py:40
 msgid "Lithuanian"
 msgstr "litewski"
@@ -44,6 +44,10 @@ msgstr "rosyjski"
 msgid "Spanish"
 msgstr "hiszpański"
 
 msgid "Spanish"
 msgstr "hiszpański"
 
+#: settings.py:44
+msgid "Ukrainian"
+msgstr "ukraiński"
+
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr "Podana strona nie istnieje"
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr "Podana strona nie istnieje"
@@ -166,7 +170,9 @@ msgstr ""
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr "Zamknij"
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr "Zamknij"
@@ -174,7 +180,9 @@ msgstr "Zamknij"
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr "Ładowanie"
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr "Ładowanie"
@@ -200,7 +208,7 @@ msgstr "Zarejestruj się w"
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
@@ -211,7 +219,7 @@ msgstr "Szukaj"
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
-#: templates/catalogue/tagged_object_list.html:41
+#: templates/catalogue/tagged_object_list.html:41 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
@@ -335,6 +343,10 @@ msgstr "Motyw"
 msgid "in work "
 msgstr "w utworze"
 
 msgid "in work "
 msgstr "w utworze"
 
+#: templates/catalogue/book_fragments.html:5
+msgid "on"
+msgstr "w"
+
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr "wróć do strony utworu"
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr "wróć do strony utworu"
@@ -605,15 +617,25 @@ msgstr ""
 "zbiorach lektury szkolne, które są zalecane do użytku przez Ministerstwo "
 "Edukacji Narodowej i które trafiły już do domeny publicznej."
 
 "zbiorach lektury szkolne, które są zalecane do użytku przez Ministerstwo "
 "Edukacji Narodowej i które trafiły już do domeny publicznej."
 
+#: templates/catalogue/search_multiple_hits.html:5
+#: templates/catalogue/search_too_short.html:5
+msgid "Searching in"
+msgstr "Wyszukiwanie w"
+
+#: templates/catalogue/search_multiple_hits.html:14
+msgid "More than one result matching the criteria found."
+msgstr "Znaleziono więcej niż jeden wynik wyszukiwania."
+
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr "Wyszukiwanie w WolneLektury.pl"
 
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr "Wyszukiwanie w WolneLektury.pl"
 
-#: templates/catalogue/search_no_hits.html:15
+#: templates/catalogue/search_no_hits.html:14
+#: templates/catalogue/tagged_object_list.html:102
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr "Przepraszamy! Brak wyników spełniających kryteria podane w zapytaniu."
 
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr "Przepraszamy! Brak wyników spełniających kryteria podane w zapytaniu."
 
-#: templates/catalogue/search_no_hits.html:17
+#: templates/catalogue/search_no_hits.html:16
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
@@ -623,6 +645,10 @@ msgstr ""
 "rodzaj i gatunek utworu. Obecnie nie obsługujemy wyszukiwania fraz w "
 "tekstach utworów."
 
 "rodzaj i gatunek utworu. Obecnie nie obsługujemy wyszukiwania fraz w "
 "tekstach utworów."
 
+#: templates/catalogue/search_too_short.html:14
+msgid "Sorry! Search query must have at least two characters."
+msgstr "Przepraszamy! Zapytanie musi zawierać co najmniej dwa znaki."
+
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr "Zobacz całą kategorię"
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr "Zobacz całą kategorię"
@@ -761,10 +787,6 @@ msgstr ""
 "Dowiedz się, dlaczego biblioteki internetowe nie mogą udostępniać dzieł tego "
 "autora."
 
 "Dowiedz się, dlaczego biblioteki internetowe nie mogą udostępniać dzieł tego "
 "autora."
 
-#: templates/catalogue/tagged_object_list.html:102
-msgid "No works of this author found."
-msgstr "Nie znaleziono żadnych utworów."
-
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr "usuń"
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr "usuń"
@@ -774,6 +796,35 @@ msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 "Nie posiadasz żadnych półek. Jeśli chcesz, możesz utworzyć półkę poniżej."
 
 msgstr ""
 "Nie posiadasz żadnych półek. Jeśli chcesz, możesz utworzyć półkę poniżej."
 
+#: templates/info/base.html:10
+msgid "return to the main page"
+msgstr "wróć do strony głównej"
+
+#: templates/info/join_us.html:2
+#, python-format
+msgid ""
+"We have over 1000 works published in Wolne Lektury!\n"
+"Help us expand the library and set new readings free by\n"
+"making a donation or transferring 1%% of your income tax."
+msgstr ""
+"W serwisie Wolne Lektury już teraz opublikowanych jest ponad 1000 utworów! "
+"Pomóż w rozwijaniu biblioteki i uwalnianiu nowych lektur przekazując nam "
+"darowiznę lub 1%% podatku."
+
+#: templates/info/join_us.html:5 templates/info/join_us.html.py:10
+msgid "More..."
+msgstr "Więcej..."
+
+#: templates/info/join_us.html:7
+msgid ""
+"Become an editor of Wolne Lektury! Find out if\n"
+"we're currently working on a reading you're looking for and prepare\n"
+"a publication by yourself by logging into the Editorial Platform."
+msgstr ""
+"Zostań redaktorem lub redaktorką Wolnych Lektur! Sprawdź, czy obecnie "
+"pracujemy nad publikacją wyszukiwanej przez ciebie lektury i samodzielnie "
+"przygotuj publikację logując się na Platformie Redakcyjnej."
+
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
index e98412d..55259ba 100644 (file)
Binary files a/wolnelektury/locale/ru/LC_MESSAGES/django.mo and b/wolnelektury/locale/ru/LC_MESSAGES/django.mo differ
index 2d61afc..bc5d3d5 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-19 16:21+0200\n"
+"POT-Creation-Date: 2010-05-25 14:29+0200\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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ msgstr ""
 msgid "Spanish"
 msgstr ""
 
 msgid "Spanish"
 msgstr ""
 
+#: settings.py:44
+msgid "Ukrainian"
+msgstr ""
+
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
 #: templates/404.html:6 templates/404.html.py:15
 msgid "Page does not exist"
 msgstr ""
@@ -146,7 +150,9 @@ msgstr ""
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
 #: templates/catalogue/book_detail.html:129
 #: templates/catalogue/book_fragments.html:33
 #: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:141
 msgid "Close"
 msgstr ""
@@ -154,7 +160,9 @@ msgstr ""
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
 #: templates/base.html:107 templates/catalogue/book_detail.html:131
 #: templates/catalogue/book_fragments.html:35
 #: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
 #: templates/catalogue/tagged_object_list.html:143
 msgid "Loading"
 msgstr ""
@@ -180,7 +188,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "Search"
@@ -191,7 +199,7 @@ msgstr ""
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
 #: templates/catalogue/book_list.html:12
 #: templates/catalogue/book_stub_detail.html:12
 #: templates/catalogue/main_page.html:13
-#: templates/catalogue/tagged_object_list.html:41
+#: templates/catalogue/tagged_object_list.html:41 templates/info/base.html:10
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
 #: templates/lessons/document_detail.html:9
 #: templates/lessons/document_list.html:51
 msgid "or"
@@ -315,6 +323,10 @@ msgstr ""
 msgid "in work "
 msgstr ""
 
 msgid "in work "
 msgstr ""
 
+#: templates/catalogue/book_fragments.html:5
+msgid "on"
+msgstr ""
+
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
 #: templates/catalogue/book_fragments.html:12
 msgid "return to book's page"
 msgstr ""
@@ -558,21 +570,35 @@ msgid ""
 "\t\t\t"
 msgstr ""
 
 "\t\t\t"
 msgstr ""
 
+#: templates/catalogue/search_multiple_hits.html:5
+#: templates/catalogue/search_too_short.html:5
+msgid "Searching in"
+msgstr ""
+
+#: templates/catalogue/search_multiple_hits.html:14
+msgid "More than one result matching the criteria found."
+msgstr ""
+
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
 #: templates/catalogue/search_no_hits.html:5
 msgid "Search in WolneLektury.pl"
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:15
+#: templates/catalogue/search_no_hits.html:14
+#: templates/catalogue/tagged_object_list.html:102
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
 msgid "Sorry! Search cirteria did not match any resources."
 msgstr ""
 
-#: templates/catalogue/search_no_hits.html:17
+#: templates/catalogue/search_no_hits.html:16
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
 msgid ""
 "Search engine supports following criteria: title, author, theme/topic, "
 "epoch, kind and genre.\n"
 "\t\tAs for now we do not support full text search."
 msgstr ""
 
+#: templates/catalogue/search_too_short.html:14
+msgid "Sorry! Search query must have at least two characters."
+msgstr ""
+
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
 #: templates/catalogue/tag_list.html:4
 msgid "See full category"
 msgstr ""
@@ -701,10 +727,6 @@ msgstr ""
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
 msgid "Find out why Internet libraries can't publish this author's works."
 msgstr ""
 
-#: templates/catalogue/tagged_object_list.html:102
-msgid "No works of this author found."
-msgstr ""
-
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
 #: templates/catalogue/user_shelves.html:6
 msgid "remove"
 msgstr ""
@@ -713,6 +735,29 @@ msgstr ""
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
 msgid "You do not own any shelves. You can create one below if you want to"
 msgstr ""
 
+#: templates/info/base.html:10
+msgid "return to the main page"
+msgstr ""
+
+#: templates/info/join_us.html:2
+#, python-format
+msgid ""
+"We have over 1000 works published in Wolne Lektury!\n"
+"Help us expand the library and set new readings free by\n"
+"making a donation or transferring 1%% of your income tax."
+msgstr ""
+
+#: templates/info/join_us.html:5 templates/info/join_us.html.py:10
+msgid "More..."
+msgstr ""
+
+#: templates/info/join_us.html:7
+msgid ""
+"Become an editor of Wolne Lektury! Find out if\n"
+"we're currently working on a reading you're looking for and prepare\n"
+"a publication by yourself by logging into the Editorial Platform."
+msgstr ""
+
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
 #: templates/lessons/ajax_document_detail.html:3
 #: templates/lessons/document_detail.html:13
 msgid "author"
diff --git a/wolnelektury/locale/uk/LC_MESSAGES/django.mo b/wolnelektury/locale/uk/LC_MESSAGES/django.mo
new file mode 100644 (file)
index 0000000..55259ba
Binary files /dev/null and b/wolnelektury/locale/uk/LC_MESSAGES/django.mo differ
diff --git a/wolnelektury/locale/uk/LC_MESSAGES/django.po b/wolnelektury/locale/uk/LC_MESSAGES/django.po
new file mode 100644 (file)
index 0000000..bc5d3d5
--- /dev/null
@@ -0,0 +1,782 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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-05-25 14:29+0200\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"
+
+#: settings.py:37
+msgid "Polish"
+msgstr ""
+
+#: settings.py:38
+msgid "German"
+msgstr ""
+
+#: settings.py:39
+msgid "English"
+msgstr ""
+
+#: settings.py:40
+msgid "Lithuanian"
+msgstr ""
+
+#: settings.py:41
+msgid "French"
+msgstr ""
+
+#: settings.py:42
+msgid "Russian"
+msgstr ""
+
+#: settings.py:43
+msgid "Spanish"
+msgstr ""
+
+#: settings.py:44
+msgid "Ukrainian"
+msgstr ""
+
+#: templates/404.html:6 templates/404.html.py:15
+msgid "Page does not exist"
+msgstr ""
+
+#: templates/404.html:17
+msgid ""
+"We are sorry, but this page does not exist. Please check if you entered "
+"correct address or go to "
+msgstr ""
+
+#: templates/404.html:17
+msgid "main page"
+msgstr ""
+
+#: templates/500.html:6 templates/500.html.py:54
+msgid "Server error"
+msgstr ""
+
+#: templates/500.html:55
+msgid ""
+"<p>The Wolnelektury.pl site is currently unavailable. Meanwhile, visit our "
+"<a href='http://nowoczesnapolska.org.pl'>blog</a>.</p> <p>Inform our <a "
+"href='mailto:fundacja@nowoczesnapolska.org.pl'>administrators</a> about the "
+"error.</p>"
+msgstr ""
+
+#: templates/503.html:6 templates/503.html.py:54
+msgid "Service unavailable"
+msgstr ""
+
+#: templates/503.html:56
+msgid "The Wolnelektury.pl site is currently unavailable due to maintainance."
+msgstr ""
+
+#: templates/base.html:20
+msgid ""
+"Internet Explorer cannot display this site properly. Click here to read "
+"more..."
+msgstr ""
+
+#: templates/base.html:33
+msgid "Welcome"
+msgstr ""
+
+#: templates/base.html:34
+msgid "Your shelves"
+msgstr ""
+
+#: templates/base.html:36
+msgid "Administration"
+msgstr ""
+
+#: templates/base.html:38
+msgid "Logout"
+msgstr ""
+
+#: templates/base.html:41 templates/base.html.py:87 templates/base.html:91
+#: templates/base.html.py:95 templates/auth/login.html:4
+#: templates/auth/login.html.py:7 templates/auth/login.html:12
+#: templates/auth/login.html.py:15
+msgid "Sign in"
+msgstr ""
+
+#: templates/base.html:41 templates/base.html.py:87 templates/base.html:95
+#: templates/base.html.py:99 templates/auth/login.html:7
+#: templates/auth/login.html.py:21 templates/auth/login.html:23
+msgid "Register"
+msgstr ""
+
+#: templates/base.html:51
+msgid "Choose your interface language: "
+msgstr ""
+
+#: templates/base.html:56
+msgid "Choose language"
+msgstr ""
+
+#: templates/base.html:68
+msgid ""
+"\n"
+"\t\t\t\tWolne Lektury is a project lead by <a href=\"http://nowoczesnapolska."
+"org.pl/\">Modern Poland Foundation</a>.\n"
+"\t\t\t\tDigital reproductions are made by <a href=\"http://www.bn.org.pl/"
+"\">The National Library</a>, based on TNL resources. \n"
+"\t\t\t\tHosting <a href=\"http://eo.pl/\">EO Networks</a>.\n"
+"\t\t\t\t"
+msgstr ""
+
+#: templates/base.html:75
+msgid ""
+"\n"
+"\t\t\t\tModern Poland Foundation, 00-514 Warsaw, ul. Marszałkowska 84/92 "
+"lok. 125, tel/fax: (22) 621-30-17\n"
+"                e-mail: <a href=\"mailto:fundacja@nowoczesnapolska.org.pl"
+"\">fundacja@nowoczesnapolska.org.pl</a>\n"
+"\t\t\t\t"
+msgstr ""
+
+#: templates/base.html:84 templates/base.html.py:105
+#: templates/catalogue/book_detail.html:129
+#: templates/catalogue/book_fragments.html:33
+#: templates/catalogue/book_stub_detail.html:31
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
+#: templates/catalogue/tagged_object_list.html:141
+msgid "Close"
+msgstr ""
+
+#: templates/base.html:107 templates/catalogue/book_detail.html:131
+#: templates/catalogue/book_fragments.html:35
+#: templates/catalogue/book_stub_detail.html:33
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
+#: templates/catalogue/tagged_object_list.html:143
+msgid "Loading"
+msgstr ""
+
+#: templates/admin/base_site.html:4 templates/admin/base_site.html.py:7
+msgid "Site administration"
+msgstr ""
+
+#: templates/admin/base_site.html:8
+msgid "Translations"
+msgstr ""
+
+#: templates/admin/catalogue/book/change_list.html:6
+msgid "Import book"
+msgstr ""
+
+#: templates/auth/login.html:4
+msgid "Register on"
+msgstr ""
+
+#: templates/auth/login.html:9 templates/catalogue/book_detail.html:12
+#: templates/catalogue/book_fragments.html:12
+#: templates/catalogue/book_list.html:12
+#: templates/catalogue/book_stub_detail.html:12
+#: templates/catalogue/breadcrumbs.html:9
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
+#: templates/lessons/document_detail.html:9
+#: templates/lessons/document_list.html:51
+msgid "Search"
+msgstr ""
+
+#: templates/auth/login.html:9 templates/catalogue/book_detail.html:12
+#: templates/catalogue/book_fragments.html:12
+#: templates/catalogue/book_list.html:12
+#: templates/catalogue/book_stub_detail.html:12
+#: templates/catalogue/main_page.html:13
+#: templates/catalogue/tagged_object_list.html:41 templates/info/base.html:10
+#: templates/lessons/document_detail.html:9
+#: templates/lessons/document_list.html:51
+msgid "or"
+msgstr ""
+
+#: templates/auth/login.html:9 templates/catalogue/book_detail.html:12
+#: templates/catalogue/book_list.html:12
+#: templates/catalogue/book_stub_detail.html:12
+#: templates/lessons/document_list.html:51
+msgid "return to main page"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:5
+msgid "on WolneLektury.pl"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:17
+msgid "Work is licensed under "
+msgstr ""
+
+#: templates/catalogue/book_detail.html:19
+msgid "Based on"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:24
+#: templates/catalogue/tagged_object_list.html:27
+msgid "Hide description"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:27
+msgid "Put a book"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:27
+msgid "on the shelf!"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:31
+msgid "Read online"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:34
+msgid "Download PDF"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:37
+msgid "Download ODT"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:40
+msgid "Download TXT"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:45
+msgid "Artist"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:47
+msgid "Director"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:51
+msgid "Download MP3"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:52
+msgid "Download Ogg Vorbis"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:79
+msgid "Details"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:82
+msgid "Author"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:88
+msgid "Epoch"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:94
+msgid "Kind"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:100
+msgid "Genre"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:106
+msgid "Other resources"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:108
+msgid "Book on project's wiki"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:109
+msgid "Source of the book"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:111
+msgid "Book description on Lektury.Gazeta.pl"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:114
+msgid "Book description on Wikipedia"
+msgstr ""
+
+#: templates/catalogue/book_detail.html:119
+msgid "Work's themes "
+msgstr ""
+
+#: templates/catalogue/book_fragments.html:5
+#: templates/catalogue/book_fragments.html:10
+msgid "Theme"
+msgstr ""
+
+#: templates/catalogue/book_fragments.html:5
+#: templates/catalogue/book_fragments.html:10
+msgid "in work "
+msgstr ""
+
+#: templates/catalogue/book_fragments.html:5
+msgid "on"
+msgstr ""
+
+#: templates/catalogue/book_fragments.html:12
+msgid "return to book's page"
+msgstr ""
+
+#: templates/catalogue/book_fragments.html:26
+msgid "See description"
+msgstr ""
+
+#: templates/catalogue/book_fragments.html:26
+msgid "of the book "
+msgstr ""
+
+#: templates/catalogue/book_list.html:7
+msgid "Alphabetical listing of works on WolneLektury.pl"
+msgstr ""
+
+#: templates/catalogue/book_list.html:10
+msgid "Alphabetical listing of works"
+msgstr ""
+
+#: templates/catalogue/book_sets.html:2
+msgid "Put a book on the shelf!"
+msgstr ""
+
+#: templates/catalogue/book_sets.html:4
+msgid "You do not have any shelves. You can create one below, if you want to."
+msgstr ""
+
+#: templates/catalogue/book_sets.html:9 templates/catalogue/book_short.html:4
+msgid "Put on the shelf!"
+msgstr ""
+
+#: templates/catalogue/book_sets.html:16
+#: templates/catalogue/fragment_sets.html:16
+msgid "Create new shelf"
+msgstr ""
+
+#: templates/catalogue/book_short.html:14
+msgid "Jump to"
+msgstr ""
+
+#: templates/catalogue/book_short.html:16
+msgid "Categories"
+msgstr ""
+
+#: templates/catalogue/book_stub_detail.html:17
+msgid ""
+"This work is in public domain and will be published on Internet school "
+"library of Wolne Lektury soon."
+msgstr ""
+
+#: templates/catalogue/book_stub_detail.html:20
+msgid ""
+"This work will become part of public domain and will be allowed to be "
+"published without restrictions in"
+msgstr ""
+
+#: templates/catalogue/book_stub_detail.html:22
+msgid "Find out why Internet libraries can't publish this work."
+msgstr ""
+
+#: templates/catalogue/book_stub_detail.html:24
+msgid "This work is copyrighted."
+msgstr ""
+
+#: templates/catalogue/book_text.html:17
+msgid "Table of contents"
+msgstr ""
+
+#: templates/catalogue/book_text.html:18
+#: templates/catalogue/tagged_object_list.html:132
+msgid "Themes"
+msgstr ""
+
+#: templates/catalogue/folded_tag_list.html:4
+msgid "Show full category"
+msgstr ""
+
+#: templates/catalogue/folded_tag_list.html:13
+#: templates/catalogue/main_page.html:43 templates/catalogue/main_page.html:48
+#: templates/catalogue/main_page.html:87
+#: templates/catalogue/main_page.html:270
+#: templates/catalogue/main_page.html:279
+msgid "See more"
+msgstr ""
+
+#: templates/catalogue/folded_tag_list.html:22
+#: templates/catalogue/main_page.html:250
+msgid "Hide"
+msgstr ""
+
+#: templates/catalogue/fragment_sets.html:2
+msgid "Shelves containing fragment"
+msgstr ""
+
+#: templates/catalogue/fragment_sets.html:4
+#: templates/catalogue/main_page.html:28
+msgid "You do not own any shelves. You can create one below, if you want to."
+msgstr ""
+
+#: templates/catalogue/fragment_sets.html:9
+msgid "Save all shelves"
+msgstr ""
+
+#: templates/catalogue/fragment_short.html:6
+msgid "Expand fragment"
+msgstr ""
+
+#: templates/catalogue/fragment_short.html:12
+msgid "Hide fragment"
+msgstr ""
+
+#: templates/catalogue/fragment_short.html:17
+msgid "See in a book"
+msgstr ""
+
+#: templates/catalogue/main_page.html:13
+msgid "check list of books"
+msgstr ""
+
+#: templates/catalogue/main_page.html:13
+msgid "in our repository"
+msgstr ""
+
+#: templates/catalogue/main_page.html:17
+msgid "Browse books by categories"
+msgstr ""
+
+#: templates/catalogue/main_page.html:19
+#: templates/catalogue/user_shelves.html:2
+msgid "Your shelves with books"
+msgstr ""
+
+#: templates/catalogue/main_page.html:24
+msgid "delete"
+msgstr ""
+
+#: templates/catalogue/main_page.html:33
+#: templates/catalogue/user_shelves.html:15
+msgid "Create shelf"
+msgstr ""
+
+#: templates/catalogue/main_page.html:37
+msgid ""
+"Create your own book set. You can share it with friends by sending them link "
+"to your shelf."
+msgstr ""
+
+#: templates/catalogue/main_page.html:38
+msgid "You need to "
+msgstr ""
+
+#: templates/catalogue/main_page.html:38
+msgid "sign in"
+msgstr ""
+
+#: templates/catalogue/main_page.html:38
+msgid "to manage your shelves."
+msgstr ""
+
+#: templates/catalogue/main_page.html:41
+#: templates/lessons/document_list.html:49
+msgid "Hand-outs for teachers"
+msgstr ""
+
+#: templates/catalogue/main_page.html:42
+msgid ""
+"Lessons' prospects and other ideas for using Wolnelektury.pl for teaching."
+msgstr ""
+
+#: templates/catalogue/main_page.html:47
+msgid ""
+"are professional recordings of literary texts from our repository, available "
+"on free license in MP3 and Ogg Vorbis formats as well as in DAISY system."
+msgstr ""
+
+#: templates/catalogue/main_page.html:54
+#: templates/catalogue/tagged_object_list.html:114
+msgid "Authors"
+msgstr ""
+
+#: templates/catalogue/main_page.html:58
+#: templates/catalogue/tagged_object_list.html:118
+msgid "Kinds"
+msgstr ""
+
+#: templates/catalogue/main_page.html:62
+#: templates/catalogue/tagged_object_list.html:122
+msgid "Genres"
+msgstr ""
+
+#: templates/catalogue/main_page.html:66
+#: templates/catalogue/tagged_object_list.html:126
+msgid "Epochs"
+msgstr ""
+
+#: templates/catalogue/main_page.html:72
+msgid "Themes and topics"
+msgstr ""
+
+#: templates/catalogue/main_page.html:75
+msgid "Themes groups"
+msgstr ""
+
+#: templates/catalogue/main_page.html:260
+msgid "News"
+msgstr ""
+
+#: templates/catalogue/main_page.html:264
+msgid "See our blog"
+msgstr ""
+
+#: templates/catalogue/main_page.html:267
+msgid "You can help us!"
+msgstr ""
+
+#: templates/catalogue/main_page.html:268
+msgid ""
+"We try our best to elaborate works appended to our library. It is possible "
+"only due to support of our volunteers."
+msgstr ""
+
+#: templates/catalogue/main_page.html:269
+msgid ""
+"We invite people who want to take part in developing Internet school library "
+"Wolne Lektury."
+msgstr ""
+
+#: templates/catalogue/main_page.html:273
+msgid "About us"
+msgstr ""
+
+#: templates/catalogue/main_page.html:275
+msgid ""
+"\n"
+"\t\t\tInternet library with school readings “Wolne Lektury” (<a href="
+"\"http://wolnelektury.pl\">www.wolnelektury.pl</a>) is a project made by "
+"Modern Poland Foundation. It started in 2007 and shares school readings, "
+"which are recommended by Ministry of National Education and are in public "
+"domain.\n"
+"\t\t\t"
+msgstr ""
+
+#: templates/catalogue/search_multiple_hits.html:5
+#: templates/catalogue/search_too_short.html:5
+msgid "Searching in"
+msgstr ""
+
+#: templates/catalogue/search_multiple_hits.html:14
+msgid "More than one result matching the criteria found."
+msgstr ""
+
+#: templates/catalogue/search_no_hits.html:5
+msgid "Search in WolneLektury.pl"
+msgstr ""
+
+#: templates/catalogue/search_no_hits.html:14
+#: templates/catalogue/tagged_object_list.html:102
+msgid "Sorry! Search cirteria did not match any resources."
+msgstr ""
+
+#: templates/catalogue/search_no_hits.html:16
+msgid ""
+"Search engine supports following criteria: title, author, theme/topic, "
+"epoch, kind and genre.\n"
+"\t\tAs for now we do not support full text search."
+msgstr ""
+
+#: templates/catalogue/search_too_short.html:14
+msgid "Sorry! Search query must have at least two characters."
+msgstr ""
+
+#: templates/catalogue/tag_list.html:4
+msgid "See full category"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:15
+msgid "Your shelf is empty"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:16
+msgid ""
+"You can put a book on a shelf by entering page of the reading and clicking "
+"'Put on the shelf'."
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:31
+msgid "Download all books from this shelf"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:35
+msgid "Choose books' formats which you want to download:"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:36
+#: templates/catalogue/tagged_object_list.html:37
+#: templates/catalogue/tagged_object_list.html:38
+msgid "for reading"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:36
+msgid "and printing using"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:37
+msgid "and editing using"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:38
+msgid "on small displays, for example mobile phones"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:39
+#: templates/catalogue/tagged_object_list.html:40
+msgid "for listening"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:39
+msgid "on favourite MP3 player"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:40
+msgid "open format"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:40
+msgid "Xiph.org Foundation"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:41
+#: templates/lessons/ajax_document_detail.html:3
+#: templates/lessons/document_detail.html:13
+msgid "Download"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:41
+msgid "Updating list of books' formats on the shelf"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:41
+msgid "cancel"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:46
+msgid "Share this shelf"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:48
+msgid ""
+"Copy this link and share it with other people to let them see your shelf."
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:57
+msgid "Read work's study of this author on Lektury.Gazeta.pl"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:60
+msgid "Read study of epoch"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:60
+msgid "on Lektury.Gazeta.pl"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:67
+msgid "Read article about this author on Wikipedia"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:70
+msgid "Read article about epoch"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:70
+msgid "on Wikipedia"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:80
+msgid "Delete"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:88
+msgid "This author's works are copyrighted."
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:91
+msgid ""
+"This author's works are in public domain and will be published on Internet "
+"school library of Wolne Lektury soon."
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:95
+msgid ""
+"This author's works will become part of public domain and will be allowed to "
+"be published without restrictions in"
+msgstr ""
+
+#: templates/catalogue/tagged_object_list.html:97
+msgid "Find out why Internet libraries can't publish this author's works."
+msgstr ""
+
+#: templates/catalogue/user_shelves.html:6
+msgid "remove"
+msgstr ""
+
+#: templates/catalogue/user_shelves.html:10
+msgid "You do not own any shelves. You can create one below if you want to"
+msgstr ""
+
+#: templates/info/base.html:10
+msgid "return to the main page"
+msgstr ""
+
+#: templates/info/join_us.html:2
+#, python-format
+msgid ""
+"We have over 1000 works published in Wolne Lektury!\n"
+"Help us expand the library and set new readings free by\n"
+"making a donation or transferring 1%% of your income tax."
+msgstr ""
+
+#: templates/info/join_us.html:5 templates/info/join_us.html.py:10
+msgid "More..."
+msgstr ""
+
+#: templates/info/join_us.html:7
+msgid ""
+"Become an editor of Wolne Lektury! Find out if\n"
+"we're currently working on a reading you're looking for and prepare\n"
+"a publication by yourself by logging into the Editorial Platform."
+msgstr ""
+
+#: templates/lessons/ajax_document_detail.html:3
+#: templates/lessons/document_detail.html:13
+msgid "author"
+msgstr ""
+
+#: templates/lessons/document_detail.html:9
+msgid "return to list of materials"
+msgstr ""
+
+#: templates/lessons/document_list.html:7
+msgid "Hand-outs for teachers on "
+msgstr ""
+
+#: templates/pagination/pagination.html:5
+#: templates/pagination/pagination.html:7
+msgid "previous"
+msgstr ""
+
+#: templates/pagination/pagination.html:21
+#: templates/pagination/pagination.html:23
+msgid "next"
+msgstr ""
index 8617992..d40fd55 100644 (file)
@@ -34,13 +34,14 @@ LANGUAGE_CODE = 'pl'
 gettext = lambda s: s
 
 LANGUAGES = (
 gettext = lambda s: s
 
 LANGUAGES = (
+    ('pl', gettext('Polish')),
     ('de', gettext('German')),
     ('en', gettext('English')),
     ('de', gettext('German')),
     ('en', gettext('English')),
-    ('pl', gettext('Polish')),
     ('lt', gettext('Lithuanian')),
     ('fr', gettext('French')),
     ('ru', gettext('Russian')),
     ('lt', gettext('Lithuanian')),
     ('fr', gettext('French')),
     ('ru', gettext('Russian')),
-    ('es', gettext('Spanish')),        
+    ('es', gettext('Spanish')),
+    ('uk', gettext('Ukrainian')),
 )
 
 
 )
 
 
@@ -122,11 +123,13 @@ INSTALLED_APPS = [
     'pagination',
     'chunks',
     'compress',
     'pagination',
     'chunks',
     'compress',
+    'modeltranslation',
     'catalogue',
     'lessons',
     'piston',
     'api',
     'rosetta',
     'catalogue',
     'lessons',
     'piston',
     'api',
     'rosetta',
+    'infopages',
 ]
 
 CACHE_BACKEND = 'locmem:///?max_entries=3000'
 ]
 
 CACHE_BACKEND = 'locmem:///?max_entries=3000'
@@ -180,6 +183,8 @@ THUMBNAIL_PROCESSORS = (
     'sponsors.processors.add_padding',
 )
 
     'sponsors.processors.add_padding',
 )
 
+TRANSLATION_REGISTRY = "wolnelektury.translation"
+
 # Load localsettings, if they exist
 try:
     from localsettings import *
 # Load localsettings, if they exist
 try:
     from localsettings import *
index ad9768e..7a7709d 100644 (file)
@@ -5,18 +5,18 @@ var LOCALE_TEXTS = {
                "EXPAND_DESCRIPTION": "Rozwiń opis",
                "LOADING": "Ładowanie",                
        },
                "EXPAND_DESCRIPTION": "Rozwiń opis",
                "LOADING": "Ładowanie",                
        },
+    "de": {
+        "DELETE_SHELF": "Translate me!",
+        "HIDE_DESCRIPTION": "Translate me!",
+        "EXPAND_DESCRIPTION": "Translate me!",
+        "LOADING": "Translate me!",             
+    },
        "fr": {
                "DELETE_SHELF": "Translate me!",
                "HIDE_DESCRIPTION": "Translate me!",
                "EXPAND_DESCRIPTION": "Translate me!",
                "LOADING": "Translate me!",                             
        },
        "fr": {
                "DELETE_SHELF": "Translate me!",
                "HIDE_DESCRIPTION": "Translate me!",
                "EXPAND_DESCRIPTION": "Translate me!",
                "LOADING": "Translate me!",                             
        },
-       "ru": {
-               "DELETE_SHELF": "Translate me!",
-               "HIDE_DESCRIPTION": "Translate me!",
-               "EXPAND_DESCRIPTION": "Translate me!",
-               "LOADING": "Translate me!",                             
-       },
        "en": {
                "DELETE_SHELF": "Translate me!",
                "HIDE_DESCRIPTION": "Translate me!",
        "en": {
                "DELETE_SHELF": "Translate me!",
                "HIDE_DESCRIPTION": "Translate me!",
@@ -35,12 +35,18 @@ var LOCALE_TEXTS = {
                "EXPAND_DESCRIPTION": "Translate me!",
                "LOADING": "Translate me!",                             
        },
                "EXPAND_DESCRIPTION": "Translate me!",
                "LOADING": "Translate me!",                             
        },
-       "lt":{
-               "DELETE_SHELF": "Translate me!",
-               "HIDE_DESCRIPTION": "Translate me!",
-               "EXPAND_DESCRIPTION": "Translate me!",
-               "LOADING": "Translate me!",                             
-       }
+    "lt":{
+        "DELETE_SHELF": "Translate me!",
+        "HIDE_DESCRIPTION": "Translate me!",
+        "EXPAND_DESCRIPTION": "Translate me!",
+        "LOADING": "Translate me!",             
+    },
+    "uk":{
+        "DELETE_SHELF": "Translate me!",
+        "HIDE_DESCRIPTION": "Translate me!",
+        "EXPAND_DESCRIPTION": "Translate me!",
+        "LOADING": "Translate me!",             
+    }
 }
 var BANNER_TEXTS = [
     'Przekaż 1% żeby ukryć ten baner.',
 }
 var BANNER_TEXTS = [
     'Przekaż 1% żeby ukryć ten baner.',
index 550787d..e71a190 100644 (file)
@@ -2,7 +2,7 @@
 {% load i18n %}
 {% load catalogue_tags pagination_tags %}
 
 {% load i18n %}
 {% load catalogue_tags pagination_tags %}
 
-{% block title %}{% trans "Theme" %} {{ theme }} {% trans "in work " %} {{ book }} {% "on " %} WolneLektury.pl{% endblock %}
+{% block title %}{% trans "Theme" %} {{ theme }} {% trans "in work " %} {{ book }} {% trans "on" %} WolneLektury.pl{% endblock %}
 
 {% block bodyid %}tagged-object-list{% endblock %}
 
 
 {% block bodyid %}tagged-object-list{% endblock %}
 
index cc93d56..fe45140 100644 (file)
@@ -1,7 +1,8 @@
 {% extends "base.html" %}
 {% extends "base.html" %}
+{% load i18n %}
 {% load catalogue_tags pagination_tags %}
 
 {% load catalogue_tags pagination_tags %}
 
-{% block title %}Wyszukiwanie w WolneLektury.pl{% endblock %}
+{% block title %}{% trans "Searching in" %} WolneLektury.pl{% endblock %}
 
 {% block bodyid %}tagged-object-list{% endblock %}
 
 
 {% block bodyid %}tagged-object-list{% endblock %}
 
@@ -10,7 +11,7 @@
     {% breadcrumbs tags %}
     
     <div id="books-list">
     {% breadcrumbs tags %}
     
     <div id="books-list">
-        <p>Znaleziono więcej niż jeden wynik odpowiadający kryteriom wyszukiwania.</p>
+        <p>{% trans "More than one result matching the criteria found." %}</p>
                <ul class='matches'>
         {% for match, link, type in results %}
             <li><a href='{{ link }}'>{{ match.name }}</a> ({{ type }})</li>
                <ul class='matches'>
         {% for match, link, type in results %}
             <li><a href='{{ link }}'>{{ match.name }}</a> ({{ type }})</li>
@@ -19,9 +20,9 @@
     </div>
 
     <div id="set-window">
     </div>
 
     <div id="set-window">
-        <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
+        <div class="header"><a href="#" class="jqmClose">{% trans "Close" %}</a></div>
         <div class="target">
         <div class="target">
-            <p><img src="{{ STATIC_URL }}img/indicator.gif" alt="*"/> Ładowanie</p>
+            <p><img src="{{ STATIC_URL }}img/indicator.gif" alt="*"/> {% trans "Loading" %}</p>
         </div>
     </div>
 {% endblock %}
\ No newline at end of file
         </div>
     </div>
 {% endblock %}
\ No newline at end of file
index db9e585..f68d065 100644 (file)
@@ -1,7 +1,8 @@
 {% extends "base.html" %}
 {% extends "base.html" %}
+{% load i18n %}
 {% load catalogue_tags pagination_tags %}
 
 {% load catalogue_tags pagination_tags %}
 
-{% block title %}Wyszukiwanie w WolneLektury.pl{% endblock %}
+{% block title %}{% trans "Searching in" %} WolneLektury.pl{% endblock %}
 
 {% block bodyid %}tagged-object-list{% endblock %}
 
 
 {% block bodyid %}tagged-object-list{% endblock %}
 
     {% breadcrumbs tags %}
     
     <div id="books-list">
     {% breadcrumbs tags %}
     
     <div id="books-list">
-        <p>Przepraszamy! Wyszukiwana fraza musi mieć co najmniej dwa znaki.</p>
+        <p>{% trans "Sorry! Search query must have at least two characters." %}</p>
         {% include "info/join_us.html" %}
     </div>
 
     <div id="set-window">
         {% include "info/join_us.html" %}
     </div>
 
     <div id="set-window">
-        <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
+        <div class="header"><a href="#" class="jqmClose">{% trans "Close" %}</a></div>
         <div class="target">
         <div class="target">
-            <p><img src="{{ STATIC_URL }}img/indicator.gif" alt="*"/> Ładowanie</p>
+            <p><img src="{{ STATIC_URL }}img/indicator.gif" alt="*"/> {% trans "Loading" %}</p>
         </div>
     </div>
 {% endblock %}
\ No newline at end of file
         </div>
     </div>
 {% endblock %}
\ No newline at end of file
index 66d6ee4..fd6517c 100644 (file)
@@ -99,7 +99,7 @@
                        {% endif %}
                 {% endif %}
                        {% else %}
                        {% endif %}
                 {% endif %}
                        {% else %}
-                           {% trans "No works of this author found." %}
+                           {% trans "Sorry! Search cirteria did not match any resources." %}
                        {% endif %}
             {% include "info/join_us.html" %}
         {% endif %}
                        {% endif %}
             {% include "info/join_us.html" %}
         {% endif %}
diff --git a/wolnelektury/templates/info/about_us.html b/wolnelektury/templates/info/about_us.html
deleted file mode 100644 (file)
index 7f43802..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-{% extends "base.html" %}
-{% load chunks %}
-
-{% block title %}O projekcie WolneLektury.pl{% endblock %}
-
-{% block body %}
-    <h1>O projekcie Wolne Lektury</h1>
-    <form action="{% url search %}" method="GET" accept-charset="utf-8" id="search-form">
-        <p>{{ form.q }} <input type="submit" value="Szukaj" /> <strong>lub</strong> <a href="{% url main_page %}">wróć do strony głównej</a></p>
-    </form>
-
-    <div class="column-left">
-        {% chunk "about_us_left" %}
-    </div>
-    <div class="column-right">
-        {% chunk "about_us_right" %}
-    </div>
-{% endblock %}
diff --git a/wolnelektury/templates/info/base.html b/wolnelektury/templates/info/base.html
new file mode 100644 (file)
index 0000000..528e296
--- /dev/null
@@ -0,0 +1,21 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% load chunks %}
+
+{% block title %}{{ object.page_title }}{% endblock %}
+
+{% block body %}
+    <h1>{{ object.title }}</h1>
+    <form action="{% url search %}" method="get" accept-charset="utf-8" id="search-form">
+        <p>{{ form.q }} <input type="submit" value="{% trans "Search" %}" /> <strong>{%trans "or" %}</strong> <a href="{% url main_page %}">{% trans "return to the main page" %}</a></p>
+    </form>
+
+    {% autoescape off %}
+    <div class="column-left">
+       {{ object.left_column }}
+    </div>
+    <div class="column-right">
+       {{ object.right_column }}
+    </div>
+       {% endautoescape %}
+{% endblock %}
diff --git a/wolnelektury/templates/info/help_us.html b/wolnelektury/templates/info/help_us.html
deleted file mode 100644 (file)
index ebe45fe..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-{% extends "base.html" %}
-{% load chunks %}
-
-{% block title %}Możesz nam pomóc w WolneLektury.pl{% endblock %}
-
-{% block body %}
-    <h1>Możesz nam pomóc</h1>
-    <form action="{% url search %}" method="get" accept-charset="utf-8" id="search-form">
-        <p>{{ form.q }} <input type="submit" value="Szukaj" /> <strong>lub</strong> <a href="{% url main_page %}">wróć do strony głównej</a></p>
-    </form>
-
-    <div class="column-left">
-        {% chunk "help_us_left" %}
-    </div>
-    <div class="column-right">
-        {% chunk "help_us_right" %}
-    </div>
-{% endblock %}
index f3b3f1d..b38a566 100644 (file)
@@ -1,7 +1,10 @@
-<p>W serwisie Wolne Lektury już teraz opublikowanych jest ponad 1000 utworów!
-Pomóż w rozwijaniu biblioteki i uwalnianiu nowych lektur przekazując nam
-darowiznę lub 1% podatku. {% comment %}<a href='{}'>Więcej...</a>{% endcomment %}</p>
+{% load i18n %}
+<p>{% blocktrans %}We have over 1000 works published in Wolne Lektury!
+Help us expand the library and set new readings free by
+making a donation or transferring 1%% of your income tax.{% endblocktrans %}
+{% comment %}<a href='{}'>{% trans "More..." %}</a>{% endcomment %}</p>
 
 
-<p>Zostań redaktorem lub redaktorką Wolnych Lektur! Sprawdź, czy obecnie
-pracujemy nad publikacją wyszukiwanej przez ciebie lektury i samodzielnie
-przygotuj publikację logując się na Platformie Redakcyjnej. <a href='{% url help_us %}'>Więcej...</a></p>
+<p>{% blocktrans %}Become an editor of Wolne Lektury! Find out if
+we're currently working on a reading you're looking for and prepare
+a publication by yourself by logging into the Editorial Platform.{% endblocktrans %}
+<a href='{% url help_us %}'>{% trans "More..." %}</a></p>
diff --git a/wolnelektury/templates/info/voluntary_services.html b/wolnelektury/templates/info/voluntary_services.html
deleted file mode 100644 (file)
index e6253d7..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{% extends "base.html" %}
-{% load chunks %}
-
-{% block title %}Wolontariat dla wiedzy w WolneLektury.pl{% endblock %}
-
-{% block body %}
-    <h1>Wolontariat dla wiedzy</h1>
-    <form action="{% url search %}" method="GET" accept-charset="utf-8" id="search-form">
-        <p>{{ form.q }} <input type="submit" value="Szukaj" /> <strong>lub</strong> <a href="{% url main_page %}">wróć do strony głównej</a></p>
-    </form>
-
-    <div id="volontariat" class="column-left">
-        {% chunk "voluntary_services_left" %}
-    </div>
-    <div class="column-right">
-        {% chunk "voluntary_services_right" %}
-    </div>
-{% endblock %}
-
diff --git a/wolnelektury/translation.py b/wolnelektury/translation.py
new file mode 100644 (file)
index 0000000..227896e
--- /dev/null
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+#
+
+from modeltranslation.translator import translator, TranslationOptions
+from infopages.models import InfoPage
+from catalogue.models import Book
+
+class InfoPageTranslationOptions(TranslationOptions):
+    fields = ('page_title', 'title', 'left_column', 'right_column')
+
+translator.register(InfoPage, InfoPageTranslationOptions)
+
+class BookTranslationOptions(TranslationOptions):
+    fields = ('_short_html', )
+
+translator.register(Book, BookTranslationOptions)
+
index a7cd45f..0628b15 100644 (file)
@@ -7,24 +7,28 @@ from django.contrib import admin
 
 from catalogue.forms import SearchForm
 
 
 from catalogue.forms import SearchForm
 
+from infopages.models import InfoPage
+
 
 admin.autodiscover()
 
 
 admin.autodiscover()
 
+infopages = {
+    'queryset': InfoPage.objects.all(),
+    'template_name': 'info/base.html',
+}
 
 urlpatterns = patterns('',
     url(r'^katalog/', include('catalogue.urls')),
     url(r'^materialy/', include('lessons.urls')),
     
     # Static pages
 
 urlpatterns = patterns('',
     url(r'^katalog/', include('catalogue.urls')),
     url(r'^materialy/', include('lessons.urls')),
     
     # Static pages
-    url(r'^wolontariat/$', 'django.views.generic.simple.direct_to_template', 
-        {'template': 'info/voluntary_services.html', 'extra_context': {'form': SearchForm()}},
-        name='voluntary_services'),
-    url(r'^mozesz-nam-pomoc/$', 'django.views.generic.simple.direct_to_template',
-        {'template': 'info/help_us.html', 'extra_context': {'form': SearchForm()}},
-        name='help_us'),
-    url(r'^o-projekcie/$', 'django.views.generic.simple.direct_to_template', 
-        {'template': 'info/about_us.html', 'extra_context': {'form': SearchForm()}},
-        name='about_us'),
+    url(r'^wolontariat/$', 'django.views.generic.list_detail.object_detail', 
+        dict(infopages, slug='voluntary_services'), name='voluntary_services'),
+    url(r'^mozesz-nam-pomoc/$', 'django.views.generic.list_detail.object_detail', 
+        dict(infopages, slug='help_us'), name='help_us'),
+    url(r'^o-projekcie/$', 'django.views.generic.list_detail.object_detail', 
+        dict(infopages, slug='about_us'), name='about_us'),
+        
     url(r'^1procent/$', 'django.views.generic.simple.direct_to_template', {
         'template': '1percent.html'
     }, name='1percent'),
     url(r'^1procent/$', 'django.views.generic.simple.direct_to_template', {
         'template': '1percent.html'
     }, name='1percent'),