\n"
"Language: pl\n"
@@ -24,7 +24,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.4.0\n"
-#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1374
+#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1341
msgid "not installed"
msgstr "nie zainstalowane"
@@ -70,373 +70,373 @@ msgstr ""
"Nie można znaleźć żadnych formatów przystosowane do wysyłania pocztą "
"e-mail"
-#: cps/ub.py:542
+#: cps/ub.py:543
msgid "Guest"
msgstr "Gość"
-#: cps/web.py:974
+#: cps/web.py:953
msgid "Requesting update package"
msgstr "Żądanie o pakiet aktualizacji"
-#: cps/web.py:975
+#: cps/web.py:954
msgid "Downloading update package"
msgstr "Pobieranie pakietu aktualizacji"
-#: cps/web.py:976
+#: cps/web.py:955
msgid "Unzipping update package"
msgstr "Rozpakowywanie pakietu aktualizacji"
-#: cps/web.py:977
+#: cps/web.py:956
msgid "Files are replaced"
msgstr "Pliki zostały zastąpione"
-#: cps/web.py:978
+#: cps/web.py:957
msgid "Database connections are closed"
msgstr "Połączenia z bazą danych zostały zakończone"
-#: cps/web.py:979
+#: cps/web.py:958
msgid "Server is stopped"
msgstr "Serwer jest zatrzymany"
-#: cps/web.py:980
+#: cps/web.py:959
msgid "Update finished, please press okay and reload page"
msgstr "Aktualizacja zakończona, proszę nacisnąć OK i odświeżyć stronę"
-#: cps/web.py:1054
+#: cps/web.py:1033
msgid "Recently Added Books"
msgstr ""
-#: cps/web.py:1063
+#: cps/web.py:1042
msgid "Newest Books"
msgstr ""
-#: cps/web.py:1072
+#: cps/web.py:1051
msgid "Oldest Books"
msgstr ""
-#: cps/web.py:1081
+#: cps/web.py:1060
msgid "Books (A-Z)"
msgstr ""
-#: cps/web.py:1090
+#: cps/web.py:1069
msgid "Books (Z-A)"
msgstr ""
-#: cps/web.py:1126
+#: cps/web.py:1099
msgid "Hot Books (most downloaded)"
msgstr "Najpopularniejsze książki (najczęściej pobierane)"
-#: cps/web.py:1136
+#: cps/web.py:1109
msgid "Best rated books"
msgstr "Najlepiej oceniane książki"
-#: cps/templates/index.xml:36 cps/web.py:1145
+#: cps/templates/index.xml:35 cps/web.py:1118
msgid "Random Books"
msgstr "Losowe książki"
-#: cps/web.py:1161
+#: cps/web.py:1127
msgid "Author list"
msgstr "Lista autorów"
-#: cps/web.py:1181 cps/web.py:1212 cps/web.py:1351 cps/web.py:1835
+#: cps/web.py:1137 cps/web.py:1193 cps/web.py:1318 cps/web.py:1796
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Błąd otwierania e-booka. Plik nie istnieje lub plik nie jest dostępny:"
-#: cps/templates/index.xml:71 cps/web.py:1198
+#: cps/templates/index.xml:70 cps/web.py:1179
msgid "Series list"
msgstr "Lista serii"
-#: cps/web.py:1210
+#: cps/web.py:1191
#, python-format
msgid "Series: %(serie)s"
msgstr "Seria: %(serie)s"
-#: cps/web.py:1243
+#: cps/web.py:1224
msgid "Available languages"
msgstr "Dostępne języki"
-#: cps/web.py:1258
+#: cps/web.py:1239
#, python-format
msgid "Language: %(name)s"
msgstr "Język: %(name)s"
-#: cps/templates/index.xml:64 cps/web.py:1274
+#: cps/templates/index.xml:63 cps/web.py:1248
msgid "Category list"
msgstr "Lista kategorii"
-#: cps/web.py:1286
+#: cps/web.py:1260
#, python-format
msgid "Category: %(name)s"
msgstr "Kategoria: %(name)s"
-#: cps/web.py:1385
+#: cps/web.py:1352
msgid "Excecution permissions missing"
msgstr ""
-#: cps/web.py:1399
+#: cps/web.py:1366
msgid "Statistics"
msgstr "Statystyki"
-#: cps/web.py:1563
+#: cps/web.py:1530
msgid "Server restarted, please reload page"
msgstr "Serwer uruchomiony ponownie, proszę odświeżyć stronę"
-#: cps/web.py:1565
+#: cps/web.py:1532
msgid "Performing shutdown of server, please close window"
msgstr "Wykonano wyłączenie serwera, proszę zamknąć okno"
-#: cps/web.py:1581
+#: cps/web.py:1548
msgid "Update done"
msgstr "Aktualizacja zakończona"
-#: cps/web.py:1662 cps/web.py:1675
+#: cps/web.py:1623 cps/web.py:1636
msgid "search"
msgstr "szukaj"
-#: cps/templates/index.xml:43 cps/templates/index.xml:47
-#: cps/templates/layout.html:127 cps/web.py:1751
+#: cps/templates/index.xml:42 cps/templates/index.xml:46
+#: cps/templates/layout.html:127 cps/web.py:1712
msgid "Read Books"
msgstr "Przeczytane książki"
-#: cps/templates/index.xml:50 cps/templates/index.xml:54
-#: cps/templates/layout.html:128 cps/web.py:1754
+#: cps/templates/index.xml:49 cps/templates/index.xml:53
+#: cps/templates/layout.html:128 cps/web.py:1715
msgid "Unread Books"
msgstr "Nieprzeczytane książki"
-#: cps/web.py:1821 cps/web.py:1823 cps/web.py:1825 cps/web.py:1832
+#: cps/web.py:1782 cps/web.py:1784 cps/web.py:1786 cps/web.py:1793
msgid "Read a Book"
msgstr "Czytaj książkę"
-#: cps/web.py:1888 cps/web.py:2513
+#: cps/web.py:1849 cps/web.py:2474
msgid "Please fill out all fields!"
msgstr "Proszę wypełnić wszystkie pola!"
-#: cps/web.py:1889 cps/web.py:1905 cps/web.py:1910 cps/web.py:1912
+#: cps/web.py:1850 cps/web.py:1866 cps/web.py:1871 cps/web.py:1873
msgid "register"
msgstr "rejestracja"
-#: cps/web.py:1904
+#: cps/web.py:1865
msgid "An unknown error occured. Please try again later."
msgstr "Wystąpił nieznany błąd. Spróbuj ponownie później."
-#: cps/web.py:1909
+#: cps/web.py:1870
msgid "This username or email address is already in use."
msgstr "Nazwa użytkownika lub adres e-mail jest już w użyciu."
-#: cps/web.py:1928 cps/web.py:2024
+#: cps/web.py:1889 cps/web.py:1985
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Zalogowałeś się jako: '%(nickname)s'"
-#: cps/web.py:1933
+#: cps/web.py:1894
msgid "Wrong Username or Password"
msgstr "Błędna nazwa użytkownika lub hasło"
-#: cps/web.py:1939 cps/web.py:1960
+#: cps/web.py:1900 cps/web.py:1921
msgid "login"
msgstr "logowanie"
-#: cps/web.py:1972 cps/web.py:2003
+#: cps/web.py:1933 cps/web.py:1964
msgid "Token not found"
msgstr ""
-#: cps/web.py:1980 cps/web.py:2011
+#: cps/web.py:1941 cps/web.py:1972
msgid "Token has expired"
msgstr ""
-#: cps/web.py:1988
+#: cps/web.py:1949
msgid "Success! Please return to your device"
msgstr ""
-#: cps/web.py:2038
+#: cps/web.py:1999
msgid "Please configure the SMTP mail settings first..."
msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..."
-#: cps/web.py:2042
+#: cps/web.py:2003
#, python-format
msgid "Book successfully send to %(kindlemail)s"
msgstr "Książka została pomyślnie wysłana do %(kindlemail)s"
-#: cps/web.py:2046
+#: cps/web.py:2007
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Wystąpił błąd podczas wysyłania tej książki: %(res)s"
-#: cps/web.py:2048 cps/web.py:2598
+#: cps/web.py:2009 cps/web.py:2559
msgid "Please configure your kindle email address first..."
msgstr "Proszę najpierw skonfigurować adres e-mail swojego kindla..."
-#: cps/web.py:2092
+#: cps/web.py:2053
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "Książka została dodana do półki: %(sname)s"
-#: cps/web.py:2127
+#: cps/web.py:2088
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "Książka została usunięta z półki: %(sname)s"
-#: cps/web.py:2146 cps/web.py:2170
+#: cps/web.py:2107 cps/web.py:2131
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "Półka o nazwie '%(title)s' już istnieje."
-#: cps/web.py:2151
+#: cps/web.py:2112
#, python-format
msgid "Shelf %(title)s created"
msgstr "Półka %(title)s została utworzona"
-#: cps/web.py:2153 cps/web.py:2181
+#: cps/web.py:2114 cps/web.py:2142
msgid "There was an error"
msgstr "Wystąpił błąd"
-#: cps/web.py:2154 cps/web.py:2156
+#: cps/web.py:2115 cps/web.py:2117
msgid "create a shelf"
msgstr "utwórz półkę"
-#: cps/web.py:2179
+#: cps/web.py:2140
#, python-format
msgid "Shelf %(title)s changed"
msgstr "Półka %(title)s została zmieniona"
-#: cps/web.py:2182 cps/web.py:2184
+#: cps/web.py:2143 cps/web.py:2145
msgid "Edit a shelf"
msgstr "Edytuj półkę"
-#: cps/web.py:2204
+#: cps/web.py:2165
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "pomyślnie usunięto półkę %(name)s"
-#: cps/web.py:2226
+#: cps/web.py:2187
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "Półka: '%(name)s'"
-#: cps/web.py:2229
+#: cps/web.py:2190
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr ""
-#: cps/web.py:2261
+#: cps/web.py:2222
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "Zmieniono kolejność półki: '%(name)s'"
-#: cps/web.py:2326
+#: cps/web.py:2287
msgid "Found an existing account for this email address."
msgstr "Znaleziono istniejące konto dla tego adresu e-mail."
-#: cps/web.py:2328 cps/web.py:2332
+#: cps/web.py:2289 cps/web.py:2293
#, python-format
msgid "%(name)s's profile"
msgstr "Profil użytkownika %(name)s"
-#: cps/web.py:2329
+#: cps/web.py:2290
msgid "Profile updated"
msgstr "Zaktualizowano profil"
-#: cps/web.py:2343
+#: cps/web.py:2304
msgid "Admin page"
msgstr "Portal administracyjny"
-#: cps/web.py:2467
+#: cps/web.py:2428
msgid "Calibre-web configuration updated"
msgstr "Konfiguracja Calibre-web została zaktualizowana"
-#: cps/web.py:2474 cps/web.py:2480 cps/web.py:2494
+#: cps/web.py:2435 cps/web.py:2441 cps/web.py:2455
msgid "Basic Configuration"
msgstr "Podstawowa konfiguracja"
-#: cps/web.py:2478
+#: cps/web.py:2439
msgid "DB location is not valid, please enter correct path"
msgstr "Lokalizacja bazy danych jest nieprawidłowa, wpisz poprawną ścieżkę"
-#: cps/templates/admin.html:34 cps/web.py:2515 cps/web.py:2568
+#: cps/templates/admin.html:34 cps/web.py:2476 cps/web.py:2529
msgid "Add new user"
msgstr "Dodaj nowego użytkownika"
-#: cps/web.py:2560
+#: cps/web.py:2521
#, python-format
msgid "User '%(user)s' created"
msgstr "Użytkownik '%(user)s' został utworzony"
-#: cps/web.py:2564
+#: cps/web.py:2525
msgid "Found an existing account for this email address or nickname."
msgstr "Znaleziono istniejące konto dla tego adresu e-mail lub nazwy użytkownika."
-#: cps/web.py:2586
+#: cps/web.py:2547
msgid "Mail settings updated"
msgstr "Zaktualizowano ustawienia poczty e-mail"
-#: cps/web.py:2593
+#: cps/web.py:2554
#, python-format
msgid "Test E-Mail successfully send to %(kindlemail)s"
msgstr "Testowy e-mail został pomyślnie wysłany do %(kindlemail)s"
-#: cps/web.py:2596
+#: cps/web.py:2557
#, python-format
msgid "There was an error sending the Test E-Mail: %(res)s"
msgstr "Wystąpił błąd podczas wysyłania testowej wiadomości e-mail: %(res)s"
-#: cps/web.py:2600
+#: cps/web.py:2561
msgid "E-Mail settings updated"
msgstr "Zaktualizowano ustawienia e-mail"
-#: cps/web.py:2601
+#: cps/web.py:2562
msgid "Edit mail settings"
msgstr "Edytuj ustawienia poczty e-mail"
-#: cps/web.py:2630
+#: cps/web.py:2591
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "Użytkownik '%(nick)s' został usunięty"
-#: cps/web.py:2728
+#: cps/web.py:2689
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Użytkownik '%(nick)s' został zaktualizowany"
-#: cps/web.py:2731
+#: cps/web.py:2692
msgid "An unknown error occured."
msgstr "Wystąpił nieznany błąd."
-#: cps/web.py:2734
+#: cps/web.py:2695
#, python-format
msgid "Edit User %(nick)s"
msgstr "Edytuj użytkownika %(nick)s"
-#: cps/web.py:2756
+#: cps/web.py:2711
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr ""
-#: cps/web.py:2771 cps/web.py:2954 cps/web.py:3078
+#: cps/web.py:2726 cps/web.py:2898 cps/web.py:3041
msgid "edit metadata"
msgstr "edytuj metadane"
-#: cps/web.py:2783 cps/web.py:2787
+#: cps/web.py:2738 cps/web.py:2742
msgid "unknown"
msgstr ""
-#: cps/web.py:2972
+#: cps/web.py:2935
#, python-format
msgid "File extension \"%s\" is not allowed to be uploaded to this server"
msgstr "Rozszerzenie pliku \"%s\" nie jest dozwolone do przesłania na ten serwer"
-#: cps/web.py:2978
+#: cps/web.py:2941
msgid "File to be uploaded must have an extension"
msgstr "Plik do przesłania musi mieć rozszerzenie"
-#: cps/web.py:2997
+#: cps/web.py:2960
#, python-format
msgid "Failed to create path %s (Permission denied)."
msgstr "Nie udało się utworzyć łącza %s (Odmowa dostępu)."
-#: cps/web.py:3002
+#: cps/web.py:2965
#, python-format
msgid "Failed to store file %s (Permission denied)."
msgstr "Nie można przechowywać pliku %s (Odmowa dostępu)."
-#: cps/web.py:3007
+#: cps/web.py:2970
#, python-format
msgid "Failed to delete file %s (Permission denied)."
msgstr "Nie udało się usunąć pliku %s (Odmowa dostępu)."
@@ -607,6 +607,18 @@ msgstr "Na pewno chcesz zatrzymać Calibre Web?"
msgid "Updating, please do not reload page"
msgstr "Aktualizowanie, proszę nie odświeżać strony"
+#: cps/templates/author.html:15
+msgid "via"
+msgstr ""
+
+#: cps/templates/author.html:23
+msgid "In Library"
+msgstr ""
+
+#: cps/templates/author.html:69
+msgid "More by"
+msgstr ""
+
#: cps/templates/book_edit.html:16
msgid "Delete Book"
msgstr ""
@@ -615,12 +627,13 @@ msgstr ""
msgid "Book Title"
msgstr "Tytuł książki"
-#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:188
-#: cps/templates/search_form.html:10
+#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:208
+#: cps/templates/book_edit.html:226 cps/templates/search_form.html:10
msgid "Author"
msgstr "Autor"
-#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:190
+#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:213
+#: cps/templates/book_edit.html:228
msgid "Description"
msgstr "Opis"
@@ -703,35 +716,35 @@ msgstr " Szukaj słowa kluczowego "
msgid "Go!"
msgstr "Idź!"
-#: cps/templates/book_edit.html:168
+#: cps/templates/book_edit.html:171
msgid "Click the cover to load metadata to the form"
msgstr "Kliknij okładkę, aby załadować metadane do formularza"
-#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:185
+#: cps/templates/book_edit.html:183 cps/templates/book_edit.html:223
msgid "Loading..."
msgstr "Ładowanie..."
-#: cps/templates/book_edit.html:175 cps/templates/layout.html:199
+#: cps/templates/book_edit.html:188 cps/templates/layout.html:199
msgid "Close"
msgstr "Zamknij"
-#: cps/templates/book_edit.html:186
-msgid "Search error!"
-msgstr "Błąd wyszukiwania!"
-
-#: cps/templates/book_edit.html:187
-msgid "No Result! Please try anonther keyword."
-msgstr "Brak wyników! Spróbuj innego słowa kluczowego."
-
-#: cps/templates/book_edit.html:189 cps/templates/detail.html:125
-#: cps/templates/search_form.html:14
+#: cps/templates/book_edit.html:210 cps/templates/book_edit.html:227
+#: cps/templates/detail.html:125 cps/templates/search_form.html:14
msgid "Publisher"
msgstr "Wydawca"
-#: cps/templates/book_edit.html:191
+#: cps/templates/book_edit.html:215 cps/templates/book_edit.html:229
msgid "Source"
msgstr "Źródło"
+#: cps/templates/book_edit.html:224
+msgid "Search error!"
+msgstr "Błąd wyszukiwania!"
+
+#: cps/templates/book_edit.html:225
+msgid "No Result! Please try anonther keyword."
+msgstr "Brak wyników! Spróbuj innego słowa kluczowego."
+
#: cps/templates/config_edit.html:7
msgid "Location of Calibre database"
msgstr "Lokalizacja bazy danych Calibre"
@@ -925,6 +938,11 @@ msgstr "Zapisz ustawienia i wyślij testową wiadomość e-mail"
msgid "Next"
msgstr "Następne"
+#: cps/templates/feed.xml:29 cps/templates/index.xml:7
+#: cps/templates/layout.html:40 cps/templates/layout.html:41
+msgid "Search"
+msgstr "Szukaj"
+
#: cps/templates/index.html:5
msgid "Discover (Random Books)"
msgstr "Odkrywaj (losowe książki)"
@@ -933,52 +951,47 @@ msgstr "Odkrywaj (losowe książki)"
msgid "Start"
msgstr "Rozpocznij"
-#: cps/templates/index.xml:7 cps/templates/layout.html:40
-#: cps/templates/layout.html:41
-msgid "Search"
-msgstr "Szukaj"
-
-#: cps/templates/index.xml:15 cps/templates/layout.html:121
+#: cps/templates/index.xml:14 cps/templates/layout.html:121
msgid "Hot Books"
msgstr "Najpopularniejsze książki"
-#: cps/templates/index.xml:19
+#: cps/templates/index.xml:18
msgid "Popular publications from this catalog based on Downloads."
msgstr "Popularne publikacje z tego katalogu bazujące na pobranych."
-#: cps/templates/index.xml:22 cps/templates/layout.html:124
+#: cps/templates/index.xml:21 cps/templates/layout.html:124
msgid "Best rated Books"
msgstr "Najlepiej ocenione książki"
-#: cps/templates/index.xml:26
+#: cps/templates/index.xml:25
msgid "Popular publications from this catalog based on Rating."
msgstr "Popularne publikacje z tego katalogu bazujące na ocenach."
-#: cps/templates/index.xml:29
+#: cps/templates/index.xml:28
msgid "New Books"
msgstr "Nowe książki"
-#: cps/templates/index.xml:33
+#: cps/templates/index.xml:32
msgid "The latest Books"
msgstr "Ostatnie książki"
-#: cps/templates/index.xml:40
+#: cps/templates/index.xml:39
msgid "Show Random Books"
msgstr "Pokazuj losowe książki"
-#: cps/templates/index.xml:57 cps/templates/layout.html:139
+#: cps/templates/index.xml:56 cps/templates/layout.html:139
msgid "Authors"
msgstr "Autorzy"
-#: cps/templates/index.xml:61
+#: cps/templates/index.xml:60
msgid "Books ordered by Author"
msgstr "Książki sortowane według autorów"
-#: cps/templates/index.xml:68
+#: cps/templates/index.xml:67
msgid "Books ordered by category"
msgstr "Książki sortowane według kategorii"
-#: cps/templates/index.xml:75
+#: cps/templates/index.xml:74
msgid "Books ordered by series"
msgstr "Książki sortowane według serii"
@@ -1139,7 +1152,7 @@ msgid "No Results for:"
msgstr "Brak wyników dla:"
#: cps/templates/search.html:7
-msgid "Please try a diffrent Search"
+msgid "Please try a different search"
msgstr "Proszę wypróbować podobne wyszukiwanie"
#: cps/templates/search.html:9
diff --git a/cps/translations/ru/LC_MESSAGES/messages.mo b/cps/translations/ru/LC_MESSAGES/messages.mo
index e5792140..ac155d8e 100644
Binary files a/cps/translations/ru/LC_MESSAGES/messages.mo and b/cps/translations/ru/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/ru/LC_MESSAGES/messages.po b/cps/translations/ru/LC_MESSAGES/messages.po
index 6e08b74e..66daab2a 100644
--- a/cps/translations/ru/LC_MESSAGES/messages.po
+++ b/cps/translations/ru/LC_MESSAGES/messages.po
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
-"POT-Creation-Date: 2017-08-12 18:55+0200\n"
+"POT-Creation-Date: 2017-09-01 20:37+0200\n"
"PO-Revision-Date: 2017-04-30 00:47+0300\n"
"Last-Translator: Pavel Korovin \n"
"Language: ru\n"
@@ -26,7 +26,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.4.0\n"
-#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1374
+#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1341
msgid "not installed"
msgstr "Отсутствует"
@@ -70,373 +70,373 @@ msgstr "Отправить на Kindle"
msgid "Could not find any formats suitable for sending by email"
msgstr "Невозоможно найти формат, подходящий для отправки по email"
-#: cps/ub.py:542
+#: cps/ub.py:543
msgid "Guest"
msgstr "Гость"
-#: cps/web.py:974
+#: cps/web.py:953
msgid "Requesting update package"
msgstr "Проверка обновлений"
-#: cps/web.py:975
+#: cps/web.py:954
msgid "Downloading update package"
msgstr "Загрузка обновлений"
-#: cps/web.py:976
+#: cps/web.py:955
msgid "Unzipping update package"
msgstr "Распаковка обновлений"
-#: cps/web.py:977
+#: cps/web.py:956
msgid "Files are replaced"
msgstr "Файлы заменены"
-#: cps/web.py:978
+#: cps/web.py:957
msgid "Database connections are closed"
msgstr "Соеднинения с базой данных закрыты"
-#: cps/web.py:979
+#: cps/web.py:958
msgid "Server is stopped"
msgstr "Сервер остановлен"
-#: cps/web.py:980
+#: cps/web.py:959
msgid "Update finished, please press okay and reload page"
msgstr "Обновления установлены, нажмите okay и перезагрузите страницу"
-#: cps/web.py:1054
+#: cps/web.py:1033
msgid "Recently Added Books"
msgstr ""
-#: cps/web.py:1063
+#: cps/web.py:1042
msgid "Newest Books"
msgstr ""
-#: cps/web.py:1072
+#: cps/web.py:1051
msgid "Oldest Books"
msgstr ""
-#: cps/web.py:1081
+#: cps/web.py:1060
msgid "Books (A-Z)"
msgstr ""
-#: cps/web.py:1090
+#: cps/web.py:1069
msgid "Books (Z-A)"
msgstr ""
-#: cps/web.py:1126
+#: cps/web.py:1099
msgid "Hot Books (most downloaded)"
msgstr "Популярные книги (часто загружаемые)"
-#: cps/web.py:1136
+#: cps/web.py:1109
msgid "Best rated books"
msgstr "Книги с наивысшим рейтингом"
-#: cps/templates/index.xml:36 cps/web.py:1145
+#: cps/templates/index.xml:35 cps/web.py:1118
msgid "Random Books"
msgstr "Случайный выбор"
-#: cps/web.py:1161
+#: cps/web.py:1127
msgid "Author list"
msgstr "Авторы"
-#: cps/web.py:1181 cps/web.py:1212 cps/web.py:1351 cps/web.py:1835
+#: cps/web.py:1137 cps/web.py:1193 cps/web.py:1318 cps/web.py:1796
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Невозможно открыть книгу. Файл не существует или недоступен."
-#: cps/templates/index.xml:71 cps/web.py:1198
+#: cps/templates/index.xml:70 cps/web.py:1179
msgid "Series list"
msgstr "Серии"
-#: cps/web.py:1210
+#: cps/web.py:1191
#, python-format
msgid "Series: %(serie)s"
msgstr "Серии: %(serie)s"
-#: cps/web.py:1243
+#: cps/web.py:1224
msgid "Available languages"
msgstr "Языки"
-#: cps/web.py:1258
+#: cps/web.py:1239
#, python-format
msgid "Language: %(name)s"
msgstr "Язык: %(name)s"
-#: cps/templates/index.xml:64 cps/web.py:1274
+#: cps/templates/index.xml:63 cps/web.py:1248
msgid "Category list"
msgstr "Категории"
-#: cps/web.py:1286
+#: cps/web.py:1260
#, python-format
msgid "Category: %(name)s"
msgstr "Категория: %(name)s"
-#: cps/web.py:1385
+#: cps/web.py:1352
msgid "Excecution permissions missing"
msgstr ""
-#: cps/web.py:1399
+#: cps/web.py:1366
msgid "Statistics"
msgstr "Статистика"
-#: cps/web.py:1563
+#: cps/web.py:1530
msgid "Server restarted, please reload page"
msgstr "Сервер перезагружен, пожалуйста, перезагрузите страницу"
-#: cps/web.py:1565
+#: cps/web.py:1532
msgid "Performing shutdown of server, please close window"
msgstr "Производится остановка сервера, пожалуйста, закройте окно"
-#: cps/web.py:1581
+#: cps/web.py:1548
msgid "Update done"
msgstr "Обновление закончено"
-#: cps/web.py:1662 cps/web.py:1675
+#: cps/web.py:1623 cps/web.py:1636
msgid "search"
msgstr "поиск"
-#: cps/templates/index.xml:43 cps/templates/index.xml:47
-#: cps/templates/layout.html:127 cps/web.py:1751
+#: cps/templates/index.xml:42 cps/templates/index.xml:46
+#: cps/templates/layout.html:127 cps/web.py:1712
msgid "Read Books"
msgstr "Прочитанные"
-#: cps/templates/index.xml:50 cps/templates/index.xml:54
-#: cps/templates/layout.html:128 cps/web.py:1754
+#: cps/templates/index.xml:49 cps/templates/index.xml:53
+#: cps/templates/layout.html:128 cps/web.py:1715
msgid "Unread Books"
msgstr "Непрочитанные"
-#: cps/web.py:1821 cps/web.py:1823 cps/web.py:1825 cps/web.py:1832
+#: cps/web.py:1782 cps/web.py:1784 cps/web.py:1786 cps/web.py:1793
msgid "Read a Book"
msgstr "Читать книгу"
-#: cps/web.py:1888 cps/web.py:2513
+#: cps/web.py:1849 cps/web.py:2474
msgid "Please fill out all fields!"
msgstr "Пожалуйста, заполните все поля!"
-#: cps/web.py:1889 cps/web.py:1905 cps/web.py:1910 cps/web.py:1912
+#: cps/web.py:1850 cps/web.py:1866 cps/web.py:1871 cps/web.py:1873
msgid "register"
msgstr "зарегистрироваться"
-#: cps/web.py:1904
+#: cps/web.py:1865
msgid "An unknown error occured. Please try again later."
msgstr "Неизвестная ошибка. Пожалуйста, попробуйте позже."
-#: cps/web.py:1909
+#: cps/web.py:1870
msgid "This username or email address is already in use."
msgstr "Имя пользователя или адрес эл. почты уже используется"
-#: cps/web.py:1928 cps/web.py:2024
+#: cps/web.py:1889 cps/web.py:1985
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Вы вошли как пользователь '%(nickname)s'"
-#: cps/web.py:1933
+#: cps/web.py:1894
msgid "Wrong Username or Password"
msgstr "Ошибка в имени пользователя или пароле"
-#: cps/web.py:1939 cps/web.py:1960
+#: cps/web.py:1900 cps/web.py:1921
msgid "login"
msgstr "войти"
-#: cps/web.py:1972 cps/web.py:2003
+#: cps/web.py:1933 cps/web.py:1964
msgid "Token not found"
msgstr ""
-#: cps/web.py:1980 cps/web.py:2011
+#: cps/web.py:1941 cps/web.py:1972
msgid "Token has expired"
msgstr ""
-#: cps/web.py:1988
+#: cps/web.py:1949
msgid "Success! Please return to your device"
msgstr ""
-#: cps/web.py:2038
+#: cps/web.py:1999
msgid "Please configure the SMTP mail settings first..."
msgstr "Пожалуйста, сначала сконфигурируйте параметры SMTP"
-#: cps/web.py:2042
+#: cps/web.py:2003
#, python-format
msgid "Book successfully send to %(kindlemail)s"
msgstr "Книга успешно отправлена на %(kindlemail)s"
-#: cps/web.py:2046
+#: cps/web.py:2007
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Ошибка при отправке книги: %(res)s"
-#: cps/web.py:2048 cps/web.py:2598
+#: cps/web.py:2009 cps/web.py:2559
msgid "Please configure your kindle email address first..."
msgstr "Пожалуйста, сначала укажите ваш kindle email..."
-#: cps/web.py:2092
+#: cps/web.py:2053
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "Книга добавлена на книжную полку: %(sname)s"
-#: cps/web.py:2127
+#: cps/web.py:2088
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "Книга удалена с книжной полки: %(sname)s"
-#: cps/web.py:2146 cps/web.py:2170
+#: cps/web.py:2107 cps/web.py:2131
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "Книжкная полка с названием '%(title)s' уже существует."
-#: cps/web.py:2151
+#: cps/web.py:2112
#, python-format
msgid "Shelf %(title)s created"
msgstr "Создана книжная полка %(title)s"
-#: cps/web.py:2153 cps/web.py:2181
+#: cps/web.py:2114 cps/web.py:2142
msgid "There was an error"
msgstr "Произошла ошибка"
-#: cps/web.py:2154 cps/web.py:2156
+#: cps/web.py:2115 cps/web.py:2117
msgid "create a shelf"
msgstr "создать книжную полку"
-#: cps/web.py:2179
+#: cps/web.py:2140
#, python-format
msgid "Shelf %(title)s changed"
msgstr "Книжная полка %(title)s изменена"
-#: cps/web.py:2182 cps/web.py:2184
+#: cps/web.py:2143 cps/web.py:2145
msgid "Edit a shelf"
msgstr "Изменить книжную полку"
-#: cps/web.py:2204
+#: cps/web.py:2165
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "Книжная полка %(name)s удалена"
-#: cps/web.py:2226
+#: cps/web.py:2187
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "Книжная полка: '%(name)s'"
-#: cps/web.py:2229
+#: cps/web.py:2190
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr ""
-#: cps/web.py:2261
+#: cps/web.py:2222
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "Изменить расположение книжной полки '%(name)s'"
-#: cps/web.py:2326
+#: cps/web.py:2287
msgid "Found an existing account for this email address."
msgstr "Найдена учётная запись для для данного адреса email."
-#: cps/web.py:2328 cps/web.py:2332
+#: cps/web.py:2289 cps/web.py:2293
#, python-format
msgid "%(name)s's profile"
msgstr "Профиль %(name)s"
-#: cps/web.py:2329
+#: cps/web.py:2290
msgid "Profile updated"
msgstr "Профиль обновлён"
-#: cps/web.py:2343
+#: cps/web.py:2304
msgid "Admin page"
msgstr "Администрирование"
-#: cps/web.py:2467
+#: cps/web.py:2428
msgid "Calibre-web configuration updated"
msgstr "Конфигурация Calibre-web обновлена"
-#: cps/web.py:2474 cps/web.py:2480 cps/web.py:2494
+#: cps/web.py:2435 cps/web.py:2441 cps/web.py:2455
msgid "Basic Configuration"
msgstr "Настройки сервера"
-#: cps/web.py:2478
+#: cps/web.py:2439
msgid "DB location is not valid, please enter correct path"
msgstr "Неверный путь к фалу БД, пожалуйста, укажите правильное расположение БД"
-#: cps/templates/admin.html:34 cps/web.py:2515 cps/web.py:2568
+#: cps/templates/admin.html:34 cps/web.py:2476 cps/web.py:2529
msgid "Add new user"
msgstr "Добавить пользователя"
-#: cps/web.py:2560
+#: cps/web.py:2521
#, python-format
msgid "User '%(user)s' created"
msgstr "Пользователь '%(user)s' добавлен"
-#: cps/web.py:2564
+#: cps/web.py:2525
msgid "Found an existing account for this email address or nickname."
msgstr "Для указанного адреса или имени найдена существующая учётная запись."
-#: cps/web.py:2586
+#: cps/web.py:2547
msgid "Mail settings updated"
msgstr "Настройки почты изменены"
-#: cps/web.py:2593
+#: cps/web.py:2554
#, python-format
msgid "Test E-Mail successfully send to %(kindlemail)s"
msgstr "Тестовое сообщение успешно отправлено на адрес %(kindlemail)s"
-#: cps/web.py:2596
+#: cps/web.py:2557
#, python-format
msgid "There was an error sending the Test E-Mail: %(res)s"
msgstr "Ошибка отправки тестового сообщения: %(res)s"
-#: cps/web.py:2600
+#: cps/web.py:2561
msgid "E-Mail settings updated"
msgstr "Обновлены настройки e-mail"
-#: cps/web.py:2601
+#: cps/web.py:2562
msgid "Edit mail settings"
msgstr "Изменить почтовые настройки"
-#: cps/web.py:2630
+#: cps/web.py:2591
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "Пользователь '%(nick)s' удалён"
-#: cps/web.py:2728
+#: cps/web.py:2689
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Пользователь '%(nick)s' обновлён"
-#: cps/web.py:2731
+#: cps/web.py:2692
msgid "An unknown error occured."
msgstr "Произошла неизвестная ошибка."
-#: cps/web.py:2734
+#: cps/web.py:2695
#, python-format
msgid "Edit User %(nick)s"
msgstr "Изменить пользователя %(nick)s"
-#: cps/web.py:2756
+#: cps/web.py:2711
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr ""
-#: cps/web.py:2771 cps/web.py:2954 cps/web.py:3078
+#: cps/web.py:2726 cps/web.py:2898 cps/web.py:3041
msgid "edit metadata"
msgstr "изменить метаданные"
-#: cps/web.py:2783 cps/web.py:2787
+#: cps/web.py:2738 cps/web.py:2742
msgid "unknown"
msgstr "неизвестно"
-#: cps/web.py:2972
+#: cps/web.py:2935
#, python-format
msgid "File extension \"%s\" is not allowed to be uploaded to this server"
msgstr "Запрещена загрузка файлов с расширением \"%s\""
-#: cps/web.py:2978
+#: cps/web.py:2941
msgid "File to be uploaded must have an extension"
msgstr "Загружаемый файл должен иметь расширение"
-#: cps/web.py:2997
+#: cps/web.py:2960
#, python-format
msgid "Failed to create path %s (Permission denied)."
msgstr "Ошибка при создании пути %s (доступ запрещён)"
-#: cps/web.py:3002
+#: cps/web.py:2965
#, python-format
msgid "Failed to store file %s (Permission denied)."
msgstr "Ошибка записи файоа %s (доступ запрещён)"
-#: cps/web.py:3007
+#: cps/web.py:2970
#, python-format
msgid "Failed to delete file %s (Permission denied)."
msgstr "Ошибка удаления файла %s (доступ запрещён)"
@@ -607,6 +607,18 @@ msgstr "Вы действительно хотите остановить Calibr
msgid "Updating, please do not reload page"
msgstr "Установка обновлений, пожалуйста, не обновляйте страницу."
+#: cps/templates/author.html:15
+msgid "via"
+msgstr ""
+
+#: cps/templates/author.html:23
+msgid "In Library"
+msgstr ""
+
+#: cps/templates/author.html:69
+msgid "More by"
+msgstr ""
+
#: cps/templates/book_edit.html:16
msgid "Delete Book"
msgstr "Удалить книгу"
@@ -615,12 +627,13 @@ msgstr "Удалить книгу"
msgid "Book Title"
msgstr "Название"
-#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:188
-#: cps/templates/search_form.html:10
+#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:208
+#: cps/templates/book_edit.html:226 cps/templates/search_form.html:10
msgid "Author"
msgstr "Автор"
-#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:190
+#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:213
+#: cps/templates/book_edit.html:228
msgid "Description"
msgstr "Описание"
@@ -703,35 +716,35 @@ msgstr " Поиск по ключевому слову"
msgid "Go!"
msgstr "Искать"
-#: cps/templates/book_edit.html:168
+#: cps/templates/book_edit.html:171
msgid "Click the cover to load metadata to the form"
msgstr "Нажмите на обложку, чтобы получить метаданные"
-#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:185
+#: cps/templates/book_edit.html:183 cps/templates/book_edit.html:223
msgid "Loading..."
msgstr "Загрузка..."
-#: cps/templates/book_edit.html:175 cps/templates/layout.html:199
+#: cps/templates/book_edit.html:188 cps/templates/layout.html:199
msgid "Close"
msgstr "Закрыть"
-#: cps/templates/book_edit.html:186
-msgid "Search error!"
-msgstr "Ошибка поиска!"
-
-#: cps/templates/book_edit.html:187
-msgid "No Result! Please try anonther keyword."
-msgstr "Нет результатов. Пожалуйста, попробуйте другое ключевое слово"
-
-#: cps/templates/book_edit.html:189 cps/templates/detail.html:125
-#: cps/templates/search_form.html:14
+#: cps/templates/book_edit.html:210 cps/templates/book_edit.html:227
+#: cps/templates/detail.html:125 cps/templates/search_form.html:14
msgid "Publisher"
msgstr "Издатель"
-#: cps/templates/book_edit.html:191
+#: cps/templates/book_edit.html:215 cps/templates/book_edit.html:229
msgid "Source"
msgstr "Источник"
+#: cps/templates/book_edit.html:224
+msgid "Search error!"
+msgstr "Ошибка поиска!"
+
+#: cps/templates/book_edit.html:225
+msgid "No Result! Please try anonther keyword."
+msgstr "Нет результатов. Пожалуйста, попробуйте другое ключевое слово"
+
#: cps/templates/config_edit.html:7
msgid "Location of Calibre database"
msgstr "Расположение БД Calibre"
@@ -922,6 +935,11 @@ msgstr "Сохранить настройки и отправить тестов
msgid "Next"
msgstr "Дальше"
+#: cps/templates/feed.xml:29 cps/templates/index.xml:7
+#: cps/templates/layout.html:40 cps/templates/layout.html:41
+msgid "Search"
+msgstr "Поиск"
+
#: cps/templates/index.html:5
msgid "Discover (Random Books)"
msgstr "Обзор (случайные книги)"
@@ -930,52 +948,47 @@ msgstr "Обзор (случайные книги)"
msgid "Start"
msgstr "Старт"
-#: cps/templates/index.xml:7 cps/templates/layout.html:40
-#: cps/templates/layout.html:41
-msgid "Search"
-msgstr "Поиск"
-
-#: cps/templates/index.xml:15 cps/templates/layout.html:121
+#: cps/templates/index.xml:14 cps/templates/layout.html:121
msgid "Hot Books"
msgstr "Популярные книги"
-#: cps/templates/index.xml:19
+#: cps/templates/index.xml:18
msgid "Popular publications from this catalog based on Downloads."
msgstr "Популярные книги в этом каталоге, на основе количества скачиваний"
-#: cps/templates/index.xml:22 cps/templates/layout.html:124
+#: cps/templates/index.xml:21 cps/templates/layout.html:124
msgid "Best rated Books"
msgstr "Книги с наилучшим рейтингом"
-#: cps/templates/index.xml:26
+#: cps/templates/index.xml:25
msgid "Popular publications from this catalog based on Rating."
msgstr "Популярные книги из этого каталога на основании рейтинга"
-#: cps/templates/index.xml:29
+#: cps/templates/index.xml:28
msgid "New Books"
msgstr "Новые"
-#: cps/templates/index.xml:33
+#: cps/templates/index.xml:32
msgid "The latest Books"
msgstr "Последние поступления"
-#: cps/templates/index.xml:40
+#: cps/templates/index.xml:39
msgid "Show Random Books"
msgstr "Показывать случайные книги"
-#: cps/templates/index.xml:57 cps/templates/layout.html:139
+#: cps/templates/index.xml:56 cps/templates/layout.html:139
msgid "Authors"
msgstr "Авторы"
-#: cps/templates/index.xml:61
+#: cps/templates/index.xml:60
msgid "Books ordered by Author"
msgstr "Книги, отсортированные по автору"
-#: cps/templates/index.xml:68
+#: cps/templates/index.xml:67
msgid "Books ordered by category"
msgstr "Книги, отсортированные по категории"
-#: cps/templates/index.xml:75
+#: cps/templates/index.xml:74
msgid "Books ordered by series"
msgstr "Книги, отсортированные по серии"
@@ -1135,8 +1148,8 @@ msgid "No Results for:"
msgstr "Ничего не найдено по запросу:"
#: cps/templates/search.html:7
-msgid "Please try a diffrent Search"
-msgstr "Попробуйте изменить критерии поиска"
+msgid "Please try a different search"
+msgstr "Попробуйте изменить критерии поиск"
#: cps/templates/search.html:9
msgid "Results for:"
diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo
index 20e149cd..6233c124 100644
Binary files a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo and b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po
index 8bf383e5..24e37c82 100644
--- a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po
+++ b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po
@@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
-"POT-Creation-Date: 2017-08-12 18:55+0200\n"
+"POT-Creation-Date: 2017-09-01 20:37+0200\n"
"PO-Revision-Date: 2017-01-06 17:00+0000\n"
"Last-Translator: dalin \n"
"Language: zh_Hans_CN\n"
@@ -26,7 +26,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.4.0\n"
-#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1374
+#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1341
msgid "not installed"
msgstr "未安装"
@@ -70,373 +70,373 @@ msgstr "发送到Kindle"
msgid "Could not find any formats suitable for sending by email"
msgstr "无法找到适合邮件发送的格式"
-#: cps/ub.py:542
+#: cps/ub.py:543
msgid "Guest"
msgstr "游客"
-#: cps/web.py:974
+#: cps/web.py:953
msgid "Requesting update package"
msgstr "正在请求更新包"
-#: cps/web.py:975
+#: cps/web.py:954
msgid "Downloading update package"
msgstr "正在下载更新包"
-#: cps/web.py:976
+#: cps/web.py:955
msgid "Unzipping update package"
msgstr "正在解压更新包"
-#: cps/web.py:977
+#: cps/web.py:956
msgid "Files are replaced"
msgstr "文件已替换"
-#: cps/web.py:978
+#: cps/web.py:957
msgid "Database connections are closed"
msgstr "数据库连接已关闭"
-#: cps/web.py:979
+#: cps/web.py:958
msgid "Server is stopped"
msgstr "服务器已停止"
-#: cps/web.py:980
+#: cps/web.py:959
msgid "Update finished, please press okay and reload page"
msgstr "更新完成,请按确定并刷新页面"
-#: cps/web.py:1054
+#: cps/web.py:1033
msgid "Recently Added Books"
msgstr "最近添加的书籍"
-#: cps/web.py:1063
+#: cps/web.py:1042
msgid "Newest Books"
msgstr "最新书籍"
-#: cps/web.py:1072
+#: cps/web.py:1051
msgid "Oldest Books"
msgstr "最旧书籍"
-#: cps/web.py:1081
+#: cps/web.py:1060
msgid "Books (A-Z)"
msgstr "书籍 (A-Z)"
-#: cps/web.py:1090
+#: cps/web.py:1069
msgid "Books (Z-A)"
msgstr "书籍 (Z-A)"
-#: cps/web.py:1126
+#: cps/web.py:1099
msgid "Hot Books (most downloaded)"
msgstr "热门书籍(最多下载)"
-#: cps/web.py:1136
+#: cps/web.py:1109
msgid "Best rated books"
msgstr "最高评分书籍"
-#: cps/templates/index.xml:36 cps/web.py:1145
+#: cps/templates/index.xml:35 cps/web.py:1118
msgid "Random Books"
msgstr "随机书籍"
-#: cps/web.py:1161
+#: cps/web.py:1127
msgid "Author list"
msgstr "作者列表"
-#: cps/web.py:1181 cps/web.py:1212 cps/web.py:1351 cps/web.py:1835
+#: cps/web.py:1137 cps/web.py:1193 cps/web.py:1318 cps/web.py:1796
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "无法打开电子书。 文件不存在或者文件不可访问:"
-#: cps/templates/index.xml:71 cps/web.py:1198
+#: cps/templates/index.xml:70 cps/web.py:1179
msgid "Series list"
msgstr "丛书列表"
-#: cps/web.py:1210
+#: cps/web.py:1191
#, python-format
msgid "Series: %(serie)s"
msgstr "丛书: %(serie)s"
-#: cps/web.py:1243
+#: cps/web.py:1224
msgid "Available languages"
msgstr "可用语言"
-#: cps/web.py:1258
+#: cps/web.py:1239
#, python-format
msgid "Language: %(name)s"
msgstr "语言: %(name)s"
-#: cps/templates/index.xml:64 cps/web.py:1274
+#: cps/templates/index.xml:63 cps/web.py:1248
msgid "Category list"
msgstr "分类列表"
-#: cps/web.py:1286
+#: cps/web.py:1260
#, python-format
msgid "Category: %(name)s"
msgstr "分类: %(name)s"
-#: cps/web.py:1385
+#: cps/web.py:1352
msgid "Excecution permissions missing"
msgstr "可执行权限缺失"
-#: cps/web.py:1399
+#: cps/web.py:1366
msgid "Statistics"
msgstr "统计"
-#: cps/web.py:1563
+#: cps/web.py:1530
msgid "Server restarted, please reload page"
msgstr "服务器已重启,请刷新页面"
-#: cps/web.py:1565
+#: cps/web.py:1532
msgid "Performing shutdown of server, please close window"
msgstr "正在关闭服务器,请关闭窗口"
-#: cps/web.py:1581
+#: cps/web.py:1548
msgid "Update done"
msgstr "更新完成"
-#: cps/web.py:1662 cps/web.py:1675
+#: cps/web.py:1623 cps/web.py:1636
msgid "search"
msgstr "搜索"
-#: cps/templates/index.xml:43 cps/templates/index.xml:47
-#: cps/templates/layout.html:127 cps/web.py:1751
+#: cps/templates/index.xml:42 cps/templates/index.xml:46
+#: cps/templates/layout.html:127 cps/web.py:1712
msgid "Read Books"
msgstr "已读书籍"
-#: cps/templates/index.xml:50 cps/templates/index.xml:54
-#: cps/templates/layout.html:128 cps/web.py:1754
+#: cps/templates/index.xml:49 cps/templates/index.xml:53
+#: cps/templates/layout.html:128 cps/web.py:1715
msgid "Unread Books"
msgstr "未读书籍"
-#: cps/web.py:1821 cps/web.py:1823 cps/web.py:1825 cps/web.py:1832
+#: cps/web.py:1782 cps/web.py:1784 cps/web.py:1786 cps/web.py:1793
msgid "Read a Book"
msgstr "阅读一本书"
-#: cps/web.py:1888 cps/web.py:2513
+#: cps/web.py:1849 cps/web.py:2474
msgid "Please fill out all fields!"
msgstr "请填写所有字段"
-#: cps/web.py:1889 cps/web.py:1905 cps/web.py:1910 cps/web.py:1912
+#: cps/web.py:1850 cps/web.py:1866 cps/web.py:1871 cps/web.py:1873
msgid "register"
msgstr "注册"
-#: cps/web.py:1904
+#: cps/web.py:1865
msgid "An unknown error occured. Please try again later."
msgstr "发生一个未知错误。请稍后再试。"
-#: cps/web.py:1909
+#: cps/web.py:1870
msgid "This username or email address is already in use."
msgstr "此用户名或邮箱已被使用。"
-#: cps/web.py:1928 cps/web.py:2024
+#: cps/web.py:1889 cps/web.py:1985
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "您现在已以'%(nickname)s'身份登录"
-#: cps/web.py:1933
+#: cps/web.py:1894
msgid "Wrong Username or Password"
msgstr "用户名或密码错误"
-#: cps/web.py:1939 cps/web.py:1960
+#: cps/web.py:1900 cps/web.py:1921
msgid "login"
msgstr "登录"
-#: cps/web.py:1972 cps/web.py:2003
+#: cps/web.py:1933 cps/web.py:1964
msgid "Token not found"
msgstr "找不到Token"
-#: cps/web.py:1980 cps/web.py:2011
+#: cps/web.py:1941 cps/web.py:1972
msgid "Token has expired"
msgstr "Token已过期"
-#: cps/web.py:1988
+#: cps/web.py:1949
msgid "Success! Please return to your device"
msgstr "成功!请返回您的设备"
-#: cps/web.py:2038
+#: cps/web.py:1999
msgid "Please configure the SMTP mail settings first..."
msgstr "请先配置SMTP邮箱..."
-#: cps/web.py:2042
+#: cps/web.py:2003
#, python-format
msgid "Book successfully send to %(kindlemail)s"
msgstr "此书已被成功发给 %(kindlemail)s"
-#: cps/web.py:2046
+#: cps/web.py:2007
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "发送这本书的时候出现错误: %(res)s"
-#: cps/web.py:2048 cps/web.py:2598
+#: cps/web.py:2009 cps/web.py:2559
msgid "Please configure your kindle email address first..."
msgstr "请先配置您的kindle电子邮箱地址..."
-#: cps/web.py:2092
+#: cps/web.py:2053
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "此书已被添加到书架: %(sname)s"
-#: cps/web.py:2127
+#: cps/web.py:2088
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "此书已从书架 %(sname)s 中删除"
-#: cps/web.py:2146 cps/web.py:2170
+#: cps/web.py:2107 cps/web.py:2131
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "已存在书架 '%(title)s'。"
-#: cps/web.py:2151
+#: cps/web.py:2112
#, python-format
msgid "Shelf %(title)s created"
msgstr "书架 %(title)s 已被创建"
-#: cps/web.py:2153 cps/web.py:2181
+#: cps/web.py:2114 cps/web.py:2142
msgid "There was an error"
msgstr "发生错误"
-#: cps/web.py:2154 cps/web.py:2156
+#: cps/web.py:2115 cps/web.py:2117
msgid "create a shelf"
msgstr "创建书架"
-#: cps/web.py:2179
+#: cps/web.py:2140
#, python-format
msgid "Shelf %(title)s changed"
msgstr "书架 %(title)s 已被修改"
-#: cps/web.py:2182 cps/web.py:2184
+#: cps/web.py:2143 cps/web.py:2145
msgid "Edit a shelf"
msgstr "编辑书架"
-#: cps/web.py:2204
+#: cps/web.py:2165
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "成功删除书架 %(name)s"
-#: cps/web.py:2226
+#: cps/web.py:2187
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "书架: '%(name)s'"
-#: cps/web.py:2229
+#: cps/web.py:2190
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr "打开书架出错。书架不存在或不可访问"
-#: cps/web.py:2261
+#: cps/web.py:2222
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "修改书架 '%(name)s' 顺序"
-#: cps/web.py:2326
+#: cps/web.py:2287
msgid "Found an existing account for this email address."
msgstr "找到已使用此邮箱的账号。"
-#: cps/web.py:2328 cps/web.py:2332
+#: cps/web.py:2289 cps/web.py:2293
#, python-format
msgid "%(name)s's profile"
msgstr "%(name)s 的资料"
-#: cps/web.py:2329
+#: cps/web.py:2290
msgid "Profile updated"
msgstr "资料已更新"
-#: cps/web.py:2343
+#: cps/web.py:2304
msgid "Admin page"
msgstr "管理页"
-#: cps/web.py:2467
+#: cps/web.py:2428
msgid "Calibre-web configuration updated"
msgstr "Calibre-web配置已更新"
-#: cps/web.py:2474 cps/web.py:2480 cps/web.py:2494
+#: cps/web.py:2435 cps/web.py:2441 cps/web.py:2455
msgid "Basic Configuration"
msgstr "基本配置"
-#: cps/web.py:2478
+#: cps/web.py:2439
msgid "DB location is not valid, please enter correct path"
msgstr "DB位置无效,请输入正确路径"
-#: cps/templates/admin.html:34 cps/web.py:2515 cps/web.py:2568
+#: cps/templates/admin.html:34 cps/web.py:2476 cps/web.py:2529
msgid "Add new user"
msgstr "添加新用户"
-#: cps/web.py:2560
+#: cps/web.py:2521
#, python-format
msgid "User '%(user)s' created"
msgstr "用户 '%(user)s' 已被创建"
-#: cps/web.py:2564
+#: cps/web.py:2525
msgid "Found an existing account for this email address or nickname."
msgstr "已存在使用此邮箱或昵称的账号。"
-#: cps/web.py:2586
+#: cps/web.py:2547
msgid "Mail settings updated"
msgstr "邮箱设置已更新"
-#: cps/web.py:2593
+#: cps/web.py:2554
#, python-format
msgid "Test E-Mail successfully send to %(kindlemail)s"
msgstr "测试邮件已成功发送到 %(kindlemail)s"
-#: cps/web.py:2596
+#: cps/web.py:2557
#, python-format
msgid "There was an error sending the Test E-Mail: %(res)s"
msgstr "发送测试邮件时发生错误: %(res)s"
-#: cps/web.py:2600
+#: cps/web.py:2561
msgid "E-Mail settings updated"
msgstr "E-Mail 设置已更新"
-#: cps/web.py:2601
+#: cps/web.py:2562
msgid "Edit mail settings"
msgstr "编辑邮箱设置"
-#: cps/web.py:2630
+#: cps/web.py:2591
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "用户 '%(nick)s' 已被删除"
-#: cps/web.py:2728
+#: cps/web.py:2689
#, python-format
msgid "User '%(nick)s' updated"
msgstr "用户 '%(nick)s' 已被更新"
-#: cps/web.py:2731
+#: cps/web.py:2692
msgid "An unknown error occured."
msgstr "发生未知错误。"
-#: cps/web.py:2734
+#: cps/web.py:2695
#, python-format
msgid "Edit User %(nick)s"
msgstr "编辑用户 %(nick)s"
-#: cps/web.py:2756
+#: cps/web.py:2711
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr "打开电子书出错。文件不存在或不可访问"
-#: cps/web.py:2771 cps/web.py:2954 cps/web.py:3078
+#: cps/web.py:2726 cps/web.py:2898 cps/web.py:3041
msgid "edit metadata"
msgstr "编辑元数据"
-#: cps/web.py:2783 cps/web.py:2787
+#: cps/web.py:2738 cps/web.py:2742
msgid "unknown"
msgstr "未知"
-#: cps/web.py:2972
+#: cps/web.py:2935
#, python-format
msgid "File extension \"%s\" is not allowed to be uploaded to this server"
msgstr "不能上传后缀为 \"%s\" 的文件到此服务器"
-#: cps/web.py:2978
+#: cps/web.py:2941
msgid "File to be uploaded must have an extension"
msgstr "要上传的文件必须有一个后缀"
-#: cps/web.py:2997
+#: cps/web.py:2960
#, python-format
msgid "Failed to create path %s (Permission denied)."
msgstr "创建路径 %s 失败(权限拒绝)。"
-#: cps/web.py:3002
+#: cps/web.py:2965
#, python-format
msgid "Failed to store file %s (Permission denied)."
msgstr "存储文件 %s 失败(权限拒绝)。"
-#: cps/web.py:3007
+#: cps/web.py:2970
#, python-format
msgid "Failed to delete file %s (Permission denied)."
msgstr "删除文件 %s 失败(权限拒绝)。"
@@ -607,6 +607,18 @@ msgstr "您确定要关闭 Calibre-web 吗?"
msgid "Updating, please do not reload page"
msgstr "正在更新,请不要刷新页面"
+#: cps/templates/author.html:15
+msgid "via"
+msgstr ""
+
+#: cps/templates/author.html:23
+msgid "In Library"
+msgstr ""
+
+#: cps/templates/author.html:69
+msgid "More by"
+msgstr ""
+
#: cps/templates/book_edit.html:16
msgid "Delete Book"
msgstr "删除书籍"
@@ -615,12 +627,13 @@ msgstr "删除书籍"
msgid "Book Title"
msgstr "书名"
-#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:188
-#: cps/templates/search_form.html:10
+#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:208
+#: cps/templates/book_edit.html:226 cps/templates/search_form.html:10
msgid "Author"
msgstr "作者"
-#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:190
+#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:213
+#: cps/templates/book_edit.html:228
msgid "Description"
msgstr "简介"
@@ -703,35 +716,35 @@ msgstr "搜索关键字"
msgid "Go!"
msgstr "走起!"
-#: cps/templates/book_edit.html:168
+#: cps/templates/book_edit.html:171
msgid "Click the cover to load metadata to the form"
msgstr "点击封面加载元数据到表单"
-#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:185
+#: cps/templates/book_edit.html:183 cps/templates/book_edit.html:223
msgid "Loading..."
msgstr "加载中..."
-#: cps/templates/book_edit.html:175 cps/templates/layout.html:199
+#: cps/templates/book_edit.html:188 cps/templates/layout.html:199
msgid "Close"
msgstr "关闭"
-#: cps/templates/book_edit.html:186
-msgid "Search error!"
-msgstr "搜索错误"
-
-#: cps/templates/book_edit.html:187
-msgid "No Result! Please try anonther keyword."
-msgstr "没有结果!请尝试别的关键字."
-
-#: cps/templates/book_edit.html:189 cps/templates/detail.html:125
-#: cps/templates/search_form.html:14
+#: cps/templates/book_edit.html:210 cps/templates/book_edit.html:227
+#: cps/templates/detail.html:125 cps/templates/search_form.html:14
msgid "Publisher"
msgstr "出版社"
-#: cps/templates/book_edit.html:191
+#: cps/templates/book_edit.html:215 cps/templates/book_edit.html:229
msgid "Source"
msgstr "来源"
+#: cps/templates/book_edit.html:224
+msgid "Search error!"
+msgstr "搜索错误"
+
+#: cps/templates/book_edit.html:225
+msgid "No Result! Please try anonther keyword."
+msgstr "没有结果!请尝试别的关键字."
+
#: cps/templates/config_edit.html:7
msgid "Location of Calibre database"
msgstr "Calibre 数据库位置"
@@ -922,6 +935,11 @@ msgstr "保存设置并发送测试邮件"
msgid "Next"
msgstr "下一个"
+#: cps/templates/feed.xml:29 cps/templates/index.xml:7
+#: cps/templates/layout.html:40 cps/templates/layout.html:41
+msgid "Search"
+msgstr "搜索"
+
#: cps/templates/index.html:5
msgid "Discover (Random Books)"
msgstr "发现(随机书籍)"
@@ -930,52 +948,47 @@ msgstr "发现(随机书籍)"
msgid "Start"
msgstr "开始"
-#: cps/templates/index.xml:7 cps/templates/layout.html:40
-#: cps/templates/layout.html:41
-msgid "Search"
-msgstr "搜索"
-
-#: cps/templates/index.xml:15 cps/templates/layout.html:121
+#: cps/templates/index.xml:14 cps/templates/layout.html:121
msgid "Hot Books"
msgstr "热门书籍"
-#: cps/templates/index.xml:19
+#: cps/templates/index.xml:18
msgid "Popular publications from this catalog based on Downloads."
msgstr "基于下载数的热门书籍"
-#: cps/templates/index.xml:22 cps/templates/layout.html:124
+#: cps/templates/index.xml:21 cps/templates/layout.html:124
msgid "Best rated Books"
msgstr "最高评分书籍"
-#: cps/templates/index.xml:26
+#: cps/templates/index.xml:25
msgid "Popular publications from this catalog based on Rating."
msgstr "基于评分的热门书籍"
-#: cps/templates/index.xml:29
+#: cps/templates/index.xml:28
msgid "New Books"
msgstr "新书"
-#: cps/templates/index.xml:33
+#: cps/templates/index.xml:32
msgid "The latest Books"
msgstr "最新书籍"
-#: cps/templates/index.xml:40
+#: cps/templates/index.xml:39
msgid "Show Random Books"
msgstr "显示随机书籍"
-#: cps/templates/index.xml:57 cps/templates/layout.html:139
+#: cps/templates/index.xml:56 cps/templates/layout.html:139
msgid "Authors"
msgstr "作者"
-#: cps/templates/index.xml:61
+#: cps/templates/index.xml:60
msgid "Books ordered by Author"
msgstr "书籍按作者排序"
-#: cps/templates/index.xml:68
+#: cps/templates/index.xml:67
msgid "Books ordered by category"
msgstr "书籍按分类排序"
-#: cps/templates/index.xml:75
+#: cps/templates/index.xml:74
msgid "Books ordered by series"
msgstr "书籍按丛书排序"
@@ -1135,7 +1148,7 @@ msgid "No Results for:"
msgstr "找不到结果:"
#: cps/templates/search.html:7
-msgid "Please try a diffrent Search"
+msgid "Please try a different search"
msgstr "请尝试别的关键字"
#: cps/templates/search.html:9
diff --git a/cps/web.py b/cps/web.py
index c89abca7..2de55a15 100755
--- a/cps/web.py
+++ b/cps/web.py
@@ -8,11 +8,22 @@ except ImportError:
gdrive_support = False
try:
- from goodreads import client as gr_client
+ from goodreads.client import GoodreadsClient
goodreads_support = True
except ImportError:
goodreads_support = False
+try:
+ import Levenshtein
+ levenshtein_support = True
+except ImportError:
+ levenshtein_support = False
+
+try:
+ from functools import reduce
+except ImportError:
+ pass # We're not using Python 3
+
import mimetypes
import logging
from logging.handlers import RotatingFileHandler
@@ -21,6 +32,7 @@ from flask import (Flask, render_template, request, Response, redirect,
url_for, send_from_directory, make_response, g, flash,
abort, Markup, stream_with_context)
from flask import __version__ as flaskVersion
+import cache_buster
import ub
from ub import config
import helper
@@ -200,6 +212,7 @@ mimetypes.add_type('image/vnd.djvu', '.djvu')
app = (Flask(__name__))
app.wsgi_app = ReverseProxied(app.wsgi_app)
+cache_buster.init_cache_busting(app)
gevent_server = None
@@ -499,24 +512,29 @@ def edit_required(f):
return inner
-# Fill indexpage with all requested data from database
-def fill_indexpage(page, database, db_filter, order):
+# Language and content filters
+def common_filters():
if current_user.filter_language() != "all":
lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
else:
- lang_filter = True
+ lang_filter = true()
content_rating_filter = false() if current_user.mature_content else \
db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
+ return and_(lang_filter, ~content_rating_filter)
+
+
+# Fill indexpage with all requested data from database
+def fill_indexpage(page, database, db_filter, order):
if current_user.show_detail_random():
- random = db.session.query(db.Books).filter(lang_filter).filter(~content_rating_filter)\
+ random = db.session.query(db.Books).filter(common_filters())\
.order_by(func.random()).limit(config.config_random_books)
else:
random = false
off = int(int(config.config_books_per_page) * (page - 1))
pagination = Pagination(page, config.config_books_per_page,
len(db.session.query(database)
- .filter(db_filter).filter(lang_filter).filter(~content_rating_filter).all()))
- entries = db.session.query(database).filter(db_filter).filter(lang_filter).filter(~content_rating_filter)\
+ .filter(db_filter).filter(common_filters()).all()))
+ entries = db.session.query(database).filter(db_filter).filter(common_filters())\
.order_by(order).offset(off).limit(config.config_books_per_page)
return entries, random, pagination
@@ -638,19 +656,13 @@ def feed_normal_search():
def feed_search(term):
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
if term:
entries = db.session.query(db.Books).filter(db.or_(db.Books.tags.any(db.Tags.name.like("%" + term + "%")),
db.Books.series.any(db.Series.name.like("%" + term + "%")),
db.Books.authors.any(db.Authors.name.like("%" + term + "%")),
db.Books.publishers.any(db.Publishers.name.like("%" + term + "%")),
db.Books.title.like("%" + term + "%")))\
- .filter(lang_filter).filter(~content_rating_filter).all()
+ .filter(common_filters()).all()
entriescount = len(entries) if len(entries) > 0 else 1
pagination = Pagination(1, entriescount, entriescount)
xml = render_title_template('feed.xml', searchterm=term, entries=entries, pagination=pagination)
@@ -678,13 +690,7 @@ def feed_new():
@app.route("/opds/discover")
@requires_basic_auth_if_no_ano
def feed_discover():
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
- entries = db.session.query(db.Books).filter(lang_filter).filter(~content_rating_filter).order_by(func.random())\
+ entries = db.session.query(db.Books).filter(common_filters()).order_by(func.random())\
.limit(config.config_books_per_page)
pagination = Pagination(1, config.config_books_per_page, int(config.config_books_per_page))
xml = render_title_template('feed.xml', entries=entries, pagination=pagination)
@@ -713,12 +719,6 @@ def feed_hot():
off = request.args.get("offset")
if not off:
off = 0
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
all_books = ub.session.query(ub.Downloads, ub.func.count(ub.Downloads.book_id)).order_by(
ub.func.count(ub.Downloads.book_id).desc()).group_by(ub.Downloads.book_id)
hot_books = all_books.offset(off).limit(config.config_books_per_page)
@@ -727,8 +727,8 @@ def feed_hot():
downloadBook = db.session.query(db.Books).filter(db.Books.id == book.Downloads.book_id).first()
if downloadBook:
entries.append(
- db.session.query(db.Books).filter(lang_filter).filter(~content_rating_filter)
- .filter(db.Books.id == book.Downloads.book_id).first()
+ db.session.query(db.Books).filter(common_filters())
+ .filter(db.Books.id == book.Downloads.book_id).first()
)
else:
ub.session.query(ub.Downloads).filter(book.Downloads.book_id == ub.Downloads.book_id).delete()
@@ -747,14 +747,7 @@ def feed_authorindex():
off = request.args.get("offset")
if not off:
off = 0
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
- entries = db.session.query(db.Authors).join(db.books_authors_link).join(db.Books)\
- .filter(lang_filter).filter(~content_rating_filter)\
+ entries = db.session.query(db.Authors).join(db.books_authors_link).join(db.Books).filter(common_filters())\
.group_by('books_authors_link.author').order_by(db.Authors.sort).limit(config.config_books_per_page).offset(off)
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
len(db.session.query(db.Authors).all()))
@@ -784,14 +777,7 @@ def feed_categoryindex():
off = request.args.get("offset")
if not off:
off = 0
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
- entries = db.session.query(db.Tags).join(db.books_tags_link).join(db.Books)\
- .filter(lang_filter).filter(~content_rating_filter)\
+ entries = db.session.query(db.Tags).join(db.books_tags_link).join(db.Books).filter(common_filters())\
.group_by('books_tags_link.tag').order_by(db.Tags.name).offset(off).limit(config.config_books_per_page)
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
len(db.session.query(db.Tags).all()))
@@ -821,14 +807,7 @@ def feed_seriesindex():
off = request.args.get("offset")
if not off:
off = 0
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
- entries = db.session.query(db.Series).join(db.books_series_link).join(db.Books)\
- .filter(lang_filter).filter(~content_rating_filter)\
+ entries = db.session.query(db.Series).join(db.books_series_link).join(db.Books).filter(common_filters())\
.group_by('books_series_link.series').order_by(db.Series.sort).offset(off).all()
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
len(db.session.query(db.Series).all()))
@@ -1094,14 +1073,8 @@ def titles_descending(page):
@app.route('/hot/page/')
@login_required_if_no_ano
def hot_books(page):
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
if current_user.show_detail_random():
- random = db.session.query(db.Books).filter(lang_filter).filter(~content_rating_filter)\
+ random = db.session.query(db.Books).filter(common_filters())\
.order_by(func.random()).limit(config.config_random_books)
else:
random = false
@@ -1111,12 +1084,9 @@ def hot_books(page):
hot_books = all_books.offset(off).limit(config.config_books_per_page)
entries = list()
for book in hot_books:
- downloadBook = db.session.query(db.Books).filter(db.Books.id == book.Downloads.book_id).first()
+ downloadBook = db.session.query(db.Books).filter(common_filters()).filter(db.Books.id == book.Downloads.book_id).first()
if downloadBook:
- entries.append(
- db.session.query(db.Books).filter(lang_filter).filter(~content_rating_filter)
- .filter(db.Books.id == book.Downloads.book_id).first()
- )
+ entries.append(downloadBook)
else:
ub.session.query(ub.Downloads).filter(book.Downloads.book_id == ub.Downloads.book_id).delete()
ub.session.commit()
@@ -1148,15 +1118,8 @@ def discover(page):
@app.route("/author")
@login_required_if_no_ano
def author_list():
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
entries = db.session.query(db.Authors, func.count('books_authors_link.book').label('count'))\
- .join(db.books_authors_link).join(db.Books)\
- .filter(lang_filter).filter(~content_rating_filter)\
+ .join(db.books_authors_link).join(db.Books).filter(common_filters())\
.group_by('books_authors_link.author').order_by(db.Authors.sort).all()
return render_title_template('list.html', entries=entries, folder='author', title=_(u"Author list"))
@@ -1167,33 +1130,48 @@ def author_list():
def author(book_id, page):
entries, random, pagination = fill_indexpage(page, db.Books, db.Books.authors.any(db.Authors.id == book_id),
db.Books.timestamp.desc())
- if entries:
- name = db.session.query(db.Authors).filter(db.Authors.id == book_id).first().name
-
- author_info = None
- if goodreads_support and config.config_use_goodreads:
- gc = gr_client.GoodreadsClient(config.config_goodreads_api_key, config.config_goodreads_api_secret)
- author_info = gc.find_author(author_name=name)
-
- return render_title_template('author.html', entries=entries, pagination=pagination,
- title=name, author=author_info)
- else:
+ if entries is None:
flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error")
return redirect(url_for("index"))
+ name = db.session.query(db.Authors).filter(db.Authors.id == book_id).first().name
+
+ author_info = None
+ other_books = []
+ if goodreads_support and config.config_use_goodreads:
+ gc = GoodreadsClient(config.config_goodreads_api_key, config.config_goodreads_api_secret)
+ author_info = gc.find_author(author_name=name)
+ other_books = get_unique_other_books(entries.all(), author_info.books)
+
+ return render_title_template('author.html', entries=entries, pagination=pagination,
+ title=name, author=author_info, other_books=other_books)
+
+
+def get_unique_other_books(library_books, author_books):
+ # Get all identifiers (ISBN, Goodreads, etc) and filter author's books by that list so we show fewer duplicates
+ # Note: Not all images will be shown, even though they're available on Goodreads.com.
+ # See https://www.goodreads.com/topic/show/18213769-goodreads-book-images
+ identifiers = reduce(lambda acc, book: acc + map(lambda identifier: identifier.val, book.identifiers), library_books, [])
+ other_books = filter(lambda book: book.isbn not in identifiers and book.gid["#text"] not in identifiers, author_books)
+
+ # Fuzzy match book titles
+ if levenshtein_support:
+ library_titles = reduce(lambda acc, book: acc + [book.title], library_books, [])
+ other_books = filter(lambda author_book: not filter(
+ lambda library_book:
+ Levenshtein.ratio(re.sub(r"\(.*\)", "", author_book.title), library_book) > 0.7, # Remove items in parentheses before comparing
+ library_titles
+ ), other_books)
+
+ return other_books
+
+
@app.route("/series")
@login_required_if_no_ano
def series_list():
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
entries = db.session.query(db.Series, func.count('books_series_link.book').label('count'))\
- .join(db.books_series_link).join(db.Books)\
- .filter(lang_filter).filter(~content_rating_filter)\
+ .join(db.books_series_link).join(db.Books).filter(common_filters())\
.group_by('books_series_link.series').order_by(db.Series.sort).all()
return render_title_template('list.html', entries=entries, folder='series', title=_(u"Series list"))
@@ -1261,15 +1239,8 @@ def language(name, page):
@app.route("/category")
@login_required_if_no_ano
def category_list():
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
entries = db.session.query(db.Tags, func.count('books_tags_link.book').label('count'))\
- .join(db.books_tags_link).join(db.Books)\
- .filter(lang_filter).filter(~content_rating_filter)\
+ .join(db.books_tags_link).join(db.Books).filter(common_filters())\
.group_by('books_tags_link.tag').all()
return render_title_template('list.html', entries=entries, folder='category', title=_(u"Category list"))
@@ -1307,14 +1278,7 @@ def toggle_read(book_id):
@app.route("/book/")
@login_required_if_no_ano
def show_book(book_id):
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
- entries = db.session.query(db.Books)\
- .filter(db.Books.id == book_id).filter(lang_filter).filter(~content_rating_filter).first()
+ entries = db.session.query(db.Books).filter(db.Books.id == book_id).filter(common_filters()).first()
if entries:
for index in range(0, len(entries.languages)):
try:
@@ -1587,18 +1551,12 @@ def update():
def search():
term = request.args.get("query").strip()
if term:
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
entries = db.session.query(db.Books).filter(db.or_(db.Books.tags.any(db.Tags.name.like("%" + term + "%")),
db.Books.series.any(db.Series.name.like("%" + term + "%")),
db.Books.authors.any(db.Authors.name.like("%" + term + "%")),
db.Books.publishers.any(db.Publishers.name.like("%" + term + "%")),
db.Books.title.like("%" + term + "%")))\
- .filter(lang_filter).filter(~content_rating_filter).all()
+ .filter(common_filters()).all()
return render_title_template('search.html', searchterm=term, entries=entries)
else:
return render_title_template('search.html', searchterm="")
@@ -2741,14 +2699,8 @@ def edit_book(book_id):
# create the function for sorting...
db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort)
cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all()
- if current_user.filter_language() != "all":
- lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())
- else:
- lang_filter = True
- content_rating_filter = false() if current_user.mature_content else \
- db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
book = db.session.query(db.Books)\
- .filter(db.Books.id == book_id).filter(lang_filter).filter(~content_rating_filter).first()
+ .filter(db.Books.id == book_id).filter(common_filters()).first()
author_names = []
# Book not found
@@ -2992,8 +2944,8 @@ def upload():
tags = meta.tags
series = meta.series
series_index = meta.series_id
- title_dir = helper.get_valid_filename(title, False)
- author_dir = helper.get_valid_filename(author, False)
+ title_dir = helper.get_valid_filename(title)
+ author_dir = helper.get_valid_filename(author)
data_name = title_dir
filepath = config.config_calibre_dir + os.sep + author_dir + os.sep + title_dir
saved_filename = filepath + os.sep + data_name + meta.extension.lower()
diff --git a/messages.pot b/messages.pot
index 5c9be15f..2422dafc 100644
--- a/messages.pot
+++ b/messages.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-08-12 18:55+0200\n"
+"POT-Creation-Date: 2017-09-01 20:37+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.4.0\n"
-#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1374
+#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1341
msgid "not installed"
msgstr ""
@@ -61,373 +61,373 @@ msgstr ""
msgid "Could not find any formats suitable for sending by email"
msgstr ""
-#: cps/ub.py:542
+#: cps/ub.py:543
msgid "Guest"
msgstr ""
-#: cps/web.py:974
+#: cps/web.py:953
msgid "Requesting update package"
msgstr ""
-#: cps/web.py:975
+#: cps/web.py:954
msgid "Downloading update package"
msgstr ""
-#: cps/web.py:976
+#: cps/web.py:955
msgid "Unzipping update package"
msgstr ""
-#: cps/web.py:977
+#: cps/web.py:956
msgid "Files are replaced"
msgstr ""
-#: cps/web.py:978
+#: cps/web.py:957
msgid "Database connections are closed"
msgstr ""
-#: cps/web.py:979
+#: cps/web.py:958
msgid "Server is stopped"
msgstr ""
-#: cps/web.py:980
+#: cps/web.py:959
msgid "Update finished, please press okay and reload page"
msgstr ""
-#: cps/web.py:1054
+#: cps/web.py:1033
msgid "Recently Added Books"
msgstr ""
-#: cps/web.py:1063
+#: cps/web.py:1042
msgid "Newest Books"
msgstr ""
-#: cps/web.py:1072
+#: cps/web.py:1051
msgid "Oldest Books"
msgstr ""
-#: cps/web.py:1081
+#: cps/web.py:1060
msgid "Books (A-Z)"
msgstr ""
-#: cps/web.py:1090
+#: cps/web.py:1069
msgid "Books (Z-A)"
msgstr ""
-#: cps/web.py:1126
+#: cps/web.py:1099
msgid "Hot Books (most downloaded)"
msgstr ""
-#: cps/web.py:1136
+#: cps/web.py:1109
msgid "Best rated books"
msgstr ""
-#: cps/templates/index.xml:36 cps/web.py:1145
+#: cps/templates/index.xml:35 cps/web.py:1118
msgid "Random Books"
msgstr ""
-#: cps/web.py:1161
+#: cps/web.py:1127
msgid "Author list"
msgstr ""
-#: cps/web.py:1181 cps/web.py:1212 cps/web.py:1351 cps/web.py:1835
+#: cps/web.py:1137 cps/web.py:1193 cps/web.py:1318 cps/web.py:1796
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr ""
-#: cps/templates/index.xml:71 cps/web.py:1198
+#: cps/templates/index.xml:70 cps/web.py:1179
msgid "Series list"
msgstr ""
-#: cps/web.py:1210
+#: cps/web.py:1191
#, python-format
msgid "Series: %(serie)s"
msgstr ""
-#: cps/web.py:1243
+#: cps/web.py:1224
msgid "Available languages"
msgstr ""
-#: cps/web.py:1258
+#: cps/web.py:1239
#, python-format
msgid "Language: %(name)s"
msgstr ""
-#: cps/templates/index.xml:64 cps/web.py:1274
+#: cps/templates/index.xml:63 cps/web.py:1248
msgid "Category list"
msgstr ""
-#: cps/web.py:1286
+#: cps/web.py:1260
#, python-format
msgid "Category: %(name)s"
msgstr ""
-#: cps/web.py:1385
+#: cps/web.py:1352
msgid "Excecution permissions missing"
msgstr ""
-#: cps/web.py:1399
+#: cps/web.py:1366
msgid "Statistics"
msgstr ""
-#: cps/web.py:1563
+#: cps/web.py:1530
msgid "Server restarted, please reload page"
msgstr ""
-#: cps/web.py:1565
+#: cps/web.py:1532
msgid "Performing shutdown of server, please close window"
msgstr ""
-#: cps/web.py:1581
+#: cps/web.py:1548
msgid "Update done"
msgstr ""
-#: cps/web.py:1662 cps/web.py:1675
+#: cps/web.py:1623 cps/web.py:1636
msgid "search"
msgstr ""
-#: cps/templates/index.xml:43 cps/templates/index.xml:47
-#: cps/templates/layout.html:127 cps/web.py:1751
+#: cps/templates/index.xml:42 cps/templates/index.xml:46
+#: cps/templates/layout.html:127 cps/web.py:1712
msgid "Read Books"
msgstr ""
-#: cps/templates/index.xml:50 cps/templates/index.xml:54
-#: cps/templates/layout.html:128 cps/web.py:1754
+#: cps/templates/index.xml:49 cps/templates/index.xml:53
+#: cps/templates/layout.html:128 cps/web.py:1715
msgid "Unread Books"
msgstr ""
-#: cps/web.py:1821 cps/web.py:1823 cps/web.py:1825 cps/web.py:1832
+#: cps/web.py:1782 cps/web.py:1784 cps/web.py:1786 cps/web.py:1793
msgid "Read a Book"
msgstr ""
-#: cps/web.py:1888 cps/web.py:2513
+#: cps/web.py:1849 cps/web.py:2474
msgid "Please fill out all fields!"
msgstr ""
-#: cps/web.py:1889 cps/web.py:1905 cps/web.py:1910 cps/web.py:1912
+#: cps/web.py:1850 cps/web.py:1866 cps/web.py:1871 cps/web.py:1873
msgid "register"
msgstr ""
-#: cps/web.py:1904
+#: cps/web.py:1865
msgid "An unknown error occured. Please try again later."
msgstr ""
-#: cps/web.py:1909
+#: cps/web.py:1870
msgid "This username or email address is already in use."
msgstr ""
-#: cps/web.py:1928 cps/web.py:2024
+#: cps/web.py:1889 cps/web.py:1985
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr ""
-#: cps/web.py:1933
+#: cps/web.py:1894
msgid "Wrong Username or Password"
msgstr ""
-#: cps/web.py:1939 cps/web.py:1960
+#: cps/web.py:1900 cps/web.py:1921
msgid "login"
msgstr ""
-#: cps/web.py:1972 cps/web.py:2003
+#: cps/web.py:1933 cps/web.py:1964
msgid "Token not found"
msgstr ""
-#: cps/web.py:1980 cps/web.py:2011
+#: cps/web.py:1941 cps/web.py:1972
msgid "Token has expired"
msgstr ""
-#: cps/web.py:1988
+#: cps/web.py:1949
msgid "Success! Please return to your device"
msgstr ""
-#: cps/web.py:2038
+#: cps/web.py:1999
msgid "Please configure the SMTP mail settings first..."
msgstr ""
-#: cps/web.py:2042
+#: cps/web.py:2003
#, python-format
msgid "Book successfully send to %(kindlemail)s"
msgstr ""
-#: cps/web.py:2046
+#: cps/web.py:2007
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr ""
-#: cps/web.py:2048 cps/web.py:2598
+#: cps/web.py:2009 cps/web.py:2559
msgid "Please configure your kindle email address first..."
msgstr ""
-#: cps/web.py:2092
+#: cps/web.py:2053
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2127
+#: cps/web.py:2088
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2146 cps/web.py:2170
+#: cps/web.py:2107 cps/web.py:2131
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr ""
-#: cps/web.py:2151
+#: cps/web.py:2112
#, python-format
msgid "Shelf %(title)s created"
msgstr ""
-#: cps/web.py:2153 cps/web.py:2181
+#: cps/web.py:2114 cps/web.py:2142
msgid "There was an error"
msgstr ""
-#: cps/web.py:2154 cps/web.py:2156
+#: cps/web.py:2115 cps/web.py:2117
msgid "create a shelf"
msgstr ""
-#: cps/web.py:2179
+#: cps/web.py:2140
#, python-format
msgid "Shelf %(title)s changed"
msgstr ""
-#: cps/web.py:2182 cps/web.py:2184
+#: cps/web.py:2143 cps/web.py:2145
msgid "Edit a shelf"
msgstr ""
-#: cps/web.py:2204
+#: cps/web.py:2165
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr ""
-#: cps/web.py:2226
+#: cps/web.py:2187
#, python-format
msgid "Shelf: '%(name)s'"
msgstr ""
-#: cps/web.py:2229
+#: cps/web.py:2190
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr ""
-#: cps/web.py:2261
+#: cps/web.py:2222
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr ""
-#: cps/web.py:2326
+#: cps/web.py:2287
msgid "Found an existing account for this email address."
msgstr ""
-#: cps/web.py:2328 cps/web.py:2332
+#: cps/web.py:2289 cps/web.py:2293
#, python-format
msgid "%(name)s's profile"
msgstr ""
-#: cps/web.py:2329
+#: cps/web.py:2290
msgid "Profile updated"
msgstr ""
-#: cps/web.py:2343
+#: cps/web.py:2304
msgid "Admin page"
msgstr ""
-#: cps/web.py:2467
+#: cps/web.py:2428
msgid "Calibre-web configuration updated"
msgstr ""
-#: cps/web.py:2474 cps/web.py:2480 cps/web.py:2494
+#: cps/web.py:2435 cps/web.py:2441 cps/web.py:2455
msgid "Basic Configuration"
msgstr ""
-#: cps/web.py:2478
+#: cps/web.py:2439
msgid "DB location is not valid, please enter correct path"
msgstr ""
-#: cps/templates/admin.html:34 cps/web.py:2515 cps/web.py:2568
+#: cps/templates/admin.html:34 cps/web.py:2476 cps/web.py:2529
msgid "Add new user"
msgstr ""
-#: cps/web.py:2560
+#: cps/web.py:2521
#, python-format
msgid "User '%(user)s' created"
msgstr ""
-#: cps/web.py:2564
+#: cps/web.py:2525
msgid "Found an existing account for this email address or nickname."
msgstr ""
-#: cps/web.py:2586
+#: cps/web.py:2547
msgid "Mail settings updated"
msgstr ""
-#: cps/web.py:2593
+#: cps/web.py:2554
#, python-format
msgid "Test E-Mail successfully send to %(kindlemail)s"
msgstr ""
-#: cps/web.py:2596
+#: cps/web.py:2557
#, python-format
msgid "There was an error sending the Test E-Mail: %(res)s"
msgstr ""
-#: cps/web.py:2600
+#: cps/web.py:2561
msgid "E-Mail settings updated"
msgstr ""
-#: cps/web.py:2601
+#: cps/web.py:2562
msgid "Edit mail settings"
msgstr ""
-#: cps/web.py:2630
+#: cps/web.py:2591
#, python-format
msgid "User '%(nick)s' deleted"
msgstr ""
-#: cps/web.py:2728
+#: cps/web.py:2689
#, python-format
msgid "User '%(nick)s' updated"
msgstr ""
-#: cps/web.py:2731
+#: cps/web.py:2692
msgid "An unknown error occured."
msgstr ""
-#: cps/web.py:2734
+#: cps/web.py:2695
#, python-format
msgid "Edit User %(nick)s"
msgstr ""
-#: cps/web.py:2756
+#: cps/web.py:2711
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr ""
-#: cps/web.py:2771 cps/web.py:2954 cps/web.py:3078
+#: cps/web.py:2726 cps/web.py:2898 cps/web.py:3041
msgid "edit metadata"
msgstr ""
-#: cps/web.py:2783 cps/web.py:2787
+#: cps/web.py:2738 cps/web.py:2742
msgid "unknown"
msgstr ""
-#: cps/web.py:2972
+#: cps/web.py:2935
#, python-format
msgid "File extension \"%s\" is not allowed to be uploaded to this server"
msgstr ""
-#: cps/web.py:2978
+#: cps/web.py:2941
msgid "File to be uploaded must have an extension"
msgstr ""
-#: cps/web.py:2997
+#: cps/web.py:2960
#, python-format
msgid "Failed to create path %s (Permission denied)."
msgstr ""
-#: cps/web.py:3002
+#: cps/web.py:2965
#, python-format
msgid "Failed to store file %s (Permission denied)."
msgstr ""
-#: cps/web.py:3007
+#: cps/web.py:2970
#, python-format
msgid "Failed to delete file %s (Permission denied)."
msgstr ""
@@ -598,6 +598,18 @@ msgstr ""
msgid "Updating, please do not reload page"
msgstr ""
+#: cps/templates/author.html:15
+msgid "via"
+msgstr ""
+
+#: cps/templates/author.html:23
+msgid "In Library"
+msgstr ""
+
+#: cps/templates/author.html:69
+msgid "More by"
+msgstr ""
+
#: cps/templates/book_edit.html:16
msgid "Delete Book"
msgstr ""
@@ -606,12 +618,13 @@ msgstr ""
msgid "Book Title"
msgstr ""
-#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:188
-#: cps/templates/search_form.html:10
+#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:208
+#: cps/templates/book_edit.html:226 cps/templates/search_form.html:10
msgid "Author"
msgstr ""
-#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:190
+#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:213
+#: cps/templates/book_edit.html:228
msgid "Description"
msgstr ""
@@ -694,35 +707,35 @@ msgstr ""
msgid "Go!"
msgstr ""
-#: cps/templates/book_edit.html:168
+#: cps/templates/book_edit.html:171
msgid "Click the cover to load metadata to the form"
msgstr ""
-#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:185
+#: cps/templates/book_edit.html:183 cps/templates/book_edit.html:223
msgid "Loading..."
msgstr ""
-#: cps/templates/book_edit.html:175 cps/templates/layout.html:199
+#: cps/templates/book_edit.html:188 cps/templates/layout.html:199
msgid "Close"
msgstr ""
-#: cps/templates/book_edit.html:186
-msgid "Search error!"
-msgstr ""
-
-#: cps/templates/book_edit.html:187
-msgid "No Result! Please try anonther keyword."
-msgstr ""
-
-#: cps/templates/book_edit.html:189 cps/templates/detail.html:125
-#: cps/templates/search_form.html:14
+#: cps/templates/book_edit.html:210 cps/templates/book_edit.html:227
+#: cps/templates/detail.html:125 cps/templates/search_form.html:14
msgid "Publisher"
msgstr ""
-#: cps/templates/book_edit.html:191
+#: cps/templates/book_edit.html:215 cps/templates/book_edit.html:229
msgid "Source"
msgstr ""
+#: cps/templates/book_edit.html:224
+msgid "Search error!"
+msgstr ""
+
+#: cps/templates/book_edit.html:225
+msgid "No Result! Please try anonther keyword."
+msgstr ""
+
#: cps/templates/config_edit.html:7
msgid "Location of Calibre database"
msgstr ""
@@ -913,6 +926,11 @@ msgstr ""
msgid "Next"
msgstr ""
+#: cps/templates/feed.xml:29 cps/templates/index.xml:7
+#: cps/templates/layout.html:40 cps/templates/layout.html:41
+msgid "Search"
+msgstr ""
+
#: cps/templates/index.html:5
msgid "Discover (Random Books)"
msgstr ""
@@ -921,52 +939,47 @@ msgstr ""
msgid "Start"
msgstr ""
-#: cps/templates/index.xml:7 cps/templates/layout.html:40
-#: cps/templates/layout.html:41
-msgid "Search"
-msgstr ""
-
-#: cps/templates/index.xml:15 cps/templates/layout.html:121
+#: cps/templates/index.xml:14 cps/templates/layout.html:121
msgid "Hot Books"
msgstr ""
-#: cps/templates/index.xml:19
+#: cps/templates/index.xml:18
msgid "Popular publications from this catalog based on Downloads."
msgstr ""
-#: cps/templates/index.xml:22 cps/templates/layout.html:124
+#: cps/templates/index.xml:21 cps/templates/layout.html:124
msgid "Best rated Books"
msgstr ""
-#: cps/templates/index.xml:26
+#: cps/templates/index.xml:25
msgid "Popular publications from this catalog based on Rating."
msgstr ""
-#: cps/templates/index.xml:29
+#: cps/templates/index.xml:28
msgid "New Books"
msgstr ""
-#: cps/templates/index.xml:33
+#: cps/templates/index.xml:32
msgid "The latest Books"
msgstr ""
-#: cps/templates/index.xml:40
+#: cps/templates/index.xml:39
msgid "Show Random Books"
msgstr ""
-#: cps/templates/index.xml:57 cps/templates/layout.html:139
+#: cps/templates/index.xml:56 cps/templates/layout.html:139
msgid "Authors"
msgstr ""
-#: cps/templates/index.xml:61
+#: cps/templates/index.xml:60
msgid "Books ordered by Author"
msgstr ""
-#: cps/templates/index.xml:68
+#: cps/templates/index.xml:67
msgid "Books ordered by category"
msgstr ""
-#: cps/templates/index.xml:75
+#: cps/templates/index.xml:74
msgid "Books ordered by series"
msgstr ""
@@ -1126,7 +1139,7 @@ msgid "No Results for:"
msgstr ""
#: cps/templates/search.html:7
-msgid "Please try a diffrent Search"
+msgid "Please try a different search"
msgstr ""
#: cps/templates/search.html:9
diff --git a/optional-requirements.txt b/optional-requirements.txt
index 5e4c4414..cf743dbb 100644
--- a/optional-requirements.txt
+++ b/optional-requirements.txt
@@ -11,4 +11,5 @@ PyYAML==3.12
rsa==3.4.2
six==1.10.0
uritemplate==3.0.0
-goodreads==0.3.2
\ No newline at end of file
+goodreads>=0.3.2
+python-Levenshtein>=0.12.0
diff --git a/readme.md b/readme.md
index 42ad54e9..108911d3 100755
--- a/readme.md
+++ b/readme.md
@@ -30,7 +30,7 @@ Calibre Web is a web app providing a clean interface for browsing, reading and d
## Quick start
-1. Install required dependencies by executing `pip install -r requirements.txt`
+1. Install dependencies by running `pip install --target vendor -r requirements.txt`.
2. Execute the command: `python cps.py` (or `nohup python cps.py` - recommended if you want to exit the terminal window)
3. Point your browser to `http://localhost:8083` or `http://localhost:8083/opds` for the OPDS catalog
4. Set `Location of Calibre database` to the path of the folder where your Calibre library (metadata.db) lives, push "submit" button
@@ -70,7 +70,7 @@ Optionally, to enable on-the-fly conversion from EPUB to MOBI when using the sen
## Using Google Drive integration
-Additional optional dependencys are necessary to get this work. Please install all optional requirements by executing `pip install -r optional-requirements.txt`
+Additional optional dependencys are necessary to get this work. Please install all optional requirements by executing `pip install --target vendor -r optional-requirements.txt`
To use google drive integration, you have to use the google developer console to create a new app. https://console.developers.google.com
diff --git a/vendor/.gitempty b/vendor/.gitempty
deleted file mode 100644
index e69de29b..00000000