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"
-"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"
@@ -16,7 +16,7 @@ msgstr ""
 "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 ""
@@ -201,38 +201,38 @@ 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 ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 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 ""
 
-#: views.py:463
+#: views.py:494
 #, 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 ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, 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"
-"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"
@@ -16,7 +16,7 @@ msgstr ""
 "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 ""
@@ -201,38 +201,38 @@ 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 ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 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 ""
 
-#: views.py:463
+#: views.py:494
 #, 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 ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, 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"
-"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"
@@ -16,7 +16,7 @@ msgstr ""
 "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 ""
@@ -201,38 +201,38 @@ 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 ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 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 ""
 
-#: views.py:463
+#: views.py:494
 #, 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 ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, 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"
-"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"
@@ -16,7 +16,7 @@ msgstr ""
 "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 ""
@@ -201,38 +201,38 @@ 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 ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 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 ""
 
-#: views.py:463
+#: views.py:494
 #, 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 ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, 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"
-"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"
@@ -16,7 +16,7 @@ msgstr ""
 "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 ""
@@ -201,38 +201,38 @@ 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 ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 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 ""
 
-#: views.py:463
+#: views.py:494
 #, 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 ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, 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.
-# 
+#
 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"
@@ -16,7 +16,7 @@ msgstr ""
 "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"
@@ -201,38 +201,38 @@ msgstr "zapowiedź książki"
 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>"
 
-#: views.py:326
+#: views.py:357
 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"
 
-#: views.py:352
+#: views.py:383
 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>"
 
-#: 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>"
 
-#: views.py:522
+#: views.py:553
 #, 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"
@@ -243,11 +243,11 @@ msgstr ""
 "\n"
 "%(tb)s"
 
-#: views.py:524
+#: views.py:555
 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"
index 5362b95..fa770ff 100644 (file)
@@ -8,7 +8,7 @@ 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: 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"
 
-#: fields.py:45
+#: fields.py:47
 #, python-format
 msgid "Enter a valid JSON value. Error: %s"
 msgstr ""
@@ -201,38 +201,38 @@ 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 ""
 
-#: views.py:326
+#: views.py:357
 msgid "<p>Shelves were sucessfully saved.</p>"
 msgstr ""
 
-#: views.py:350
+#: views.py:381
 msgid "Book was successfully removed from the shelf"
 msgstr ""
 
-#: views.py:352
+#: views.py:383
 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 ""
 
-#: views.py:463
+#: views.py:494
 #, 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 ""
 
-#: views.py:523
+#: views.py:554
 #, python-format
 msgid ""
 "An error occurred: %(exception)s\n"
@@ -240,11 +240,11 @@ msgid ""
 "%(tb)s"
 msgstr ""
 
-#: views.py:524
+#: views.py:555
 msgid "Book imported successfully"
 msgstr ""
 
-#: views.py:526
+#: views.py:557
 #, 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
-            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)
         
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"
-"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"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ 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 ""
@@ -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/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 ""
@@ -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/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 ""
@@ -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/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"
@@ -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/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"
@@ -315,6 +323,10 @@ 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 ""
@@ -558,21 +570,35 @@ msgid ""
 "\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: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 ""
 
-#: 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 ""
 
+#: 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 ""
@@ -701,10 +727,6 @@ 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 ""
@@ -713,6 +735,29 @@ 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"
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"
-"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"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ 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 ""
@@ -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/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 ""
@@ -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/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 ""
@@ -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/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"
@@ -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/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"
@@ -315,6 +323,10 @@ 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 ""
@@ -558,21 +570,35 @@ msgid ""
 "\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: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 ""
 
-#: 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 ""
 
+#: 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 ""
@@ -701,10 +727,6 @@ 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 ""
@@ -713,6 +735,29 @@ 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"
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"
-"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"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ 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 ""
@@ -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/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 ""
@@ -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/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 ""
@@ -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/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"
@@ -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/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"
@@ -315,6 +323,10 @@ 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 ""
@@ -558,21 +570,35 @@ msgid ""
 "\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: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 ""
 
-#: 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 ""
 
+#: 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 ""
@@ -701,10 +727,6 @@ 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 ""
@@ -713,6 +735,29 @@ 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"
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"
-"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"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ 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 ""
@@ -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/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 ""
@@ -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/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 ""
@@ -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/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"
@@ -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/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"
@@ -315,6 +323,10 @@ 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 ""
@@ -558,21 +570,35 @@ msgid ""
 "\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: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 ""
 
