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"
"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 ""
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"
"%(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 ""
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"
"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 ""
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"
"%(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 ""
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"
"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 ""
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"
"%(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 ""
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"
"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 ""
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"
"%(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 ""
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"
"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 ""
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"
"%(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 ""
# Copyright (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"
"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"
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"
"\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"
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"
"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 ""
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"
"%(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 ""
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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 ""
--- /dev/null
+# 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']
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)
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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 ""
--- /dev/null
+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
--- /dev/null
+# 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']
--- /dev/null
+# -*- 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
+
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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 ""
--- /dev/null
+# -*- 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
--- /dev/null
+# -*- 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
--- /dev/null
+# -*- 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()
--- /dev/null
+# -*- 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.")
--- /dev/null
+# -*- 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)
--- /dev/null
+# -*- coding: utf-8 -*-
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+ url(r'^set_language/$', 'django.views.i18n.set_language', {},
+ name='set_language'),
+)
--- /dev/null
+# -*- 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()
--- /dev/null
+# -*- 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)
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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 ""
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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 ""
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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 ""
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"
"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
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/catalogue/book_detail.html:129
#: templates/catalogue/book_fragments.html:33
#: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
#: templates/catalogue/tagged_object_list.html:141
msgid "Close"
msgstr ""
#: templates/base.html:107 templates/catalogue/book_detail.html:131
#: templates/catalogue/book_fragments.html:35
#: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
#: templates/catalogue/tagged_object_list.html:143
msgid "Loading"
msgstr ""
#: templates/catalogue/book_list.html:12
#: templates/catalogue/book_stub_detail.html:12
#: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
#: templates/lessons/document_detail.html:9
#: templates/lessons/document_list.html:51
msgid "Search"
#: templates/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"
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 ""
"\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 ""
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 ""
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 ""
"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"
"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
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/catalogue/book_detail.html:129
#: templates/catalogue/book_fragments.html:33
#: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
#: templates/catalogue/tagged_object_list.html:141
msgid "Close"
msgstr ""
#: templates/base.html:107 templates/catalogue/book_detail.html:131
#: templates/catalogue/book_fragments.html:35
#: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
#: templates/catalogue/tagged_object_list.html:143
msgid "Loading"
msgstr ""
#: templates/catalogue/book_list.html:12
#: templates/catalogue/book_stub_detail.html:12
#: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
#: templates/lessons/document_detail.html:9
#: templates/lessons/document_list.html:51
msgid "Search"
#: templates/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"
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 ""
"\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 ""
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 ""
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 ""
"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"
"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
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/catalogue/book_detail.html:129
#: templates/catalogue/book_fragments.html:33
#: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
#: templates/catalogue/tagged_object_list.html:141
msgid "Close"
msgstr ""
#: templates/base.html:107 templates/catalogue/book_detail.html:131
#: templates/catalogue/book_fragments.html:35
#: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
#: templates/catalogue/tagged_object_list.html:143
msgid "Loading"
msgstr ""
#: templates/catalogue/book_list.html:12
#: templates/catalogue/book_stub_detail.html:12
#: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
#: templates/lessons/document_detail.html:9
#: templates/lessons/document_list.html:51
msgid "Search"
#: templates/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"
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 ""
"\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 ""
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 ""
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 ""
"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"
"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
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/catalogue/book_detail.html:129
#: templates/catalogue/book_fragments.html:33
#: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
#: templates/catalogue/tagged_object_list.html:141
msgid "Close"
msgstr ""
#: templates/base.html:107 templates/catalogue/book_detail.html:131
#: templates/catalogue/book_fragments.html:35
#: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
#: templates/catalogue/tagged_object_list.html:143
msgid "Loading"
msgstr ""
#: templates/catalogue/book_list.html:12
#: templates/catalogue/book_stub_detail.html:12
#: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
#: templates/lessons/document_detail.html:9
#: templates/lessons/document_list.html:51
msgid "Search"
#: templates/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"
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 ""
"\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 ""
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 ""
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 ""
"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"
"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
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/catalogue/book_detail.html:129
#: templates/catalogue/book_fragments.html:33
#: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
#: templates/catalogue/tagged_object_list.html:141
msgid "Close"
msgstr ""
#: templates/base.html:107 templates/catalogue/book_detail.html:131
#: templates/catalogue/book_fragments.html:35
#: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
#: templates/catalogue/tagged_object_list.html:143
msgid "Loading"
msgstr ""
#: templates/catalogue/book_list.html:12
#: templates/catalogue/book_stub_detail.html:12
#: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
#: templates/lessons/document_detail.html:9
#: templates/lessons/document_list.html:51
msgid "Search"
#: templates/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"
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 ""
"\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 ""
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 ""
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 ""
"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"
"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"
msgid "Spanish"
msgstr "hiszpański"
+#: settings.py:44
+msgid "Ukrainian"
+msgstr "ukraiński"
+
#: templates/404.html:6 templates/404.html.py:15
msgid "Page does not exist"
msgstr "Podana strona nie istnieje"
#: templates/catalogue/book_detail.html:129
#: templates/catalogue/book_fragments.html:33
#: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
#: templates/catalogue/tagged_object_list.html:141
msgid "Close"
msgstr "Zamknij"
#: templates/base.html:107 templates/catalogue/book_detail.html:131
#: templates/catalogue/book_fragments.html:35
#: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
#: templates/catalogue/tagged_object_list.html:143
msgid "Loading"
msgstr "Ładowanie"
#: templates/catalogue/book_list.html:12
#: templates/catalogue/book_stub_detail.html:12
#: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
#: templates/lessons/document_detail.html:9
#: templates/lessons/document_list.html:51
msgid "Search"
#: templates/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"
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"
"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"
"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ę"
"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ń"
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"
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"
"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
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/catalogue/book_detail.html:129
#: templates/catalogue/book_fragments.html:33
#: templates/catalogue/book_stub_detail.html:31
-#: templates/catalogue/search_no_hits.html:23
+#: templates/catalogue/search_multiple_hits.html:23
+#: templates/catalogue/search_no_hits.html:22
+#: templates/catalogue/search_too_short.html:19
#: templates/catalogue/tagged_object_list.html:141
msgid "Close"
msgstr ""
#: templates/base.html:107 templates/catalogue/book_detail.html:131
#: templates/catalogue/book_fragments.html:35
#: templates/catalogue/book_stub_detail.html:33
-#: templates/catalogue/search_no_hits.html:25
+#: templates/catalogue/search_multiple_hits.html:25
+#: templates/catalogue/search_no_hits.html:24
+#: templates/catalogue/search_too_short.html:21
#: templates/catalogue/tagged_object_list.html:143
msgid "Loading"
msgstr ""
#: templates/catalogue/book_list.html:12
#: templates/catalogue/book_stub_detail.html:12
#: templates/catalogue/breadcrumbs.html:9
-#: templates/catalogue/main_page.html:13
+#: templates/catalogue/main_page.html:13 templates/info/base.html:10
#: templates/lessons/document_detail.html:9
#: templates/lessons/document_list.html:51
msgid "Search"
#: templates/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"
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 ""
"\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 ""
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 ""
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"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (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 ""
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')),
)
'pagination',
'chunks',
'compress',
+ 'modeltranslation',
'catalogue',
'lessons',
'piston',
'api',
'rosetta',
+ 'infopages',
]
CACHE_BACKEND = 'locmem:///?max_entries=3000'
'sponsors.processors.add_padding',
)
+TRANSLATION_REGISTRY = "wolnelektury.translation"
+
# Load localsettings, if they exist
try:
from localsettings import *
"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!",
"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.',
{% 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 %}
{% 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>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>
</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
{% 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
{% 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 %}
+++ /dev/null
-{% 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 %}
--- /dev/null
+{% 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 %}
+++ /dev/null
-{% 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 %}
-<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>
+++ /dev/null
-{% 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 %}
-
--- /dev/null
+# -*- 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)
+
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'),