-#: 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 ""
 
+#: 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 ""
@@ -701,10 +727,6 @@ 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 ""
@@ -713,6 +735,29 @@ 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"
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"
-"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"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ 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 ""
@@ -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/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 ""
@@ -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/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 ""
@@ -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/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"
@@ -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/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"
@@ -315,6 +323,10 @@ 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 ""
@@ -558,21 +570,35 @@ msgid ""
 "\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: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 ""
 
-#: 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 ""
 
+#: 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 ""
@@ -701,10 +727,6 @@ 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 ""
@@ -713,6 +735,29 @@ 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"
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"
-"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"
@@ -17,17 +17,17 @@ msgstr ""
 "X-Translated-Using: django-rosetta 0.5.3\n"
 
 #: settings.py:37
+msgid "Polish"
+msgstr "polski"
+
+#: settings.py:38
 msgid "German"
 msgstr "niemiecki"
 
-#: settings.py:38
+#: settings.py:39
 msgid "English"
 msgstr "angielski"
 
-#: settings.py:39
-msgid "Polish"
-msgstr "polski"
-
 #: settings.py:40
 msgid "Lithuanian"
 msgstr "litewski"
@@ -44,6 +44,10 @@ msgstr "rosyjski"
 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"
@@ -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/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"
@@ -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/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"
@@ -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/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"
@@ -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/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"
@@ -335,6 +343,10 @@ msgstr "Motyw"
 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"
@@ -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."
 
+#: 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: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."
 
-#: 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"
@@ -623,6 +645,10 @@ msgstr ""
 "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ę"
@@ -761,10 +787,6 @@ msgstr ""
 "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ń"
@@ -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."
 
+#: 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"
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"
-"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"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #: settings.py:37
-msgid "German"
+msgid "Polish"
 msgstr ""
 
 #: settings.py:38
-msgid "English"
+msgid "German"
 msgstr ""
 
 #: settings.py:39
-msgid "Polish"
+msgid "English"
 msgstr ""
 
 #: settings.py:40
@@ -44,6 +44,10 @@ 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 ""
@@ -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/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 ""
@@ -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/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 ""
@@ -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/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"
@@ -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/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"
@@ -315,6 +323,10 @@ 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 ""
@@ -558,21 +570,35 @@ msgid ""
 "\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: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 ""
 
-#: 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 ""
 
+#: 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 ""
@@ -701,10 +727,6 @@ 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 ""
@@ -713,6 +735,29 @@ 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"
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 = (
+    ('pl', gettext('Polish')),
     ('de', gettext('German')),
     ('en', gettext('English')),
-    ('pl', gettext('Polish')),
     ('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',
+    'modeltranslation',
     'catalogue',
     'lessons',
     'piston',
     'api',
     'rosetta',
+    'infopages',
 ]
 
 CACHE_BACKEND = 'locmem:///?max_entries=3000'
@@ -180,6 +183,8 @@ THUMBNAIL_PROCESSORS = (
     'sponsors.processors.add_padding',
 )
 
+TRANSLATION_REGISTRY = "wolnelektury.translation"
+
 # 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",                
        },
+    "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!",                             
        },
-       "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!",
@@ -35,12 +35,18 @@ var LOCALE_TEXTS = {
                "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.',
index 550787d..e71a190 100644 (file)
@@ -2,7 +2,7 @@
 {% 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 %}
 
index cc93d56..fe45140 100644 (file)
@@ -1,7 +1,8 @@
 {% extends "base.html" %}
+{% load i18n %}
 {% 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 %}
 
@@ -10,7 +11,7 @@
     {% 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>
@@ -19,9 +20,9 @@
     </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">
-            <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
index db9e585..f68d065 100644 (file)
@@ -1,7 +1,8 @@
 {% extends "base.html" %}
+{% load i18n %}
 {% 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 %}
 
     {% 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">
-        <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
+        <div class="header"><a href="#" class="jqmClose">{% trans "Close" %}</a></div>
         <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
index 66d6ee4..fd6517c 100644 (file)
@@ -99,7 +99,7 @@
                        {% 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 %}
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 infopages.models import InfoPage
+
 
 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
-    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'),