\n"
"Language: pl\n"
"Language-Team: \n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && "
-"(n%100<10 || n%100>=20) ? 1 : 2)\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -120,709 +115,750 @@ msgstr ""
msgid "Unrar binary file not found"
msgstr ""
-#: cps/web.py:1114
+#: cps/web.py:1112 cps/web.py:2778
+msgid "Unknown"
+msgstr ""
+
+#: cps/web.py:1121 cps/web.py:1152
+msgid "HTTP Error"
+msgstr ""
+
+#: cps/web.py:1123 cps/web.py:1154
+msgid "Connection error"
+msgstr ""
+
+#: cps/web.py:1125 cps/web.py:1156
+msgid "Timeout while establishing connection"
+msgstr ""
+
+#: cps/web.py:1127 cps/web.py:1158
+msgid "General error"
+msgstr ""
+
+#: cps/web.py:1133
+msgid "Unexpected data while reading update information"
+msgstr ""
+
+#: cps/web.py:1140
+msgid "No update available. You already have the latest version installed"
+msgstr ""
+
+#: cps/web.py:1165
+msgid "A new update is available. Click on the button below to update to the latest version."
+msgstr ""
+
+#: cps/web.py:1215
+msgid "Could not fetch update information"
+msgstr ""
+
+#: cps/web.py:1230
msgid "Requesting update package"
msgstr "Żądanie o pakiet aktualizacji"
-#: cps/web.py:1115
+#: cps/web.py:1231
msgid "Downloading update package"
msgstr "Pobieranie pakietu aktualizacji"
-#: cps/web.py:1116
+#: cps/web.py:1232
msgid "Unzipping update package"
msgstr "Rozpakowywanie pakietu aktualizacji"
-#: cps/web.py:1117
+#: cps/web.py:1233
msgid "Files are replaced"
msgstr "Pliki zostały zastąpione"
-#: cps/web.py:1118
+#: cps/web.py:1234
msgid "Database connections are closed"
msgstr "Połączenia z bazą danych zostały zakończone"
-#: cps/web.py:1119
+#: cps/web.py:1235
msgid "Server is stopped"
msgstr "Serwer jest zatrzymany"
-#: cps/web.py:1120
+#: cps/web.py:1236
msgid "Update finished, please press okay and reload page"
msgstr "Aktualizacja zakończona, proszę nacisnąć OK i odświeżyć stronę"
-#: cps/web.py:1140
+#: cps/web.py:1256
msgid "Recently Added Books"
msgstr ""
-#: cps/web.py:1150
+#: cps/web.py:1266
msgid "Newest Books"
msgstr ""
-#: cps/web.py:1162
+#: cps/web.py:1278
msgid "Oldest Books"
msgstr ""
-#: cps/web.py:1174
+#: cps/web.py:1290
msgid "Books (A-Z)"
msgstr ""
-#: cps/web.py:1185
+#: cps/web.py:1301
msgid "Books (Z-A)"
msgstr ""
-#: cps/web.py:1214
+#: cps/web.py:1330
msgid "Hot Books (most downloaded)"
msgstr "Najpopularniejsze książki (najczęściej pobierane)"
-#: cps/web.py:1227
+#: cps/web.py:1343
msgid "Best rated books"
msgstr "Najlepiej oceniane książki"
-#: cps/templates/index.xml:36 cps/web.py:1239
+#: cps/templates/index.xml:36 cps/web.py:1355
msgid "Random Books"
msgstr "Losowe książki"
-#: cps/web.py:1254
+#: cps/web.py:1370
msgid "Author list"
msgstr "Lista autorów"
-#: cps/web.py:1266 cps/web.py:1329 cps/web.py:1484 cps/web.py:2036
+#: cps/web.py:1382 cps/web.py:1445 cps/web.py:1600 cps/web.py:2152
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:73 cps/web.py:1313
+#: cps/templates/index.xml:73 cps/web.py:1429
msgid "Series list"
msgstr "Lista serii"
-#: cps/web.py:1327
+#: cps/web.py:1443
#, python-format
msgid "Series: %(serie)s"
msgstr "Seria: %(serie)s"
-#: cps/web.py:1354
+#: cps/web.py:1470
msgid "Available languages"
msgstr "Dostępne języki"
-#: cps/web.py:1371
+#: cps/web.py:1487
#, python-format
msgid "Language: %(name)s"
msgstr "Język: %(name)s"
-#: cps/templates/index.xml:66 cps/web.py:1382
+#: cps/templates/index.xml:66 cps/web.py:1498
msgid "Category list"
msgstr "Lista kategorii"
-#: cps/web.py:1396
+#: cps/web.py:1512
#, python-format
msgid "Category: %(name)s"
msgstr "Kategoria: %(name)s"
-#: cps/templates/layout.html:71 cps/web.py:1535
+#: cps/templates/layout.html:71 cps/web.py:1651
msgid "Tasks"
msgstr ""
-#: cps/web.py:1565
+#: cps/web.py:1681
msgid "Statistics"
msgstr "Statystyki"
-#: cps/web.py:1670
-msgid ""
-"Callback domain is not verified, please follow steps to verify domain in "
-"google developer console"
+#: cps/web.py:1786
+msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr ""
-#: cps/web.py:1746
+#: cps/web.py:1861
msgid "Server restarted, please reload page"
msgstr "Serwer uruchomiony ponownie, proszę odświeżyć stronę"
-#: cps/web.py:1749
+#: cps/web.py:1864
msgid "Performing shutdown of server, please close window"
msgstr "Wykonano wyłączenie serwera, proszę zamknąć okno"
-#: cps/web.py:1767
+#: cps/web.py:1883
msgid "Update done"
msgstr "Aktualizacja zakończona"
-#: cps/web.py:1837
+#: cps/web.py:1953
msgid "Published after "
msgstr ""
-#: cps/web.py:1844
+#: cps/web.py:1960
msgid "Published before "
msgstr ""
-#: cps/web.py:1858
+#: cps/web.py:1974
#, python-format
msgid "Rating <= %(rating)s"
msgstr ""
-#: cps/web.py:1860
+#: cps/web.py:1976
#, python-format
msgid "Rating >= %(rating)s"
msgstr ""
-#: cps/web.py:1919 cps/web.py:1928
+#: cps/web.py:2035 cps/web.py:2044
msgid "search"
msgstr "szukaj"
#: cps/templates/index.xml:44 cps/templates/index.xml:48
-#: cps/templates/layout.html:146 cps/web.py:1995
+#: cps/templates/layout.html:146 cps/web.py:2111
msgid "Read Books"
msgstr "Przeczytane książki"
#: cps/templates/index.xml:52 cps/templates/index.xml:56
-#: cps/templates/layout.html:148 cps/web.py:1998
+#: cps/templates/layout.html:148 cps/web.py:2114
msgid "Unread Books"
msgstr "Nieprzeczytane książki"
-#: cps/web.py:2046 cps/web.py:2048 cps/web.py:2050 cps/web.py:2062
+#: cps/web.py:2162 cps/web.py:2164 cps/web.py:2166 cps/web.py:2178
msgid "Read a Book"
msgstr "Czytaj książkę"
-#: cps/web.py:2128 cps/web.py:3006
+#: cps/web.py:2244 cps/web.py:3129
msgid "Please fill out all fields!"
msgstr "Proszę wypełnić wszystkie pola!"
-#: cps/web.py:2129 cps/web.py:2150 cps/web.py:2154 cps/web.py:2159
-#: cps/web.py:2161
+#: cps/web.py:2245 cps/web.py:2266 cps/web.py:2270 cps/web.py:2275
+#: cps/web.py:2277
msgid "register"
msgstr "rejestracja"
-#: cps/web.py:2149 cps/web.py:3222
+#: cps/web.py:2265 cps/web.py:3345
msgid "An unknown error occurred. Please try again later."
msgstr ""
-#: cps/web.py:2152
+#: cps/web.py:2268
msgid "Your e-mail is not allowed to register"
msgstr ""
-#: cps/web.py:2155
+#: cps/web.py:2271
msgid "Confirmation e-mail was send to your e-mail account."
msgstr ""
-#: cps/web.py:2158
+#: cps/web.py:2274
msgid "This username or e-mail address is already in use."
msgstr ""
-#: cps/web.py:2175 cps/web.py:2271
+#: cps/web.py:2291 cps/web.py:2387
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Zalogowałeś się jako: '%(nickname)s'"
-#: cps/web.py:2180
+#: cps/web.py:2296
msgid "Wrong Username or Password"
msgstr "Błędna nazwa użytkownika lub hasło"
-#: cps/web.py:2186 cps/web.py:2207
+#: cps/web.py:2302 cps/web.py:2323
msgid "login"
msgstr "logowanie"
-#: cps/web.py:2219 cps/web.py:2250
+#: cps/web.py:2335 cps/web.py:2366
msgid "Token not found"
msgstr ""
-#: cps/web.py:2227 cps/web.py:2258
+#: cps/web.py:2343 cps/web.py:2374
msgid "Token has expired"
msgstr ""
-#: cps/web.py:2235
+#: cps/web.py:2351
msgid "Success! Please return to your device"
msgstr ""
-#: cps/web.py:2285
+#: cps/web.py:2401
msgid "Please configure the SMTP mail settings first..."
msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..."
-#: cps/web.py:2289
+#: cps/web.py:2405
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr ""
-#: cps/web.py:2293
+#: cps/web.py:2409
#, 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:2295 cps/web.py:3060
+#: cps/web.py:2411 cps/web.py:3183
msgid "Please configure your kindle e-mail address first..."
msgstr ""
-#: cps/web.py:2339
+#: cps/web.py:2455
#, 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:2350
+#: cps/web.py:2466
msgid "Invalid shelf specified"
msgstr ""
-#: cps/web.py:2355
+#: cps/web.py:2471
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr ""
-#: cps/web.py:2360
+#: cps/web.py:2476
msgid "User is not allowed to edit public shelves"
msgstr ""
-#: cps/web.py:2378
+#: cps/web.py:2494
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr ""
-#: cps/web.py:2392
+#: cps/web.py:2508
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2394
+#: cps/web.py:2510
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2431
+#: cps/web.py:2547
#, 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:2437
+#: cps/web.py:2553
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2457 cps/web.py:2481
+#: cps/web.py:2573 cps/web.py:2597
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "Półka o nazwie '%(title)s' już istnieje."
-#: cps/web.py:2462
+#: cps/web.py:2578
#, python-format
msgid "Shelf %(title)s created"
msgstr "Półka %(title)s została utworzona"
-#: cps/web.py:2464 cps/web.py:2492
+#: cps/web.py:2580 cps/web.py:2608
msgid "There was an error"
msgstr "Wystąpił błąd"
-#: cps/web.py:2465 cps/web.py:2467
+#: cps/web.py:2581 cps/web.py:2583
msgid "create a shelf"
msgstr "utwórz półkę"
-#: cps/web.py:2490
+#: cps/web.py:2606
#, python-format
msgid "Shelf %(title)s changed"
msgstr "Półka %(title)s została zmieniona"
-#: cps/web.py:2493 cps/web.py:2495
+#: cps/web.py:2609 cps/web.py:2611
msgid "Edit a shelf"
msgstr "Edytuj półkę"
-#: cps/web.py:2516
+#: cps/web.py:2632
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "pomyślnie usunięto półkę %(name)s"
-#: cps/web.py:2538
+#: cps/web.py:2659
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "Półka: '%(name)s'"
-#: cps/web.py:2541
+#: cps/web.py:2662
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr ""
-#: cps/web.py:2572
+#: cps/web.py:2693
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "Zmieniono kolejność półki: '%(name)s'"
-#: cps/web.py:2601 cps/web.py:3012
+#: cps/web.py:2722 cps/web.py:3135
msgid "E-mail is not from valid domain"
msgstr ""
-#: cps/web.py:2603 cps/web.py:2644 cps/web.py:2647
+#: cps/web.py:2724 cps/web.py:2765 cps/web.py:2768
#, python-format
msgid "%(name)s's profile"
msgstr "Profil użytkownika %(name)s"
-#: cps/web.py:2642
+#: cps/web.py:2763
msgid "Found an existing account for this e-mail address."
msgstr ""
-#: cps/web.py:2645
+#: cps/web.py:2766
msgid "Profile updated"
msgstr "Zaktualizowano profil"
-#: cps/web.py:2657
-msgid "Unknown"
-msgstr ""
-
-#: cps/web.py:2671
+#: cps/web.py:2794
msgid "Admin page"
msgstr "Portal administracyjny"
-#: cps/web.py:2749 cps/web.py:2922
+#: cps/web.py:2872 cps/web.py:3045
msgid "Calibre-Web configuration updated"
msgstr "Konfiguracja Calibre-Web została zaktualizowana"
-#: cps/templates/admin.html:91 cps/web.py:2762
+#: cps/templates/admin.html:100 cps/web.py:2885
msgid "UI Configuration"
msgstr ""
-#: cps/web.py:2780
+#: cps/web.py:2903
msgid "Import of optional Google Drive requirements missing"
msgstr ""
-#: cps/web.py:2783
+#: cps/web.py:2906
msgid "client_secrets.json is missing or not readable"
msgstr ""
-#: cps/web.py:2788 cps/web.py:2815
+#: cps/web.py:2911 cps/web.py:2938
msgid "client_secrets.json is not configured for web application"
msgstr ""
-#: cps/templates/admin.html:90 cps/web.py:2818 cps/web.py:2844 cps/web.py:2856
-#: cps/web.py:2898 cps/web.py:2913 cps/web.py:2930 cps/web.py:2937
-#: cps/web.py:2954
+#: cps/templates/admin.html:99 cps/web.py:2941 cps/web.py:2967 cps/web.py:2979
+#: cps/web.py:3021 cps/web.py:3036 cps/web.py:3053 cps/web.py:3060
+#: cps/web.py:3077
msgid "Basic Configuration"
msgstr "Podstawowa konfiguracja"
-#: cps/web.py:2841
+#: cps/web.py:2964
msgid "Keyfile location is not valid, please enter correct path"
msgstr ""
-#: cps/web.py:2853
+#: cps/web.py:2976
msgid "Certfile location is not valid, please enter correct path"
msgstr ""
-#: cps/web.py:2895
+#: cps/web.py:3018
msgid "Logfile location is not valid, please enter correct path"
msgstr ""
-#: cps/web.py:2934
+#: cps/web.py:3057
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:31 cps/web.py:3008 cps/web.py:3014 cps/web.py:3030
+#: cps/templates/admin.html:33 cps/web.py:3131 cps/web.py:3137 cps/web.py:3153
msgid "Add new user"
msgstr "Dodaj nowego użytkownika"
-#: cps/web.py:3020
+#: cps/web.py:3143
#, python-format
msgid "User '%(user)s' created"
msgstr "Użytkownik '%(user)s' został utworzony"
-#: cps/web.py:3024
+#: cps/web.py:3147
msgid "Found an existing account for this e-mail address or nickname."
msgstr ""
-#: cps/web.py:3048 cps/web.py:3062
+#: cps/web.py:3171 cps/web.py:3185
msgid "E-mail server settings updated"
msgstr ""
-#: cps/web.py:3055
+#: cps/web.py:3178
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr ""
-#: cps/web.py:3058
+#: cps/web.py:3181
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr ""
-#: cps/web.py:3063
+#: cps/web.py:3186
msgid "Edit e-mail server settings"
msgstr ""
-#: cps/web.py:3088
+#: cps/web.py:3211
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "Użytkownik '%(nick)s' został usunięty"
-#: cps/web.py:3197
+#: cps/web.py:3320
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Użytkownik '%(nick)s' został zaktualizowany"
-#: cps/web.py:3200
+#: cps/web.py:3323
msgid "An unknown error occured."
msgstr "Wystąpił nieznany błąd."
-#: cps/web.py:3202
+#: cps/web.py:3325
#, python-format
msgid "Edit User %(nick)s"
msgstr "Edytuj użytkownika %(nick)s"
-#: cps/web.py:3219
+#: cps/web.py:3342
#, python-format
msgid "Password for user %(user)s reset"
msgstr ""
-#: cps/web.py:3239
+#: cps/web.py:3362
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr ""
-#: cps/web.py:3270 cps/web.py:3546 cps/web.py:3551 cps/web.py:3706
+#: cps/web.py:3390 cps/web.py:3667 cps/web.py:3672 cps/web.py:3827
msgid "edit metadata"
msgstr "edytuj metadane"
-#: cps/web.py:3284 cps/web.py:3576
+#: cps/web.py:3401 cps/web.py:3697
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
-msgstr ""
-"Rozszerzenie pliku '%(ext)s' nie jest dozwolone do przesłania na ten "
-"serwer"
+msgstr "Rozszerzenie pliku '%(ext)s' nie jest dozwolone do przesłania na ten serwer"
-#: cps/web.py:3288 cps/web.py:3580
+#: cps/web.py:3405 cps/web.py:3701
msgid "File to be uploaded must have an extension"
msgstr "Plik do przesłania musi mieć rozszerzenie"
-#: cps/web.py:3300 cps/web.py:3600
+#: cps/web.py:3417 cps/web.py:3721
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr "Nie udało się utworzyć łącza %(path)s (Odmowa dostępu)."
-#: cps/web.py:3305
+#: cps/web.py:3422
#, python-format
msgid "Failed to store file %(file)s."
msgstr ""
-#: cps/web.py:3321
+#: cps/web.py:3438
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr ""
-#: cps/web.py:3339
+#: cps/web.py:3455
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr ""
-#: cps/web.py:3346
+#: cps/web.py:3462
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr ""
-#: cps/web.py:3349
+#: cps/web.py:3465
msgid "Cover-file is not a valid image file"
msgstr ""
-#: cps/web.py:3362 cps/web.py:3366
+#: cps/web.py:3482 cps/web.py:3486
msgid "unknown"
msgstr ""
-#: cps/web.py:3388
+#: cps/web.py:3508
msgid "Cover is not a jpg file, can't save"
msgstr ""
-#: cps/web.py:3555
+#: cps/web.py:3554
+#, python-format
+msgid "%(langname)s is not a valid language"
+msgstr ""
+
+#: cps/web.py:3676
msgid "Error editing book, please check logfile for details"
msgstr ""
-#: cps/web.py:3605
+#: cps/web.py:3726
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr "Nie można przechowywać pliku %(file)s (Odmowa dostępu)."
-#: cps/web.py:3610
+#: cps/web.py:3731
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr "Nie udało się usunąć pliku %(file)s (Odmowa dostępu)."
-#: cps/web.py:3692
+#: cps/web.py:3813
#, python-format
msgid "File %(file)s uploaded"
msgstr ""
-#: cps/web.py:3722
+#: cps/web.py:3843
msgid "Source or destination format for conversion missing"
msgstr ""
-#: cps/web.py:3732
+#: cps/web.py:3853
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr ""
-#: cps/web.py:3736
+#: cps/web.py:3857
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr ""
-#: cps/worker.py:215 cps/worker.py:387
+#: cps/worker.py:215 cps/worker.py:398
msgid "Started"
msgstr ""
-#: cps/worker.py:237
+#: cps/worker.py:251
#, python-format
msgid "Convertertool %(converter)s not found"
msgstr ""
-#: cps/worker.py:272
+#: cps/worker.py:287
#, python-format
msgid "Ebook-converter failed: %(error)s"
msgstr ""
-#: cps/worker.py:283
+#: cps/worker.py:298
#, python-format
msgid "Kindlegen failed with Error %(error)s. Message: %(message)s"
msgstr ""
-#: cps/worker.py:317 cps/worker.py:377 cps/worker.py:438
-msgid "Finished"
-msgstr ""
-
-#: cps/worker.py:344 cps/worker.py:363
+#: cps/worker.py:355 cps/worker.py:374
msgid "Waiting"
msgstr ""
-#: cps/worker.py:351
+#: cps/worker.py:362
msgid "This e-mail has been sent via Calibre-Web."
msgstr ""
-#: cps/worker.py:472
+#: cps/worker.py:388 cps/worker.py:484
+msgid "Finished"
+msgstr ""
+
+#: cps/worker.py:476
msgid "Failed"
msgstr ""
-#: cps/templates/admin.html:4
+#: cps/templates/admin.html:6
msgid "User list"
msgstr "Lista użytkowników"
-#: cps/templates/admin.html:7
+#: cps/templates/admin.html:9
msgid "Nickname"
msgstr "Nazwa użytkownika"
-#: cps/templates/admin.html:8
+#: cps/templates/admin.html:10
msgid "E-mail"
msgstr ""
-#: cps/templates/admin.html:9
+#: cps/templates/admin.html:11
msgid "Kindle"
msgstr "Kindle"
-#: cps/templates/admin.html:10
+#: cps/templates/admin.html:12
msgid "DLS"
msgstr "DLS"
-#: cps/templates/admin.html:11 cps/templates/layout.html:74
+#: cps/templates/admin.html:13 cps/templates/layout.html:74
msgid "Admin"
msgstr "Portal administracyjny"
-#: cps/templates/admin.html:12 cps/templates/detail.html:22
+#: cps/templates/admin.html:14 cps/templates/detail.html:22
#: cps/templates/detail.html:31
msgid "Download"
msgstr "Pobierz"
-#: cps/templates/admin.html:13 cps/templates/layout.html:64
+#: cps/templates/admin.html:15 cps/templates/layout.html:64
msgid "Upload"
msgstr "Wyślij"
-#: cps/templates/admin.html:14
+#: cps/templates/admin.html:16
msgid "Edit"
msgstr "Edytuj"
-#: cps/templates/admin.html:32
+#: cps/templates/admin.html:39
msgid "SMTP e-mail server settings"
msgstr ""
-#: cps/templates/admin.html:35 cps/templates/email_edit.html:11
+#: cps/templates/admin.html:42 cps/templates/email_edit.html:11
msgid "SMTP hostname"
msgstr "Adres serwera SMTP"
-#: cps/templates/admin.html:36
+#: cps/templates/admin.html:43
msgid "SMTP port"
msgstr "Port serwera SMTP"
-#: cps/templates/admin.html:37
+#: cps/templates/admin.html:44
msgid "SSL"
msgstr "SSL"
-#: cps/templates/admin.html:38 cps/templates/email_edit.html:27
+#: cps/templates/admin.html:45 cps/templates/email_edit.html:27
msgid "SMTP login"
msgstr "Nazwa użytkownika SMTP"
-#: cps/templates/admin.html:39
+#: cps/templates/admin.html:46
msgid "From mail"
msgstr "Wyślij z adresu e-mail"
-#: cps/templates/admin.html:48
+#: cps/templates/admin.html:56
msgid "Change SMTP settings"
msgstr "Zmień ustawienia SMTP"
-#: cps/templates/admin.html:50
+#: cps/templates/admin.html:62
msgid "Configuration"
msgstr "Konfiguracja"
-#: cps/templates/admin.html:53
+#: cps/templates/admin.html:65
msgid "Calibre DB dir"
msgstr "Folder bazy danych Calibre"
-#: cps/templates/admin.html:57
+#: cps/templates/admin.html:69
msgid "Log level"
msgstr ""
-#: cps/templates/admin.html:61
+#: cps/templates/admin.html:73
msgid "Port"
msgstr "Port"
-#: cps/templates/admin.html:67 cps/templates/config_view_edit.html:23
+#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23
msgid "Books per page"
msgstr "Ilość książek na stronie"
-#: cps/templates/admin.html:71
+#: cps/templates/admin.html:83
msgid "Uploading"
msgstr "Wysyłanie"
-#: cps/templates/admin.html:75
+#: cps/templates/admin.html:87
msgid "Anonymous browsing"
msgstr ""
-#: cps/templates/admin.html:79
+#: cps/templates/admin.html:91
msgid "Public registration"
msgstr "Publiczna rejestracja"
-#: cps/templates/admin.html:83 cps/templates/remote_login.html:4
+#: cps/templates/admin.html:95 cps/templates/remote_login.html:4
msgid "Remote login"
msgstr ""
-#: cps/templates/admin.html:93
+#: cps/templates/admin.html:106
msgid "Administration"
msgstr "Zarządzanie"
-#: cps/templates/admin.html:94
-msgid "Current commit timestamp"
-msgstr "Znacznik czasowy zainstalowanej wersji"
-
-#: cps/templates/admin.html:95
-msgid "Newest commit timestamp"
-msgstr "Znacznik czasowy nowej wersji"
-
-#: cps/templates/admin.html:97
+#: cps/templates/admin.html:107
msgid "Reconnect to Calibre DB"
msgstr "Połącz ponownie z bazą danych Calibre"
-#: cps/templates/admin.html:98
+#: cps/templates/admin.html:108
msgid "Restart Calibre-Web"
msgstr "Uruchom ponownie Calibre Web"
-#: cps/templates/admin.html:99
+#: cps/templates/admin.html:109
msgid "Stop Calibre-Web"
msgstr "Zatrzymaj Calibre Web"
-#: cps/templates/admin.html:100
+#: cps/templates/admin.html:115
+msgid "Update"
+msgstr ""
+
+#: cps/templates/admin.html:119
+msgid "Version"
+msgstr ""
+
+#: cps/templates/admin.html:120
+msgid "Details"
+msgstr ""
+
+#: cps/templates/admin.html:126
+msgid "Current version"
+msgstr ""
+
+#: cps/templates/admin.html:132
msgid "Check for update"
msgstr "Sprawdź aktualizacje"
-#: cps/templates/admin.html:101
+#: cps/templates/admin.html:133
msgid "Perform Update"
msgstr "Wykonaj aktualizację"
-#: cps/templates/admin.html:110
+#: cps/templates/admin.html:145
msgid "Do you really want to restart Calibre-Web?"
msgstr "Na pewno chcesz uruchomić ponownie Calibre Web?"
-#: cps/templates/admin.html:115 cps/templates/admin.html:129
-#: cps/templates/admin.html:150 cps/templates/shelf.html:59
+#: cps/templates/admin.html:150 cps/templates/admin.html:164
+#: cps/templates/admin.html:184 cps/templates/shelf.html:59
msgid "Ok"
msgstr "OK"
-#: cps/templates/admin.html:116 cps/templates/admin.html:130
+#: cps/templates/admin.html:151 cps/templates/admin.html:165
#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:164
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75
@@ -831,11 +867,11 @@ msgstr "OK"
msgid "Back"
msgstr "Wróć"
-#: cps/templates/admin.html:128
+#: cps/templates/admin.html:163
msgid "Do you really want to stop Calibre-Web?"
msgstr "Na pewno chcesz zatrzymać Calibre Web?"
-#: cps/templates/admin.html:141
+#: cps/templates/admin.html:175
msgid "Updating, please do not reload page"
msgstr "Aktualizowanie, proszę nie odświeżać strony"
@@ -916,9 +952,7 @@ msgid "Rating"
msgstr "Ocena"
#: cps/templates/book_edit.html:87
-msgid ""
-"Cover URL (jpg, cover is downloaded and stored in database, field is "
-"afterwards empty again)"
+msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)"
msgstr ""
#: cps/templates/book_edit.html:91
@@ -1295,9 +1329,7 @@ msgstr "Edytuj metadane"
#: cps/templates/email_edit.html:15
msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)"
-msgstr ""
-"Port serwera SMTP (używane 25 dla jawnego SMTP i 465 dla połączenia SSL i"
-" 587 dla połączenia STARTTLS)"
+msgstr "Port serwera SMTP (używane 25 dla jawnego SMTP i 465 dla połączenia SSL i 587 dla połączenia STARTTLS)"
#: cps/templates/email_edit.html:19
msgid "Encryption"
@@ -1856,9 +1888,7 @@ msgstr "Ostatnio pobierane"
#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
#~ msgstr ""
-#~ msgid ""
-#~ "Rename author from: '%(src)s' to "
-#~ "'%(dest)s' failed with error: %(error)s"
+#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
#~ msgstr ""
#~ msgid "Password for user %(user)s reset"
@@ -1880,7 +1910,11 @@ msgstr "Ostatnio pobierane"
#~ msgstr ""
#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server"
-#~ msgstr ""
-#~ "Rozszerzenie pliku \"%(ext)s\" nie jest "
-#~ "dozwolone do przesłania na ten serwer"
+#~ msgstr "Rozszerzenie pliku \"%(ext)s\" nie jest dozwolone do przesłania na ten serwer"
+
+#~ msgid "Current commit timestamp"
+#~ msgstr "Znacznik czasowy zainstalowanej wersji"
+
+#~ msgid "Newest commit timestamp"
+#~ msgstr "Znacznik czasowy nowej wersji"
diff --git a/cps/translations/ru/LC_MESSAGES/messages.mo b/cps/translations/ru/LC_MESSAGES/messages.mo
index e755d5f8..741ca782 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 28defadc..b6c1d418 100644
--- a/cps/translations/ru/LC_MESSAGES/messages.po
+++ b/cps/translations/ru/LC_MESSAGES/messages.po
@@ -3,24 +3,16 @@
# This file is distributed under the same license as the Calibre-Web project
# Pavel Korovin , 2017.
#
-# Translators:
-# Anton Bershanskiy , 2016
-# Александр, 2015
-# Nikolai Prokoschenko , 2004
-# Vladislav , 2015
-# Yuri Kozlov , 2004-2005
-# Сергей , 2015
msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2018-09-08 14:49+0200\n"
+"POT-Creation-Date: 2018-09-14 21:11+0200\n"
"PO-Revision-Date: 2017-04-30 00:47+0300\n"
"Last-Translator: Pavel Korovin \n"
"Language: ru\n"
"Language-Team: \n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
-"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -122,707 +114,750 @@ msgstr ""
msgid "Unrar binary file not found"
msgstr ""
-#: cps/web.py:1114
+#: cps/web.py:1112 cps/web.py:2778
+msgid "Unknown"
+msgstr "Неизвестно"
+
+#: cps/web.py:1121 cps/web.py:1152
+msgid "HTTP Error"
+msgstr ""
+
+#: cps/web.py:1123 cps/web.py:1154
+msgid "Connection error"
+msgstr ""
+
+#: cps/web.py:1125 cps/web.py:1156
+msgid "Timeout while establishing connection"
+msgstr ""
+
+#: cps/web.py:1127 cps/web.py:1158
+msgid "General error"
+msgstr ""
+
+#: cps/web.py:1133
+msgid "Unexpected data while reading update information"
+msgstr ""
+
+#: cps/web.py:1140
+msgid "No update available. You already have the latest version installed"
+msgstr ""
+
+#: cps/web.py:1165
+msgid "A new update is available. Click on the button below to update to the latest version."
+msgstr ""
+
+#: cps/web.py:1215
+msgid "Could not fetch update information"
+msgstr ""
+
+#: cps/web.py:1230
msgid "Requesting update package"
msgstr "Проверка обновлений"
-#: cps/web.py:1115
+#: cps/web.py:1231
msgid "Downloading update package"
msgstr "Загрузка обновлений"
-#: cps/web.py:1116
+#: cps/web.py:1232
msgid "Unzipping update package"
msgstr "Распаковка обновлений"
-#: cps/web.py:1117
+#: cps/web.py:1233
msgid "Files are replaced"
msgstr "Файлы заменены"
-#: cps/web.py:1118
+#: cps/web.py:1234
msgid "Database connections are closed"
msgstr "Соеднинения с базой данных закрыты"
-#: cps/web.py:1119
+#: cps/web.py:1235
msgid "Server is stopped"
msgstr "Сервер остановлен"
-#: cps/web.py:1120
+#: cps/web.py:1236
msgid "Update finished, please press okay and reload page"
msgstr "Обновления установлены, нажмите okay и перезагрузите страницу"
-#: cps/web.py:1140
+#: cps/web.py:1256
msgid "Recently Added Books"
msgstr ""
-#: cps/web.py:1150
+#: cps/web.py:1266
msgid "Newest Books"
msgstr ""
-#: cps/web.py:1162
+#: cps/web.py:1278
msgid "Oldest Books"
msgstr ""
-#: cps/web.py:1174
+#: cps/web.py:1290
msgid "Books (A-Z)"
msgstr ""
-#: cps/web.py:1185
+#: cps/web.py:1301
msgid "Books (Z-A)"
msgstr ""
-#: cps/web.py:1214
+#: cps/web.py:1330
msgid "Hot Books (most downloaded)"
msgstr "Популярные книги (часто загружаемые)"
-#: cps/web.py:1227
+#: cps/web.py:1343
msgid "Best rated books"
msgstr "Книги с наивысшим рейтингом"
-#: cps/templates/index.xml:36 cps/web.py:1239
+#: cps/templates/index.xml:36 cps/web.py:1355
msgid "Random Books"
msgstr "Случайный выбор"
-#: cps/web.py:1254
+#: cps/web.py:1370
msgid "Author list"
msgstr "Авторы"
-#: cps/web.py:1266 cps/web.py:1329 cps/web.py:1484 cps/web.py:2036
+#: cps/web.py:1382 cps/web.py:1445 cps/web.py:1600 cps/web.py:2152
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Невозможно открыть книгу. Файл не существует или недоступен."
-#: cps/templates/index.xml:73 cps/web.py:1313
+#: cps/templates/index.xml:73 cps/web.py:1429
msgid "Series list"
msgstr "Серии"
-#: cps/web.py:1327
+#: cps/web.py:1443
#, python-format
msgid "Series: %(serie)s"
msgstr "Серии: %(serie)s"
-#: cps/web.py:1354
+#: cps/web.py:1470
msgid "Available languages"
msgstr "Языки"
-#: cps/web.py:1371
+#: cps/web.py:1487
#, python-format
msgid "Language: %(name)s"
msgstr "Язык: %(name)s"
-#: cps/templates/index.xml:66 cps/web.py:1382
+#: cps/templates/index.xml:66 cps/web.py:1498
msgid "Category list"
msgstr "Категории"
-#: cps/web.py:1396
+#: cps/web.py:1512
#, python-format
msgid "Category: %(name)s"
msgstr "Категория: %(name)s"
-#: cps/templates/layout.html:71 cps/web.py:1535
+#: cps/templates/layout.html:71 cps/web.py:1651
msgid "Tasks"
-msgstr ""
+msgstr "Задания"
-#: cps/web.py:1565
+#: cps/web.py:1681
msgid "Statistics"
msgstr "Статистика"
-#: cps/web.py:1670
-msgid ""
-"Callback domain is not verified, please follow steps to verify domain in "
-"google developer console"
+#: cps/web.py:1786
+msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr ""
-#: cps/web.py:1746
+#: cps/web.py:1861
msgid "Server restarted, please reload page"
msgstr "Сервер перезагружен, пожалуйста, перезагрузите страницу"
-#: cps/web.py:1749
+#: cps/web.py:1864
msgid "Performing shutdown of server, please close window"
msgstr "Производится остановка сервера, пожалуйста, закройте окно"
-#: cps/web.py:1767
+#: cps/web.py:1883
msgid "Update done"
msgstr "Обновление закончено"
-#: cps/web.py:1837
+#: cps/web.py:1953
msgid "Published after "
-msgstr ""
+msgstr "Опубликовано до"
-#: cps/web.py:1844
+#: cps/web.py:1960
msgid "Published before "
-msgstr ""
+msgstr "Опубликовано после"
-#: cps/web.py:1858
+#: cps/web.py:1974
#, python-format
msgid "Rating <= %(rating)s"
-msgstr ""
+msgstr "Рейтинг <= %(rating)s"
-#: cps/web.py:1860
+#: cps/web.py:1976
#, python-format
msgid "Rating >= %(rating)s"
-msgstr ""
+msgstr "Рейтинг >= %(rating)s"
-#: cps/web.py:1919 cps/web.py:1928
+#: cps/web.py:2035 cps/web.py:2044
msgid "search"
msgstr "поиск"
#: cps/templates/index.xml:44 cps/templates/index.xml:48
-#: cps/templates/layout.html:146 cps/web.py:1995
+#: cps/templates/layout.html:146 cps/web.py:2111
msgid "Read Books"
msgstr "Прочитанные"
#: cps/templates/index.xml:52 cps/templates/index.xml:56
-#: cps/templates/layout.html:148 cps/web.py:1998
+#: cps/templates/layout.html:148 cps/web.py:2114
msgid "Unread Books"
msgstr "Непрочитанные"
-#: cps/web.py:2046 cps/web.py:2048 cps/web.py:2050 cps/web.py:2062
+#: cps/web.py:2162 cps/web.py:2164 cps/web.py:2166 cps/web.py:2178
msgid "Read a Book"
msgstr "Читать книгу"
-#: cps/web.py:2128 cps/web.py:3006
+#: cps/web.py:2244 cps/web.py:3129
msgid "Please fill out all fields!"
msgstr "Пожалуйста, заполните все поля!"
-#: cps/web.py:2129 cps/web.py:2150 cps/web.py:2154 cps/web.py:2159
-#: cps/web.py:2161
+#: cps/web.py:2245 cps/web.py:2266 cps/web.py:2270 cps/web.py:2275
+#: cps/web.py:2277
msgid "register"
msgstr "зарегистрироваться"
-#: cps/web.py:2149 cps/web.py:3222
+#: cps/web.py:2265 cps/web.py:3345
msgid "An unknown error occurred. Please try again later."
-msgstr ""
+msgstr "Неизвестная ошибка. Попробуйте позже."
-#: cps/web.py:2152
+#: cps/web.py:2268
msgid "Your e-mail is not allowed to register"
msgstr ""
-#: cps/web.py:2155
+#: cps/web.py:2271
msgid "Confirmation e-mail was send to your e-mail account."
-msgstr ""
+msgstr "Письмо с подтверждением отправлено вам на e-mail"
-#: cps/web.py:2158
+#: cps/web.py:2274
msgid "This username or e-mail address is already in use."
-msgstr ""
+msgstr "Этот никнейм или e-mail уже используются"
-#: cps/web.py:2175 cps/web.py:2271
+#: cps/web.py:2291 cps/web.py:2387
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Вы вошли как пользователь '%(nickname)s'"
-#: cps/web.py:2180
+#: cps/web.py:2296
msgid "Wrong Username or Password"
msgstr "Ошибка в имени пользователя или пароле"
-#: cps/web.py:2186 cps/web.py:2207
+#: cps/web.py:2302 cps/web.py:2323
msgid "login"
msgstr "войти"
-#: cps/web.py:2219 cps/web.py:2250
+#: cps/web.py:2335 cps/web.py:2366
msgid "Token not found"
-msgstr ""
+msgstr "Ключ не найден"
-#: cps/web.py:2227 cps/web.py:2258
+#: cps/web.py:2343 cps/web.py:2374
msgid "Token has expired"
-msgstr ""
+msgstr "Ключ просрочен"
-#: cps/web.py:2235
+#: cps/web.py:2351
msgid "Success! Please return to your device"
-msgstr ""
+msgstr "Успешно! Пожалуйста, проверьте свое устройство"
-#: cps/web.py:2285
+#: cps/web.py:2401
msgid "Please configure the SMTP mail settings first..."
msgstr "Пожалуйста, сначала сконфигурируйте параметры SMTP"
-#: cps/web.py:2289
+#: cps/web.py:2405
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr ""
-#: cps/web.py:2293
+#: cps/web.py:2409
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Ошибка при отправке книги: %(res)s"
-#: cps/web.py:2295 cps/web.py:3060
+#: cps/web.py:2411 cps/web.py:3183
msgid "Please configure your kindle e-mail address first..."
-msgstr ""
+msgstr "Пожалуйста, сначала настройте e-mail на вашем kindle"
-#: cps/web.py:2339
+#: cps/web.py:2455
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "Книга добавлена на книжную полку: %(sname)s"
-#: cps/web.py:2350
+#: cps/web.py:2466
msgid "Invalid shelf specified"
msgstr ""
-#: cps/web.py:2355
+#: cps/web.py:2471
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr ""
-#: cps/web.py:2360
+#: cps/web.py:2476
msgid "User is not allowed to edit public shelves"
msgstr ""
-#: cps/web.py:2378
+#: cps/web.py:2494
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr ""
-#: cps/web.py:2392
+#: cps/web.py:2508
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2394
+#: cps/web.py:2510
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2431
+#: cps/web.py:2547
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "Книга удалена с книжной полки: %(sname)s"
-#: cps/web.py:2437
+#: cps/web.py:2553
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2457 cps/web.py:2481
+#: cps/web.py:2573 cps/web.py:2597
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "Книжкная полка с названием '%(title)s' уже существует."
-#: cps/web.py:2462
+#: cps/web.py:2578
#, python-format
msgid "Shelf %(title)s created"
msgstr "Создана книжная полка %(title)s"
-#: cps/web.py:2464 cps/web.py:2492
+#: cps/web.py:2580 cps/web.py:2608
msgid "There was an error"
msgstr "Произошла ошибка"
-#: cps/web.py:2465 cps/web.py:2467
+#: cps/web.py:2581 cps/web.py:2583
msgid "create a shelf"
msgstr "создать книжную полку"
-#: cps/web.py:2490
+#: cps/web.py:2606
#, python-format
msgid "Shelf %(title)s changed"
msgstr "Книжная полка %(title)s изменена"
-#: cps/web.py:2493 cps/web.py:2495
+#: cps/web.py:2609 cps/web.py:2611
msgid "Edit a shelf"
msgstr "Изменить книжную полку"
-#: cps/web.py:2516
+#: cps/web.py:2632
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "Книжная полка %(name)s удалена"
-#: cps/web.py:2538
+#: cps/web.py:2659
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "Книжная полка: '%(name)s'"
-#: cps/web.py:2541
+#: cps/web.py:2662
msgid "Error opening shelf. Shelf does not exist or is not accessible"
-msgstr ""
+msgstr "Ошибка открытия книжной полки. Полка не существует или недоступна"
-#: cps/web.py:2572
+#: cps/web.py:2693
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "Изменить расположение книжной полки '%(name)s'"
-#: cps/web.py:2601 cps/web.py:3012
+#: cps/web.py:2722 cps/web.py:3135
msgid "E-mail is not from valid domain"
-msgstr ""
+msgstr "E-mail не из существующей доменной зоны"
-#: cps/web.py:2603 cps/web.py:2644 cps/web.py:2647
+#: cps/web.py:2724 cps/web.py:2765 cps/web.py:2768
#, python-format
msgid "%(name)s's profile"
msgstr "Профиль %(name)s"
-#: cps/web.py:2642
+#: cps/web.py:2763
msgid "Found an existing account for this e-mail address."
msgstr ""
-#: cps/web.py:2645
+#: cps/web.py:2766
msgid "Profile updated"
msgstr "Профиль обновлён"
-#: cps/web.py:2657
-msgid "Unknown"
-msgstr ""
-
-#: cps/web.py:2671
+#: cps/web.py:2794
msgid "Admin page"
msgstr "Администрирование"
-#: cps/web.py:2749 cps/web.py:2922
+#: cps/web.py:2872 cps/web.py:3045
msgid "Calibre-Web configuration updated"
msgstr "Конфигурация Calibre-Web обновлена"
-#: cps/templates/admin.html:91 cps/web.py:2762
+#: cps/templates/admin.html:100 cps/web.py:2885
msgid "UI Configuration"
-msgstr ""
+msgstr "Настройка интерфейса"
-#: cps/web.py:2780
+#: cps/web.py:2903
msgid "Import of optional Google Drive requirements missing"
msgstr ""
-#: cps/web.py:2783
+#: cps/web.py:2906
msgid "client_secrets.json is missing or not readable"
-msgstr ""
+msgstr "client_secrets.json отсутствует или его невозможно прочесть"
-#: cps/web.py:2788 cps/web.py:2815
+#: cps/web.py:2911 cps/web.py:2938
msgid "client_secrets.json is not configured for web application"
msgstr ""
-#: cps/templates/admin.html:90 cps/web.py:2818 cps/web.py:2844 cps/web.py:2856
-#: cps/web.py:2898 cps/web.py:2913 cps/web.py:2930 cps/web.py:2937
-#: cps/web.py:2954
+#: cps/templates/admin.html:99 cps/web.py:2941 cps/web.py:2967 cps/web.py:2979
+#: cps/web.py:3021 cps/web.py:3036 cps/web.py:3053 cps/web.py:3060
+#: cps/web.py:3077
msgid "Basic Configuration"
msgstr "Настройки сервера"
-#: cps/web.py:2841
+#: cps/web.py:2964
msgid "Keyfile location is not valid, please enter correct path"
msgstr ""
-#: cps/web.py:2853
+#: cps/web.py:2976
msgid "Certfile location is not valid, please enter correct path"
msgstr ""
-#: cps/web.py:2895
+#: cps/web.py:3018
msgid "Logfile location is not valid, please enter correct path"
msgstr ""
-#: cps/web.py:2934
+#: cps/web.py:3057
msgid "DB location is not valid, please enter correct path"
msgstr "Неверный путь к фалу БД, пожалуйста, укажите правильное расположение БД"
-#: cps/templates/admin.html:31 cps/web.py:3008 cps/web.py:3014 cps/web.py:3030
+#: cps/templates/admin.html:33 cps/web.py:3131 cps/web.py:3137 cps/web.py:3153
msgid "Add new user"
msgstr "Добавить пользователя"
-#: cps/web.py:3020
+#: cps/web.py:3143
#, python-format
msgid "User '%(user)s' created"
msgstr "Пользователь '%(user)s' добавлен"
-#: cps/web.py:3024
+#: cps/web.py:3147
msgid "Found an existing account for this e-mail address or nickname."
msgstr ""
-#: cps/web.py:3048 cps/web.py:3062
+#: cps/web.py:3171 cps/web.py:3185
msgid "E-mail server settings updated"
-msgstr ""
+msgstr "Настройки E-mail сервера обновлены"
-#: cps/web.py:3055
+#: cps/web.py:3178
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr ""
-#: cps/web.py:3058
+#: cps/web.py:3181
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr ""
-#: cps/web.py:3063
+#: cps/web.py:3186
msgid "Edit e-mail server settings"
-msgstr ""
+msgstr "Изменить настройки e-mail сервера"
-#: cps/web.py:3088
+#: cps/web.py:3211
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "Пользователь '%(nick)s' удалён"
-#: cps/web.py:3197
+#: cps/web.py:3320
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Пользователь '%(nick)s' обновлён"
-#: cps/web.py:3200
+#: cps/web.py:3323
msgid "An unknown error occured."
msgstr "Произошла неизвестная ошибка."
-#: cps/web.py:3202
+#: cps/web.py:3325
#, python-format
msgid "Edit User %(nick)s"
msgstr "Изменить пользователя %(nick)s"
-#: cps/web.py:3219
+#: cps/web.py:3342
#, python-format
msgid "Password for user %(user)s reset"
-msgstr ""
+msgstr "Пароль для пользователя %(user)s сброшен"
-#: cps/web.py:3239
+#: cps/web.py:3362
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr ""
-#: cps/web.py:3270 cps/web.py:3546 cps/web.py:3551 cps/web.py:3706
+#: cps/web.py:3390 cps/web.py:3667 cps/web.py:3672 cps/web.py:3827
msgid "edit metadata"
msgstr "изменить метаданные"
-#: cps/web.py:3284 cps/web.py:3576
+#: cps/web.py:3401 cps/web.py:3697
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr "Запрещена загрузка файлов с расширением '%(ext)s'"
-#: cps/web.py:3288 cps/web.py:3580
+#: cps/web.py:3405 cps/web.py:3701
msgid "File to be uploaded must have an extension"
msgstr "Загружаемый файл должен иметь расширение"
-#: cps/web.py:3300 cps/web.py:3600
+#: cps/web.py:3417 cps/web.py:3721
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr "Ошибка при создании пути %(path)s (доступ запрещён)"
-#: cps/web.py:3305
+#: cps/web.py:3422
#, python-format
msgid "Failed to store file %(file)s."
msgstr ""
-#: cps/web.py:3321
+#: cps/web.py:3438
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr ""
-#: cps/web.py:3339
+#: cps/web.py:3455
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr ""
-#: cps/web.py:3346
+#: cps/web.py:3462
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr ""
-#: cps/web.py:3349
+#: cps/web.py:3465
msgid "Cover-file is not a valid image file"
-msgstr ""
+msgstr "Файл обложки не соответствует изображению"
-#: cps/web.py:3362 cps/web.py:3366
+#: cps/web.py:3482 cps/web.py:3486
msgid "unknown"
msgstr "неизвестно"
-#: cps/web.py:3388
+#: cps/web.py:3508
msgid "Cover is not a jpg file, can't save"
+msgstr "Обложка не jpg файл, невозможно сохранить"
+
+#: cps/web.py:3554
+#, python-format
+msgid "%(langname)s is not a valid language"
msgstr ""
-#: cps/web.py:3555
+#: cps/web.py:3676
msgid "Error editing book, please check logfile for details"
-msgstr ""
+msgstr "Ошибка редактирования книги. Пожалуйста, проверьте лог-файл для дополнительной информации"
-#: cps/web.py:3605
+#: cps/web.py:3726
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr "Ошибка записи файоа %(file)s (доступ запрещён)"
-#: cps/web.py:3610
+#: cps/web.py:3731
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr "Ошибка удаления файла %(file)s (доступ запрещён)"
-#: cps/web.py:3692
+#: cps/web.py:3813
#, python-format
msgid "File %(file)s uploaded"
-msgstr ""
+msgstr "Файл %(file)s загружен"
-#: cps/web.py:3722
+#: cps/web.py:3843
msgid "Source or destination format for conversion missing"
msgstr ""
-#: cps/web.py:3732
+#: cps/web.py:3853
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr ""
-#: cps/web.py:3736
+#: cps/web.py:3857
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr ""
-#: cps/worker.py:215 cps/worker.py:387
+#: cps/worker.py:215 cps/worker.py:398
msgid "Started"
-msgstr ""
+msgstr "Начало"
-#: cps/worker.py:237
+#: cps/worker.py:251
#, python-format
msgid "Convertertool %(converter)s not found"
msgstr ""
-#: cps/worker.py:272
+#: cps/worker.py:287
#, python-format
msgid "Ebook-converter failed: %(error)s"
msgstr ""
-#: cps/worker.py:283
+#: cps/worker.py:298
#, python-format
msgid "Kindlegen failed with Error %(error)s. Message: %(message)s"
msgstr ""
-#: cps/worker.py:317 cps/worker.py:377 cps/worker.py:438
-msgid "Finished"
-msgstr ""
-
-#: cps/worker.py:344 cps/worker.py:363
+#: cps/worker.py:355 cps/worker.py:374
msgid "Waiting"
-msgstr ""
+msgstr "Ожидание"
-#: cps/worker.py:351
+#: cps/worker.py:362
msgid "This e-mail has been sent via Calibre-Web."
msgstr ""
-#: cps/worker.py:472
-msgid "Failed"
-msgstr ""
+#: cps/worker.py:388 cps/worker.py:484
+msgid "Finished"
+msgstr "Закончено"
-#: cps/templates/admin.html:4
+#: cps/worker.py:476
+msgid "Failed"
+msgstr "Неудачно"
+
+#: cps/templates/admin.html:6
msgid "User list"
msgstr "Список пользователей"
-#: cps/templates/admin.html:7
+#: cps/templates/admin.html:9
msgid "Nickname"
msgstr "Имя пользователя"
-#: cps/templates/admin.html:8
+#: cps/templates/admin.html:10
msgid "E-mail"
-msgstr ""
+msgstr "Почта"
-#: cps/templates/admin.html:9
+#: cps/templates/admin.html:11
msgid "Kindle"
msgstr "Kindle"
-#: cps/templates/admin.html:10
+#: cps/templates/admin.html:12
msgid "DLS"
msgstr "DLS"
-#: cps/templates/admin.html:11 cps/templates/layout.html:74
+#: cps/templates/admin.html:13 cps/templates/layout.html:74
msgid "Admin"
msgstr "Управление"
-#: cps/templates/admin.html:12 cps/templates/detail.html:22
+#: cps/templates/admin.html:14 cps/templates/detail.html:22
#: cps/templates/detail.html:31
msgid "Download"
msgstr "Скачать"
-#: cps/templates/admin.html:13 cps/templates/layout.html:64
+#: cps/templates/admin.html:15 cps/templates/layout.html:64
msgid "Upload"
msgstr "Загрузить"
-#: cps/templates/admin.html:14
+#: cps/templates/admin.html:16
msgid "Edit"
msgstr "Редактировать"
-#: cps/templates/admin.html:32
+#: cps/templates/admin.html:39
msgid "SMTP e-mail server settings"
-msgstr ""
+msgstr "Настройки SMTP-сервера"
-#: cps/templates/admin.html:35 cps/templates/email_edit.html:11
+#: cps/templates/admin.html:42 cps/templates/email_edit.html:11
msgid "SMTP hostname"
msgstr "SMTP-сервер"
-#: cps/templates/admin.html:36
+#: cps/templates/admin.html:43
msgid "SMTP port"
msgstr "SMTP-порт"
-#: cps/templates/admin.html:37
+#: cps/templates/admin.html:44
msgid "SSL"
msgstr "SSL"
-#: cps/templates/admin.html:38 cps/templates/email_edit.html:27
+#: cps/templates/admin.html:45 cps/templates/email_edit.html:27
msgid "SMTP login"
-msgstr ""
+msgstr "SMTP-логин"
-#: cps/templates/admin.html:39
+#: cps/templates/admin.html:46
msgid "From mail"
msgstr "Отправитель"
-#: cps/templates/admin.html:48
+#: cps/templates/admin.html:56
msgid "Change SMTP settings"
msgstr "Изменить настройки SMTP"
-#: cps/templates/admin.html:50
+#: cps/templates/admin.html:62
msgid "Configuration"
msgstr "Настройки сервера"
-#: cps/templates/admin.html:53
+#: cps/templates/admin.html:65
msgid "Calibre DB dir"
msgstr "Папка Calibre DB"
-#: cps/templates/admin.html:57
+#: cps/templates/admin.html:69
msgid "Log level"
msgstr ""
-#: cps/templates/admin.html:61
+#: cps/templates/admin.html:73
msgid "Port"
msgstr "Порт"
-#: cps/templates/admin.html:67 cps/templates/config_view_edit.html:23
+#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23
msgid "Books per page"
msgstr "Количество книг на странице"
-#: cps/templates/admin.html:71
+#: cps/templates/admin.html:83
msgid "Uploading"
msgstr "Загрузка на сервер"
-#: cps/templates/admin.html:75
+#: cps/templates/admin.html:87
msgid "Anonymous browsing"
msgstr ""
-#: cps/templates/admin.html:79
+#: cps/templates/admin.html:91
msgid "Public registration"
msgstr "Публичная регистрация"
-#: cps/templates/admin.html:83 cps/templates/remote_login.html:4
+#: cps/templates/admin.html:95 cps/templates/remote_login.html:4
msgid "Remote login"
-msgstr ""
+msgstr "Удалённый логин"
-#: cps/templates/admin.html:93
+#: cps/templates/admin.html:106
msgid "Administration"
msgstr "Управление"
-#: cps/templates/admin.html:94
-msgid "Current commit timestamp"
-msgstr ""
-
-#: cps/templates/admin.html:95
-msgid "Newest commit timestamp"
-msgstr ""
-
-#: cps/templates/admin.html:97
+#: cps/templates/admin.html:107
msgid "Reconnect to Calibre DB"
msgstr "Переподключиться к БД Calibre"
-#: cps/templates/admin.html:98
+#: cps/templates/admin.html:108
msgid "Restart Calibre-Web"
msgstr "Перезагрузить Calibre-Web"
-#: cps/templates/admin.html:99
+#: cps/templates/admin.html:109
msgid "Stop Calibre-Web"
msgstr "Остановить Calibre-Web"
-#: cps/templates/admin.html:100
+#: cps/templates/admin.html:115
+msgid "Update"
+msgstr ""
+
+#: cps/templates/admin.html:119
+msgid "Version"
+msgstr ""
+
+#: cps/templates/admin.html:120
+msgid "Details"
+msgstr ""
+
+#: cps/templates/admin.html:126
+msgid "Current version"
+msgstr ""
+
+#: cps/templates/admin.html:132
msgid "Check for update"
msgstr "Проверка обновлений"
-#: cps/templates/admin.html:101
+#: cps/templates/admin.html:133
msgid "Perform Update"
msgstr "Установить обновления"
-#: cps/templates/admin.html:110
+#: cps/templates/admin.html:145
msgid "Do you really want to restart Calibre-Web?"
msgstr "Вы действительно хотите перезагрузить Calibre-Web?"
-#: cps/templates/admin.html:115 cps/templates/admin.html:129
-#: cps/templates/admin.html:150 cps/templates/shelf.html:59
+#: cps/templates/admin.html:150 cps/templates/admin.html:164
+#: cps/templates/admin.html:184 cps/templates/shelf.html:59
msgid "Ok"
msgstr "Ok"
-#: cps/templates/admin.html:116 cps/templates/admin.html:130
+#: cps/templates/admin.html:151 cps/templates/admin.html:165
#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:164
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75
@@ -831,11 +866,11 @@ msgstr "Ok"
msgid "Back"
msgstr "Назад"
-#: cps/templates/admin.html:128
+#: cps/templates/admin.html:163
msgid "Do you really want to stop Calibre-Web?"
msgstr "Вы действительно хотите остановить Calibre-Web?"
-#: cps/templates/admin.html:141
+#: cps/templates/admin.html:175
msgid "Updating, please do not reload page"
msgstr "Установка обновлений, пожалуйста, не обновляйте страницу."
@@ -845,7 +880,7 @@ msgstr ""
#: cps/templates/author.html:23
msgid "In Library"
-msgstr ""
+msgstr "В библиотеке"
#: cps/templates/author.html:69
msgid "More by"
@@ -882,7 +917,7 @@ msgstr ""
#: cps/templates/book_edit.html:50
msgid "Convert book"
-msgstr ""
+msgstr "Конвертировать книгу"
#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6
msgid "Book Title"
@@ -916,14 +951,12 @@ msgid "Rating"
msgstr "Рейтинг"
#: cps/templates/book_edit.html:87
-msgid ""
-"Cover URL (jpg, cover is downloaded and stored in database, field is "
-"afterwards empty again)"
+msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)"
msgstr ""
#: cps/templates/book_edit.html:91
msgid "Upload Cover from local drive"
-msgstr ""
+msgstr "Загрузить обложку с диска"
#: cps/templates/book_edit.html:96 cps/templates/detail.html:131
msgid "Publishing date"
@@ -949,7 +982,7 @@ msgstr "Нет"
#: cps/templates/book_edit.html:164
msgid "Upload format"
-msgstr ""
+msgstr "Загружаемый формат"
#: cps/templates/book_edit.html:173
msgid "view book after edit"
@@ -1016,7 +1049,7 @@ msgstr ""
#: cps/templates/config_edit.html:12
msgid "Library Configuration"
-msgstr ""
+msgstr "Настройки библотеки"
#: cps/templates/config_edit.html:19
msgid "Location of Calibre database"
@@ -1028,11 +1061,11 @@ msgstr "Использовать Google Drive?"
#: cps/templates/config_edit.html:30
msgid "Google Drive config problem"
-msgstr ""
+msgstr "Проблема с настройкой Google Drive"
#: cps/templates/config_edit.html:36
msgid "Authenticate Google Drive"
-msgstr ""
+msgstr "Аутентификация Google Drive"
#: cps/templates/config_edit.html:40
msgid "Please finish Google Drive setup after login"
@@ -1048,11 +1081,11 @@ msgstr "Metadata Watch Channel ID"
#: cps/templates/config_edit.html:55
msgid "Revoke"
-msgstr ""
+msgstr "Отозвано"
#: cps/templates/config_edit.html:73
msgid "Server Configuration"
-msgstr ""
+msgstr "Настройки сервера"
#: cps/templates/config_edit.html:80
msgid "Server Port"
@@ -1068,7 +1101,7 @@ msgstr ""
#: cps/templates/config_edit.html:99
msgid "Logfile Configuration"
-msgstr ""
+msgstr "Настройки лог-файла"
#: cps/templates/config_edit.html:106
msgid "Log Level"
@@ -1096,11 +1129,11 @@ msgstr "Разрешить публичную регистрацию"
#: cps/templates/config_edit.html:146
msgid "Enable remote login (\"magic link\")"
-msgstr ""
+msgstr "Включить удаленный логин (\"magic link\")"
#: cps/templates/config_edit.html:151
msgid "Use"
-msgstr ""
+msgstr "Использовать"
#: cps/templates/config_edit.html:152
msgid "Obtain an API Key"
@@ -1149,7 +1182,7 @@ msgstr "Имя пользователя"
#: cps/templates/config_view_edit.html:12
msgid "View Configuration"
-msgstr ""
+msgstr "Просмотреть Конфигурацию"
#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133
#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7
@@ -1218,11 +1251,11 @@ msgstr "Показывать случайные книги"
#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:64
msgid "Show recent books"
-msgstr ""
+msgstr "Показывать недавние книги"
#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:68
msgid "Show sorted books"
-msgstr ""
+msgstr "Показывать отсортированные книги"
#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:72
msgid "Show hot books"
@@ -1258,7 +1291,7 @@ msgstr "Показывать случайные книги при просмот
#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:113
msgid "Show mature content"
-msgstr ""
+msgstr "Показывать взрослый контент"
#: cps/templates/detail.html:49
msgid "Read in browser"
@@ -1338,15 +1371,15 @@ msgstr ""
#: cps/templates/email_edit.html:55
msgid "Add Domain"
-msgstr ""
+msgstr "Добавить Домен"
#: cps/templates/email_edit.html:58
msgid "Add"
-msgstr ""
+msgstr "Добавить"
#: cps/templates/email_edit.html:72
msgid "Do you really want to delete this domain rule?"
-msgstr ""
+msgstr "Вы действительно желаете удалить это правило домена?"
#: cps/templates/feed.xml:21 cps/templates/layout.html:205
msgid "Next"
@@ -1415,7 +1448,7 @@ msgstr "Общие книжные полки"
#: cps/templates/index.xml:84
msgid "Books organized in public shelfs, visible to everyone"
-msgstr ""
+msgstr "Книги размещены на полках, и доступны всем"
#: cps/templates/index.xml:88 cps/templates/layout.html:170
msgid "Your Shelves"
@@ -1443,11 +1476,11 @@ msgstr "Зарегистрироваться"
#: cps/templates/layout.html:108
msgid "Uploading..."
-msgstr ""
+msgstr "Загружается..."
#: cps/templates/layout.html:109
msgid "please don't refresh the page"
-msgstr ""
+msgstr "пожалуйста не обновляйте страницу"
#: cps/templates/layout.html:120
msgid "Browse"
@@ -1464,15 +1497,15 @@ msgstr ""
#: cps/templates/layout.html:131 cps/templates/layout.html:132
#: cps/templates/layout.html:133 cps/templates/layout.html:134
msgid "Sort By"
-msgstr ""
+msgstr "Отсортировано по"
#: cps/templates/layout.html:131
msgid "Newest"
-msgstr ""
+msgstr "Новинки"
#: cps/templates/layout.html:132
msgid "Oldest"
-msgstr ""
+msgstr "Старое"
#: cps/templates/layout.html:133
msgid "Ascending"
@@ -1504,11 +1537,11 @@ msgstr "О программе"
#: cps/templates/layout.html:190
msgid "Previous"
-msgstr ""
+msgstr "Предыдущий"
#: cps/templates/layout.html:217
msgid "Book Details"
-msgstr ""
+msgstr "Подробнее о книге"
#: cps/templates/login.html:8 cps/templates/login.html:9
#: cps/templates/register.html:7 cps/templates/user_edit.html:8
@@ -1535,7 +1568,7 @@ msgstr ""
#: cps/templates/read.html:69 cps/templates/readcbr.html:79
#: cps/templates/readcbr.html:103
msgid "Settings"
-msgstr ""
+msgstr "Настройки"
#: cps/templates/read.html:72
msgid "Reflow text when sidebars are open."
@@ -1547,11 +1580,11 @@ msgstr ""
#: cps/templates/readcbr.html:87
msgid "Previous Page"
-msgstr ""
+msgstr "Предыдущая страница"
#: cps/templates/readcbr.html:88
msgid "Next Page"
-msgstr ""
+msgstr "Следующая страница"
#: cps/templates/readcbr.html:89
msgid "Scale to Best"
@@ -1571,43 +1604,43 @@ msgstr ""
#: cps/templates/readcbr.html:93
msgid "Rotate Right"
-msgstr ""
+msgstr "Повернуть Вправо"
#: cps/templates/readcbr.html:94
msgid "Rotate Left"
-msgstr ""
+msgstr "Повернуть Влево"
#: cps/templates/readcbr.html:95
msgid "Flip Image"
-msgstr ""
+msgstr "Перевернуть изображение"
#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:41
msgid "Theme"
-msgstr ""
+msgstr "Тема"
#: cps/templates/readcbr.html:111
msgid "Light"
-msgstr ""
+msgstr "Светлая"
#: cps/templates/readcbr.html:112
msgid "Dark"
-msgstr ""
+msgstr "Темная"
#: cps/templates/readcbr.html:117
msgid "Scale"
-msgstr ""
+msgstr "Масштаб"
#: cps/templates/readcbr.html:120
msgid "Best"
-msgstr ""
+msgstr "Лучшее"
#: cps/templates/readcbr.html:121
msgid "Width"
-msgstr ""
+msgstr "Ширина"
#: cps/templates/readcbr.html:122
msgid "Height"
-msgstr ""
+msgstr "Длина"
#: cps/templates/readcbr.html:123
msgid "Native"
@@ -1615,19 +1648,19 @@ msgstr ""
#: cps/templates/readcbr.html:128
msgid "Rotate"
-msgstr ""
+msgstr "Повернуть"
#: cps/templates/readcbr.html:139
msgid "Flip"
-msgstr ""
+msgstr "Перевернуть"
#: cps/templates/readcbr.html:142
msgid "Horizontal"
-msgstr ""
+msgstr "Горизонтально"
#: cps/templates/readcbr.html:143
msgid "Vertical"
-msgstr ""
+msgstr "Вертикально"
#: cps/templates/readpdf.html:29
msgid "PDF.js viewer"
@@ -1651,7 +1684,7 @@ msgstr "Выберите пароль"
#: cps/templates/register.html:15 cps/templates/user_edit.html:13
msgid "E-mail address"
-msgstr ""
+msgstr "E-mail адрес"
#: cps/templates/register.html:16
msgid "Your email address"
@@ -1683,11 +1716,11 @@ msgstr "Результаты для:"
#: cps/templates/search_form.html:19
msgid "Publishing date from"
-msgstr ""
+msgstr "Опубликовано от"
#: cps/templates/search_form.html:26
msgid "Publishing date to"
-msgstr ""
+msgstr "Опубликовано до"
#: cps/templates/search_form.html:43
msgid "Exclude Tags"
@@ -1703,11 +1736,11 @@ msgstr "Исключить языки"
#: cps/templates/search_form.html:97
msgid "Rating bigger than"
-msgstr ""
+msgstr "Рейтинг больше чем"
#: cps/templates/search_form.html:101
msgid "Rating less than"
-msgstr ""
+msgstr "Рейтинг меньше чем"
#: cps/templates/shelf.html:7
msgid "Delete this Shelf"
@@ -1715,7 +1748,7 @@ msgstr "Удалить эту книжную полку"
#: cps/templates/shelf.html:8
msgid "Edit Shelf"
-msgstr ""
+msgstr "Изменить Полку"
#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11
msgid "Change order"
@@ -1771,43 +1804,43 @@ msgstr "Версия"
#: cps/templates/tasks.html:7
msgid "Tasks list"
-msgstr ""
+msgstr "Список задач"
#: cps/templates/tasks.html:12
msgid "User"
-msgstr ""
+msgstr "Пользователь"
#: cps/templates/tasks.html:14
msgid "Task"
-msgstr ""
+msgstr "Залача"
#: cps/templates/tasks.html:15
msgid "Status"
-msgstr ""
+msgstr "Статус"
#: cps/templates/tasks.html:16
msgid "Progress"
-msgstr ""
+msgstr "Прогресс"
#: cps/templates/tasks.html:17
msgid "Runtime"
-msgstr ""
+msgstr "Время выполнения"
#: cps/templates/tasks.html:18
msgid "Starttime"
-msgstr ""
+msgstr "Время начала"
#: cps/templates/tasks.html:24
msgid "Delete finished tasks"
-msgstr ""
+msgstr "Удалить законченные задачи"
#: cps/templates/tasks.html:25
msgid "Hide all tasks"
-msgstr ""
+msgstr "Скрыть все задачи"
#: cps/templates/user_edit.html:18
msgid "Reset user Password"
-msgstr ""
+msgstr "Сбросить пароль пользователя"
#: cps/templates/user_edit.html:29
msgid "Kindle E-Mail"
@@ -1815,7 +1848,7 @@ msgstr "Адрес почты Kindle"
#: cps/templates/user_edit.html:43
msgid "Standard Theme"
-msgstr ""
+msgstr "Стандартная тема"
#: cps/templates/user_edit.html:44
msgid "caliBlur! Dark Theme (Beta)"
@@ -1837,38 +1870,12 @@ msgstr "Удалить этого пользователя"
msgid "Recent Downloads"
msgstr "Недавние скачивания"
-#~ msgid "%s: %s"
+#~ msgid "E-mail: %s"
+#~ msgstr "Почта: %s"
+
+#~ msgid "Current commit timestamp"
#~ msgstr ""
-#~ msgid "E-Mail: %s"
+#~ msgid "Newest commit timestamp"
#~ msgstr ""
-#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
-#~ msgstr ""
-
-#~ msgid ""
-#~ "Rename author from: '%(src)s' to "
-#~ "'%(dest)s' failed with error: %(error)s"
-#~ msgstr ""
-
-#~ msgid "Password for user %(user)s reset"
-#~ msgstr ""
-
-#~ msgid "Password for user %s reset"
-#~ msgstr ""
-
-#~ msgid "Rename title from: '%(src)s' to '%(src)s' failed with error: %(error)s"
-#~ msgstr ""
-
-#~ msgid "Rename author from: '%(src)s' to '%(src)s' failed with error: %(error)s"
-#~ msgstr ""
-
-#~ msgid "Failed to create path for cover %(cover)s (Permission denied)."
-#~ msgstr ""
-
-#~ msgid "File extension '%s' is not allowed to be uploaded to this server"
-#~ msgstr ""
-
-#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server"
-#~ msgstr "Запрещена загрузка файлов с расширением \"%(ext)s\""
-
diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po
index 7ac69625..3b3f8575 100644
--- a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po
+++ b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po
@@ -3,19 +3,11 @@
# This file is distributed under the same license as the Calibre-Web
# project.
# FIRST AUTHOR dalin , 2017.
-# # Translation template file..
-# Copyright (C) 2011 Kovid Goyal
-#
-# Translators:
-# Alastair McKinstry , 2001
-# LI Daobing , 2007-2008
-# nature , 2015
-# Wang Vincent , 2016
msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2018-09-08 14:49+0200\n"
+"POT-Creation-Date: 2018-09-14 21:11+0200\n"
"PO-Revision-Date: 2017-01-06 17:00+0000\n"
"Last-Translator: dalin \n"
"Language: zh_Hans_CN\n"
@@ -122,707 +114,750 @@ msgstr "执行UnRar时出错"
msgid "Unrar binary file not found"
msgstr "找不到Unrar二进制文件"
-#: cps/web.py:1114
+#: cps/web.py:1112 cps/web.py:2778
+msgid "Unknown"
+msgstr "未知"
+
+#: cps/web.py:1121 cps/web.py:1152
+msgid "HTTP Error"
+msgstr ""
+
+#: cps/web.py:1123 cps/web.py:1154
+msgid "Connection error"
+msgstr ""
+
+#: cps/web.py:1125 cps/web.py:1156
+msgid "Timeout while establishing connection"
+msgstr ""
+
+#: cps/web.py:1127 cps/web.py:1158
+msgid "General error"
+msgstr ""
+
+#: cps/web.py:1133
+msgid "Unexpected data while reading update information"
+msgstr ""
+
+#: cps/web.py:1140
+msgid "No update available. You already have the latest version installed"
+msgstr ""
+
+#: cps/web.py:1165
+msgid "A new update is available. Click on the button below to update to the latest version."
+msgstr ""
+
+#: cps/web.py:1215
+msgid "Could not fetch update information"
+msgstr ""
+
+#: cps/web.py:1230
msgid "Requesting update package"
msgstr "正在请求更新包"
-#: cps/web.py:1115
+#: cps/web.py:1231
msgid "Downloading update package"
msgstr "正在下载更新包"
-#: cps/web.py:1116
+#: cps/web.py:1232
msgid "Unzipping update package"
msgstr "正在解压更新包"
-#: cps/web.py:1117
+#: cps/web.py:1233
msgid "Files are replaced"
msgstr "文件已替换"
-#: cps/web.py:1118
+#: cps/web.py:1234
msgid "Database connections are closed"
msgstr "数据库连接已关闭"
-#: cps/web.py:1119
+#: cps/web.py:1235
msgid "Server is stopped"
msgstr "服务器已停止"
-#: cps/web.py:1120
+#: cps/web.py:1236
msgid "Update finished, please press okay and reload page"
msgstr "更新完成,请按确定并刷新页面"
-#: cps/web.py:1140
+#: cps/web.py:1256
msgid "Recently Added Books"
msgstr "最近添加的书籍"
-#: cps/web.py:1150
+#: cps/web.py:1266
msgid "Newest Books"
msgstr "最新书籍"
-#: cps/web.py:1162
+#: cps/web.py:1278
msgid "Oldest Books"
msgstr "最旧书籍"
-#: cps/web.py:1174
+#: cps/web.py:1290
msgid "Books (A-Z)"
msgstr "书籍 (A-Z)"
-#: cps/web.py:1185
+#: cps/web.py:1301
msgid "Books (Z-A)"
msgstr "书籍 (Z-A)"
-#: cps/web.py:1214
+#: cps/web.py:1330
msgid "Hot Books (most downloaded)"
msgstr "热门书籍(最多下载)"
-#: cps/web.py:1227
+#: cps/web.py:1343
msgid "Best rated books"
msgstr "最高评分书籍"
-#: cps/templates/index.xml:36 cps/web.py:1239
+#: cps/templates/index.xml:36 cps/web.py:1355
msgid "Random Books"
msgstr "随机书籍"
-#: cps/web.py:1254
+#: cps/web.py:1370
msgid "Author list"
msgstr "作者列表"
-#: cps/web.py:1266 cps/web.py:1329 cps/web.py:1484 cps/web.py:2036
+#: cps/web.py:1382 cps/web.py:1445 cps/web.py:1600 cps/web.py:2152
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "无法打开电子书。 文件不存在或者文件不可访问:"
-#: cps/templates/index.xml:73 cps/web.py:1313
+#: cps/templates/index.xml:73 cps/web.py:1429
msgid "Series list"
msgstr "丛书列表"
-#: cps/web.py:1327
+#: cps/web.py:1443
#, python-format
msgid "Series: %(serie)s"
msgstr "丛书: %(serie)s"
-#: cps/web.py:1354
+#: cps/web.py:1470
msgid "Available languages"
msgstr "可用语言"
-#: cps/web.py:1371
+#: cps/web.py:1487
#, python-format
msgid "Language: %(name)s"
msgstr "语言: %(name)s"
-#: cps/templates/index.xml:66 cps/web.py:1382
+#: cps/templates/index.xml:66 cps/web.py:1498
msgid "Category list"
msgstr "分类列表"
-#: cps/web.py:1396
+#: cps/web.py:1512
#, python-format
msgid "Category: %(name)s"
msgstr "分类: %(name)s"
-#: cps/templates/layout.html:71 cps/web.py:1535
+#: cps/templates/layout.html:71 cps/web.py:1651
msgid "Tasks"
msgstr "任务"
-#: cps/web.py:1565
+#: cps/web.py:1681
msgid "Statistics"
msgstr "统计"
-#: cps/web.py:1670
-msgid ""
-"Callback domain is not verified, please follow steps to verify domain in "
-"google developer console"
+#: cps/web.py:1786
+msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr "回调域名尚未被校验,请在google开发者控制台按步骤校验域名"
-#: cps/web.py:1746
+#: cps/web.py:1861
msgid "Server restarted, please reload page"
msgstr "服务器已重启,请刷新页面"
-#: cps/web.py:1749
+#: cps/web.py:1864
msgid "Performing shutdown of server, please close window"
msgstr "正在关闭服务器,请关闭窗口"
-#: cps/web.py:1767
+#: cps/web.py:1883
msgid "Update done"
msgstr "更新完成"
-#: cps/web.py:1837
+#: cps/web.py:1953
msgid "Published after "
msgstr ""
-#: cps/web.py:1844
+#: cps/web.py:1960
msgid "Published before "
msgstr "出版时早于 "
-#: cps/web.py:1858
+#: cps/web.py:1974
#, python-format
msgid "Rating <= %(rating)s"
msgstr "评分 <= %(rating)s"
-#: cps/web.py:1860
+#: cps/web.py:1976
#, python-format
msgid "Rating >= %(rating)s"
msgstr "评分 >= %(rating)s"
-#: cps/web.py:1919 cps/web.py:1928
+#: cps/web.py:2035 cps/web.py:2044
msgid "search"
msgstr "搜索"
#: cps/templates/index.xml:44 cps/templates/index.xml:48
-#: cps/templates/layout.html:146 cps/web.py:1995
+#: cps/templates/layout.html:146 cps/web.py:2111
msgid "Read Books"
msgstr "已读书籍"
#: cps/templates/index.xml:52 cps/templates/index.xml:56
-#: cps/templates/layout.html:148 cps/web.py:1998
+#: cps/templates/layout.html:148 cps/web.py:2114
msgid "Unread Books"
msgstr "未读书籍"
-#: cps/web.py:2046 cps/web.py:2048 cps/web.py:2050 cps/web.py:2062
+#: cps/web.py:2162 cps/web.py:2164 cps/web.py:2166 cps/web.py:2178
msgid "Read a Book"
msgstr "阅读一本书"
-#: cps/web.py:2128 cps/web.py:3006
+#: cps/web.py:2244 cps/web.py:3129
msgid "Please fill out all fields!"
msgstr "请填写所有字段"
-#: cps/web.py:2129 cps/web.py:2150 cps/web.py:2154 cps/web.py:2159
-#: cps/web.py:2161
+#: cps/web.py:2245 cps/web.py:2266 cps/web.py:2270 cps/web.py:2275
+#: cps/web.py:2277
msgid "register"
msgstr "注册"
-#: cps/web.py:2149 cps/web.py:3222
+#: cps/web.py:2265 cps/web.py:3345
msgid "An unknown error occurred. Please try again later."
msgstr "发生一个未知错误,请稍后再试。"
-#: cps/web.py:2152
+#: cps/web.py:2268
msgid "Your e-mail is not allowed to register"
msgstr "您的邮箱不能用来注册"
-#: cps/web.py:2155
+#: cps/web.py:2271
msgid "Confirmation e-mail was send to your e-mail account."
msgstr "确认邮件已经发送到您的邮箱。"
-#: cps/web.py:2158
+#: cps/web.py:2274
msgid "This username or e-mail address is already in use."
msgstr "这个用户名或者邮箱已经被使用。"
-#: cps/web.py:2175 cps/web.py:2271
+#: cps/web.py:2291 cps/web.py:2387
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "您现在已以'%(nickname)s'身份登录"
-#: cps/web.py:2180
+#: cps/web.py:2296
msgid "Wrong Username or Password"
msgstr "用户名或密码错误"
-#: cps/web.py:2186 cps/web.py:2207
+#: cps/web.py:2302 cps/web.py:2323
msgid "login"
msgstr "登录"
-#: cps/web.py:2219 cps/web.py:2250
+#: cps/web.py:2335 cps/web.py:2366
msgid "Token not found"
msgstr "找不到Token"
-#: cps/web.py:2227 cps/web.py:2258
+#: cps/web.py:2343 cps/web.py:2374
msgid "Token has expired"
msgstr "Token已过期"
-#: cps/web.py:2235
+#: cps/web.py:2351
msgid "Success! Please return to your device"
msgstr "成功!请返回您的设备"
-#: cps/web.py:2285
+#: cps/web.py:2401
msgid "Please configure the SMTP mail settings first..."
msgstr "请先配置SMTP邮箱..."
-#: cps/web.py:2289
+#: cps/web.py:2405
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "书籍已经被成功加入 %(kindlemail)s 的发送队列"
-#: cps/web.py:2293
+#: cps/web.py:2409
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "发送这本书的时候出现错误: %(res)s"
-#: cps/web.py:2295 cps/web.py:3060
+#: cps/web.py:2411 cps/web.py:3183
msgid "Please configure your kindle e-mail address first..."
msgstr "请先配置您的kindle邮箱..."
-#: cps/web.py:2339
+#: cps/web.py:2455
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "此书已被添加到书架: %(sname)s"
-#: cps/web.py:2350
+#: cps/web.py:2466
msgid "Invalid shelf specified"
msgstr "指定的书架无效"
-#: cps/web.py:2355
+#: cps/web.py:2471
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr "您没有添加书籍到书架 %(name)s 的权限"
-#: cps/web.py:2360
+#: cps/web.py:2476
msgid "User is not allowed to edit public shelves"
msgstr "用户没有编辑公开书架的权限"
-#: cps/web.py:2378
+#: cps/web.py:2494
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr "书籍已经在书架 %(name)s 中了"
-#: cps/web.py:2392
+#: cps/web.py:2508
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr "书籍已经被添加到书架 %(sname)s 中'"
-#: cps/web.py:2394
+#: cps/web.py:2510
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr "无法添加书籍到书架: %(sname)s"
-#: cps/web.py:2431
+#: cps/web.py:2547
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "此书已从书架 %(sname)s 中删除"
-#: cps/web.py:2437
+#: cps/web.py:2553
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr "对不起,您没有从书架 %(sname)s 中删除书籍的权限"
-#: cps/web.py:2457 cps/web.py:2481
+#: cps/web.py:2573 cps/web.py:2597
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "已存在书架 '%(title)s'。"
-#: cps/web.py:2462
+#: cps/web.py:2578
#, python-format
msgid "Shelf %(title)s created"
msgstr "书架 %(title)s 已被创建"
-#: cps/web.py:2464 cps/web.py:2492
+#: cps/web.py:2580 cps/web.py:2608
msgid "There was an error"
msgstr "发生错误"
-#: cps/web.py:2465 cps/web.py:2467
+#: cps/web.py:2581 cps/web.py:2583
msgid "create a shelf"
msgstr "创建书架"
-#: cps/web.py:2490
+#: cps/web.py:2606
#, python-format
msgid "Shelf %(title)s changed"
msgstr "书架 %(title)s 已被修改"
-#: cps/web.py:2493 cps/web.py:2495
+#: cps/web.py:2609 cps/web.py:2611
msgid "Edit a shelf"
msgstr "编辑书架"
-#: cps/web.py:2516
+#: cps/web.py:2632
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "成功删除书架 %(name)s"
-#: cps/web.py:2538
+#: cps/web.py:2659
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "书架: '%(name)s'"
-#: cps/web.py:2541
+#: cps/web.py:2662
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr "打开书架出错。书架不存在或不可访问"
-#: cps/web.py:2572
+#: cps/web.py:2693
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "修改书架 '%(name)s' 顺序"
-#: cps/web.py:2601 cps/web.py:3012
+#: cps/web.py:2722 cps/web.py:3135
msgid "E-mail is not from valid domain"
msgstr "邮箱不在有效域中'"
-#: cps/web.py:2603 cps/web.py:2644 cps/web.py:2647
+#: cps/web.py:2724 cps/web.py:2765 cps/web.py:2768
#, python-format
msgid "%(name)s's profile"
msgstr "%(name)s 的资料"
-#: cps/web.py:2642
+#: cps/web.py:2763
msgid "Found an existing account for this e-mail address."
msgstr "找到一个已有账号使用这个邮箱。"
-#: cps/web.py:2645
+#: cps/web.py:2766
msgid "Profile updated"
msgstr "资料已更新"
-#: cps/web.py:2657
-msgid "Unknown"
-msgstr "未知"
-
-#: cps/web.py:2671
+#: cps/web.py:2794
msgid "Admin page"
msgstr "管理页"
-#: cps/web.py:2749 cps/web.py:2922
+#: cps/web.py:2872 cps/web.py:3045
msgid "Calibre-Web configuration updated"
msgstr "Calibre-Web配置已更新"
-#: cps/templates/admin.html:91 cps/web.py:2762
+#: cps/templates/admin.html:100 cps/web.py:2885
msgid "UI Configuration"
msgstr "UI配置"
-#: cps/web.py:2780
+#: cps/web.py:2903
msgid "Import of optional Google Drive requirements missing"
msgstr "可选的Google Drive依赖导入缺失"
-#: cps/web.py:2783
+#: cps/web.py:2906
msgid "client_secrets.json is missing or not readable"
msgstr "client_secrets.json文件缺失或不可读"
-#: cps/web.py:2788 cps/web.py:2815
+#: cps/web.py:2911 cps/web.py:2938
msgid "client_secrets.json is not configured for web application"
msgstr "没有为web应用配置client_secrets.json"
-#: cps/templates/admin.html:90 cps/web.py:2818 cps/web.py:2844 cps/web.py:2856
-#: cps/web.py:2898 cps/web.py:2913 cps/web.py:2930 cps/web.py:2937
-#: cps/web.py:2954
+#: cps/templates/admin.html:99 cps/web.py:2941 cps/web.py:2967 cps/web.py:2979
+#: cps/web.py:3021 cps/web.py:3036 cps/web.py:3053 cps/web.py:3060
+#: cps/web.py:3077
msgid "Basic Configuration"
msgstr "基本配置"
-#: cps/web.py:2841
+#: cps/web.py:2964
msgid "Keyfile location is not valid, please enter correct path"
msgstr "key文件位置无效,请输入正确路径"
-#: cps/web.py:2853
+#: cps/web.py:2976
msgid "Certfile location is not valid, please enter correct path"
msgstr "证书文件位置无效,请输入正确路径"
-#: cps/web.py:2895
+#: cps/web.py:3018
msgid "Logfile location is not valid, please enter correct path"
msgstr "日志文件位置无效,请输入正确路径"
-#: cps/web.py:2934
+#: cps/web.py:3057
msgid "DB location is not valid, please enter correct path"
msgstr "DB位置无效,请输入正确路径"
-#: cps/templates/admin.html:31 cps/web.py:3008 cps/web.py:3014 cps/web.py:3030
+#: cps/templates/admin.html:33 cps/web.py:3131 cps/web.py:3137 cps/web.py:3153
msgid "Add new user"
msgstr "添加新用户"
-#: cps/web.py:3020
+#: cps/web.py:3143
#, python-format
msgid "User '%(user)s' created"
msgstr "用户 '%(user)s' 已被创建"
-#: cps/web.py:3024
+#: cps/web.py:3147
msgid "Found an existing account for this e-mail address or nickname."
msgstr "此邮箱或昵称的账号已经存在。"
-#: cps/web.py:3048 cps/web.py:3062
+#: cps/web.py:3171 cps/web.py:3185
msgid "E-mail server settings updated"
msgstr "已更新邮件服务器设置"
-#: cps/web.py:3055
+#: cps/web.py:3178
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr "测试邮件已经被成功发到 %(kindlemail)s"
-#: cps/web.py:3058
+#: cps/web.py:3181
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr "发送测试邮件出错了: %(res)s"
-#: cps/web.py:3063
+#: cps/web.py:3186
msgid "Edit e-mail server settings"
msgstr "编辑邮箱服务器设置"
-#: cps/web.py:3088
+#: cps/web.py:3211
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "用户 '%(nick)s' 已被删除"
-#: cps/web.py:3197
+#: cps/web.py:3320
#, python-format
msgid "User '%(nick)s' updated"
msgstr "用户 '%(nick)s' 已被更新"
-#: cps/web.py:3200
+#: cps/web.py:3323
msgid "An unknown error occured."
msgstr "发生未知错误。"
-#: cps/web.py:3202
+#: cps/web.py:3325
#, python-format
msgid "Edit User %(nick)s"
msgstr "编辑用户 %(nick)s"
-#: cps/web.py:3219
+#: cps/web.py:3342
#, python-format
msgid "Password for user %(user)s reset"
msgstr "用户 %(user)s 的密码已重置"
-#: cps/web.py:3239
+#: cps/web.py:3362
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr "打开电子书出错。文件不存在或不可访问"
-#: cps/web.py:3270 cps/web.py:3546 cps/web.py:3551 cps/web.py:3706
+#: cps/web.py:3390 cps/web.py:3667 cps/web.py:3672 cps/web.py:3827
msgid "edit metadata"
msgstr "编辑元数据"
-#: cps/web.py:3284 cps/web.py:3576
+#: cps/web.py:3401 cps/web.py:3697
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr "不能上传后缀为 '%(ext)s' 的文件到此服务器"
-#: cps/web.py:3288 cps/web.py:3580
+#: cps/web.py:3405 cps/web.py:3701
msgid "File to be uploaded must have an extension"
msgstr "要上传的文件必须有一个后缀"
-#: cps/web.py:3300 cps/web.py:3600
+#: cps/web.py:3417 cps/web.py:3721
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr "创建路径 %(path)s 失败(权限拒绝)。"
-#: cps/web.py:3305
+#: cps/web.py:3422
#, python-format
msgid "Failed to store file %(file)s."
msgstr "保存文件 %(file)s 失败。"
-#: cps/web.py:3321
+#: cps/web.py:3438
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr "已添加 %(ext)s 格式到 %(book)s"
-#: cps/web.py:3339
+#: cps/web.py:3455
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr ""
-#: cps/web.py:3346
+#: cps/web.py:3462
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr "保存封面文件 %(cover)s 失败。"
-#: cps/web.py:3349
+#: cps/web.py:3465
msgid "Cover-file is not a valid image file"
msgstr "封面文件不是一个有效的图片文件"
-#: cps/web.py:3362 cps/web.py:3366
+#: cps/web.py:3482 cps/web.py:3486
msgid "unknown"
msgstr "未知"
-#: cps/web.py:3388
+#: cps/web.py:3508
msgid "Cover is not a jpg file, can't save"
msgstr "封面不是一个jpg文件,无法保存"
-#: cps/web.py:3555
+#: cps/web.py:3554
+#, python-format
+msgid "%(langname)s is not a valid language"
+msgstr ""
+
+#: cps/web.py:3676
msgid "Error editing book, please check logfile for details"
msgstr "编辑书籍出错,详情请检查日志文件"
-#: cps/web.py:3605
+#: cps/web.py:3726
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr "存储文件 %(file)s 失败(权限拒绝)。"
-#: cps/web.py:3610
+#: cps/web.py:3731
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr "删除文件 %(file)s 失败(权限拒绝)。"
-#: cps/web.py:3692
+#: cps/web.py:3813
#, python-format
msgid "File %(file)s uploaded"
msgstr "文件 %(file)s 已上传"
-#: cps/web.py:3722
+#: cps/web.py:3843
msgid "Source or destination format for conversion missing"
msgstr "转换的源或目的格式缺失"
-#: cps/web.py:3732
+#: cps/web.py:3853
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr "书籍已经被成功加入 %(book_format)s 的转换队列"
-#: cps/web.py:3736
+#: cps/web.py:3857
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr "转换此书时出现错误: %(res)s"
-#: cps/worker.py:215 cps/worker.py:387
+#: cps/worker.py:215 cps/worker.py:398
msgid "Started"
msgstr "已开始"
-#: cps/worker.py:237
+#: cps/worker.py:251
#, python-format
msgid "Convertertool %(converter)s not found"
msgstr "找不到转换工具 $(converter)s"
-#: cps/worker.py:272
+#: cps/worker.py:287
#, python-format
msgid "Ebook-converter failed: %(error)s"
msgstr "电子书转换器失败: %(error)s"
-#: cps/worker.py:283
+#: cps/worker.py:298
#, python-format
msgid "Kindlegen failed with Error %(error)s. Message: %(message)s"
msgstr "Kindlegen 因为错误 %(error)s 失败。消息: %(message)s"
-#: cps/worker.py:317 cps/worker.py:377 cps/worker.py:438
-msgid "Finished"
-msgstr "已完成"
-
-#: cps/worker.py:344 cps/worker.py:363
+#: cps/worker.py:355 cps/worker.py:374
msgid "Waiting"
msgstr "等待中"
-#: cps/worker.py:351
+#: cps/worker.py:362
msgid "This e-mail has been sent via Calibre-Web."
msgstr "此邮件已经通过Calibre-Web发送"
-#: cps/worker.py:472
+#: cps/worker.py:388 cps/worker.py:484
+msgid "Finished"
+msgstr "已完成"
+
+#: cps/worker.py:476
msgid "Failed"
msgstr "失败"
-#: cps/templates/admin.html:4
+#: cps/templates/admin.html:6
msgid "User list"
msgstr "用户列表"
-#: cps/templates/admin.html:7
+#: cps/templates/admin.html:9
msgid "Nickname"
msgstr "昵称"
-#: cps/templates/admin.html:8
+#: cps/templates/admin.html:10
msgid "E-mail"
msgstr ""
-#: cps/templates/admin.html:9
+#: cps/templates/admin.html:11
msgid "Kindle"
msgstr ""
-#: cps/templates/admin.html:10
+#: cps/templates/admin.html:12
msgid "DLS"
msgstr ""
-#: cps/templates/admin.html:11 cps/templates/layout.html:74
+#: cps/templates/admin.html:13 cps/templates/layout.html:74
msgid "Admin"
msgstr "管理"
-#: cps/templates/admin.html:12 cps/templates/detail.html:22
+#: cps/templates/admin.html:14 cps/templates/detail.html:22
#: cps/templates/detail.html:31
msgid "Download"
msgstr "下载"
-#: cps/templates/admin.html:13 cps/templates/layout.html:64
+#: cps/templates/admin.html:15 cps/templates/layout.html:64
msgid "Upload"
msgstr "上传"
-#: cps/templates/admin.html:14
+#: cps/templates/admin.html:16
msgid "Edit"
msgstr "编辑"
-#: cps/templates/admin.html:32
+#: cps/templates/admin.html:39
msgid "SMTP e-mail server settings"
msgstr "SMTP邮件服务器设置"
-#: cps/templates/admin.html:35 cps/templates/email_edit.html:11
+#: cps/templates/admin.html:42 cps/templates/email_edit.html:11
msgid "SMTP hostname"
msgstr "SMTP地址"
-#: cps/templates/admin.html:36
+#: cps/templates/admin.html:43
msgid "SMTP port"
msgstr "SMTP端口"
-#: cps/templates/admin.html:37
+#: cps/templates/admin.html:44
msgid "SSL"
msgstr ""
-#: cps/templates/admin.html:38 cps/templates/email_edit.html:27
+#: cps/templates/admin.html:45 cps/templates/email_edit.html:27
msgid "SMTP login"
msgstr "SMTP用户名"
-#: cps/templates/admin.html:39
+#: cps/templates/admin.html:46
msgid "From mail"
msgstr "来自邮箱"
-#: cps/templates/admin.html:48
+#: cps/templates/admin.html:56
msgid "Change SMTP settings"
msgstr "修改SMTP设置"
-#: cps/templates/admin.html:50
+#: cps/templates/admin.html:62
msgid "Configuration"
msgstr "配置"
-#: cps/templates/admin.html:53
+#: cps/templates/admin.html:65
msgid "Calibre DB dir"
msgstr "Calibre DB目录"
-#: cps/templates/admin.html:57
+#: cps/templates/admin.html:69
msgid "Log level"
msgstr "日志级别"
-#: cps/templates/admin.html:61
+#: cps/templates/admin.html:73
msgid "Port"
msgstr "端口"
-#: cps/templates/admin.html:67 cps/templates/config_view_edit.html:23
+#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23
msgid "Books per page"
msgstr "每页书籍数"
-#: cps/templates/admin.html:71
+#: cps/templates/admin.html:83
msgid "Uploading"
msgstr "上传"
-#: cps/templates/admin.html:75
+#: cps/templates/admin.html:87
msgid "Anonymous browsing"
msgstr "匿名浏览"
-#: cps/templates/admin.html:79
+#: cps/templates/admin.html:91
msgid "Public registration"
msgstr "开放注册"
-#: cps/templates/admin.html:83 cps/templates/remote_login.html:4
+#: cps/templates/admin.html:95 cps/templates/remote_login.html:4
msgid "Remote login"
msgstr "远程登录"
-#: cps/templates/admin.html:93
+#: cps/templates/admin.html:106
msgid "Administration"
msgstr "管理"
-#: cps/templates/admin.html:94
-msgid "Current commit timestamp"
-msgstr "当前提交时间戳"
-
-#: cps/templates/admin.html:95
-msgid "Newest commit timestamp"
-msgstr "最新提交时间戳"
-
-#: cps/templates/admin.html:97
+#: cps/templates/admin.html:107
msgid "Reconnect to Calibre DB"
msgstr "重新连接到Calibre数据库"
-#: cps/templates/admin.html:98
+#: cps/templates/admin.html:108
msgid "Restart Calibre-Web"
msgstr "重启 Calibre-Web"
-#: cps/templates/admin.html:99
+#: cps/templates/admin.html:109
msgid "Stop Calibre-Web"
msgstr "停止 Calibre-Web"
-#: cps/templates/admin.html:100
+#: cps/templates/admin.html:115
+msgid "Update"
+msgstr ""
+
+#: cps/templates/admin.html:119
+msgid "Version"
+msgstr ""
+
+#: cps/templates/admin.html:120
+msgid "Details"
+msgstr ""
+
+#: cps/templates/admin.html:126
+msgid "Current version"
+msgstr ""
+
+#: cps/templates/admin.html:132
msgid "Check for update"
msgstr "检查更新"
-#: cps/templates/admin.html:101
+#: cps/templates/admin.html:133
msgid "Perform Update"
msgstr "执行更新"
-#: cps/templates/admin.html:110
+#: cps/templates/admin.html:145
msgid "Do you really want to restart Calibre-Web?"
msgstr "您确定要重启 Calibre-Web 吗?"
-#: cps/templates/admin.html:115 cps/templates/admin.html:129
-#: cps/templates/admin.html:150 cps/templates/shelf.html:59
+#: cps/templates/admin.html:150 cps/templates/admin.html:164
+#: cps/templates/admin.html:184 cps/templates/shelf.html:59
msgid "Ok"
msgstr "确定"
-#: cps/templates/admin.html:116 cps/templates/admin.html:130
+#: cps/templates/admin.html:151 cps/templates/admin.html:165
#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:164
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75
@@ -831,11 +866,11 @@ msgstr "确定"
msgid "Back"
msgstr "后退"
-#: cps/templates/admin.html:128
+#: cps/templates/admin.html:163
msgid "Do you really want to stop Calibre-Web?"
msgstr "您确定要关闭 Calibre-Web 吗?"
-#: cps/templates/admin.html:141
+#: cps/templates/admin.html:175
msgid "Updating, please do not reload page"
msgstr "正在更新,请不要刷新页面"
@@ -916,9 +951,7 @@ msgid "Rating"
msgstr "评分"
#: cps/templates/book_edit.html:87
-msgid ""
-"Cover URL (jpg, cover is downloaded and stored in database, field is "
-"afterwards empty again)"
+msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)"
msgstr "封面URL(jpg,封面会被下载被保存在数据库中,然后字段会被重新清空)"
#: cps/templates/book_edit.html:91
@@ -1849,9 +1882,7 @@ msgstr "最近下载"
#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
#~ msgstr "将标题从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s"
-#~ msgid ""
-#~ "Rename author from: '%(src)s' to "
-#~ "'%(dest)s' failed with error: %(error)s"
+#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
#~ msgstr "将作者从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s"
#~ msgid "Password for user %(user)s reset"
@@ -1875,3 +1906,9 @@ msgstr "最近下载"
#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server"
#~ msgstr "不能上传后缀为 \"%(ext)s\" 的文件到此服务器"
+#~ msgid "Current commit timestamp"
+#~ msgstr "当前提交时间戳"
+
+#~ msgid "Newest commit timestamp"
+#~ msgstr "最新提交时间戳"
+
diff --git a/cps/web.py b/cps/web.py
index a5149c24..c93ca00d 100644
--- a/cps/web.py
+++ b/cps/web.py
@@ -41,6 +41,8 @@ from flask import (Flask, render_template, request, Response, redirect,
url_for, send_from_directory, make_response, g, flash,
abort, Markup)
from flask import __version__ as flaskVersion
+from werkzeug import __version__ as werkzeugVersion
+from jinja2 import __version__ as jinja2Version
import cache_buster
import ub
from ub import config
@@ -85,6 +87,10 @@ import hashlib
from redirect import redirect_back
import time
import server
+try:
+ import cPickle
+except ImportError:
+ import pickle as cPickle
try:
from urllib.parse import quote
@@ -103,10 +109,12 @@ current_milli_time = lambda: int(round(time.time() * 1000))
# Global variables
gdrive_watch_callback_token = 'target=calibreweb-watch_files'
-ALLOWED_EXTENSIONS = {'txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx',
- 'fb2'}
-# READER_EXTENSIONS = set(['txt', 'pdf', 'epub', 'zip', 'cbz', 'tar', 'cbt'] + (['rar','cbr'] if rar_support else []))
-# READER_EXTENSIONS = set(['txt', 'pdf', 'epub', 'zip', 'cbz', 'tar', 'cbt', 'rar', 'cbr'])
+EXTENSIONS_UPLOAD = {'txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx',
+ 'fb2', 'html', 'rtf', 'odt'}
+EXTENSIONS_CONVERT = {'pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', 'lit', 'lrf', 'txt', 'html', 'rtf', 'odt'}
+
+# EXTENSIONS_READER = set(['txt', 'pdf', 'epub', 'zip', 'cbz', 'tar', 'cbt'] + (['rar','cbr'] if rar_support else []))
+
def md5(fname):
hash_md5 = hashlib.md5()
@@ -183,7 +191,6 @@ logging.getLogger("book_formats").addHandler(file_handler)
logging.getLogger("book_formats").setLevel(config.config_log_level)
Principal(app)
-
babel = Babel(app)
import uploader
@@ -195,6 +202,9 @@ lm.anonymous_user = ub.Anonymous
app.secret_key = os.getenv('SECRET_KEY', 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT')
db.setup_db()
+with open(os.path.join(config.get_main_dir, 'cps/translations/iso639.pickle'), 'rb') as f:
+ language_table = cPickle.load(f)
+
def is_gdrive_ready():
return os.path.exists(os.path.join(config.get_main_dir, 'settings.yaml')) and \
@@ -418,7 +428,7 @@ def yesno(value, yes, no):
def canread(ext):
if isinstance(ext, db.Data):
ext = ext.format
- return ext.lower() in READER_EXTENSIONS'''
+ return ext.lower() in EXTENSIONS_READER'''
def admin_required(f):
@@ -582,7 +592,7 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session
new_element = db_object(add_element, add_element)
elif db_type == 'custom':
new_element = db_object(value=add_element)
- else: # db_type should be tag, or languages
+ else: # db_type should be tag, language or publisher
new_element = db_object(add_element)
db_session.add(new_element)
# add element to book
@@ -1036,9 +1046,14 @@ def get_tags_json():
def get_languages_json():
if request.method == "GET":
query = request.args.get('q').lower()
- languages = speaking_language()
- entries = [s for s in languages if query in s.name.lower()]
- json_dumps = json.dumps([dict(name=r.name) for r in entries])
+ # languages = speaking_language()
+ languages = language_table[get_locale()]
+ entries_start = [s for key, s in languages.items() if s.lower().startswith(query.lower())]
+ if len(entries_start) < 5:
+ entries = [s for key,s in languages.items() if query in s.lower()]
+ entries_start.extend(entries[0:(5-len(entries_start))])
+ entries_start = list(set(entries_start))
+ json_dumps = json.dumps([dict(name=r) for r in entries_start[0:5]])
return json_dumps
@@ -1149,7 +1164,7 @@ def get_update_status():
if 'committer' in update_data and 'message' in update_data:
status['success'] = True
- status['message'] = _(u'A new update is available. Click on the button below update to the latest version.')
+ status['message'] = _(u'A new update is available. Click on the button below to update to the latest version.')
new_commit_date = datetime.datetime.strptime(
update_data['committer']['date'], '%Y-%m-%dT%H:%M:%SZ') - tz
@@ -1652,8 +1667,10 @@ def stats():
categorys = db.session.query(db.Tags).count()
series = db.session.query(db.Series).count()
versions = uploader.book_formats.get_versions()
- versions['Babel'] = 'v'+babelVersion
- versions['Sqlalchemy'] = 'v'+sqlalchemyVersion
+ versions['Babel'] = 'v' + babelVersion
+ versions['Sqlalchemy'] = 'v' + sqlalchemyVersion
+ versions['Werkzeug'] = 'v' + werkzeugVersion
+ versions['Jinja2'] = 'v' + jinja2Version
versions['Flask'] = 'v'+flaskVersion
versions['Flask Login'] = 'v'+flask_loginVersion
versions['Flask Principal'] = 'v'+flask_principalVersion
@@ -1689,7 +1706,7 @@ def delete_book(book_id, book_format):
modify_database_object([u''], book.tags, db.Tags, db.session, 'tags')
modify_database_object([u''], book.series, db.Series, db.session, 'series')
modify_database_object([u''], book.languages, db.Languages, db.session, 'languages')
- modify_database_object([u''], book.publishers, db.Publishers, db.session, 'series')
+ modify_database_object([u''], book.publishers, db.Publishers, db.session, 'publishers')
cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all()
for c in cc:
@@ -2406,18 +2423,22 @@ def add_to_shelf(shelf_id, book_id):
if shelf is None:
app.logger.info("Invalid shelf specified")
if not request.is_xhr:
+ flash(_(u"Invalid shelf specified"), category="error")
return redirect(url_for('index'))
return "Invalid shelf specified", 400
if not shelf.is_public and not shelf.user_id == int(current_user.id):
app.logger.info("Sorry you are not allowed to add a book to the the shelf: %s" % shelf.name)
if not request.is_xhr:
+ flash(_(u"Sorry you are not allowed to add a book to the the shelf: %(shelfname)s", shelfname=shelf.name),
+ category="error")
return redirect(url_for('index'))
return "Sorry you are not allowed to add a book to the the shelf: %s" % shelf.name, 403
if shelf.is_public and not current_user.role_edit_shelfs():
app.logger.info("User is not allowed to edit public shelves")
if not request.is_xhr:
+ flash(_(u"You are not allowed to edit public shelves"), category="error")
return redirect(url_for('index'))
return "User is not allowed to edit public shelves", 403
@@ -2426,6 +2447,7 @@ def add_to_shelf(shelf_id, book_id):
if book_in_shelf:
app.logger.info("Book is already part of the shelf: %s" % shelf.name)
if not request.is_xhr:
+ flash(_(u"Book is already part of the shelf: %(shelfname)s", shelfname=shelf.name), category="error")
return redirect(url_for('index'))
return "Book is already part of the shelf: %s" % shelf.name, 400
@@ -2440,7 +2462,10 @@ def add_to_shelf(shelf_id, book_id):
ub.session.commit()
if not request.is_xhr:
flash(_(u"Book has been added to shelf: %(sname)s", sname=shelf.name), category="success")
- return redirect(request.environ["HTTP_REFERER"])
+ if "HTTP_REFERER" in request.environ:
+ return redirect(request.environ["HTTP_REFERER"])
+ else:
+ return redirect(url_for('index'))
return "", 204
@@ -2637,7 +2662,12 @@ def show_shelf(shelf_id):
ub.BookShelf.order.asc()).all()
for book in books_in_shelf:
cur_book = db.session.query(db.Books).filter(db.Books.id == book.book_id).first()
- result.append(cur_book)
+ if cur_book:
+ result.append(cur_book)
+ else:
+ app.logger.info('Not existing book %s in shelf %s deleted' % (book.book_id, shelf.id))
+ ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book.book_id).delete()
+ ub.session.commit()
return render_title_template('shelf.html', entries=result, title=_(u"Shelf: '%(name)s'", name=shelf.name),
shelf=shelf, page="shelf")
else:
@@ -2993,7 +3023,8 @@ def configuration_helper(origin):
if content.config_logfile != to_save["config_logfile"]:
# check valid path, only path or file
if os.path.dirname(to_save["config_logfile"]):
- if os.path.exists(os.path.dirname(to_save["config_logfile"])):
+ if os.path.exists(os.path.dirname(to_save["config_logfile"])) and \
+ os.path.basename(to_save["config_logfile"]) and not os.path.isdir(to_save["config_logfile"]):
content.config_logfile = to_save["config_logfile"]
else:
ub.session.commit()
@@ -3041,8 +3072,6 @@ def configuration_helper(origin):
gdriveError=gdriveError, goodreads=goodreads_support, rarfile_support=rar_support,
title=_(u"Basic Configuration"), page="config")
if reboot_required:
- # ub.session.close()
- # ub.engine.dispose()
# stop Server
server.Server.setRestartTyp(True)
server.Server.stopServer()
@@ -3092,6 +3121,11 @@ def new_user():
content.sidebar_view += ub.SIDEBAR_AUTHOR
if "show_detail_random" in to_save:
content.sidebar_view += ub.DETAIL_RANDOM
+ if "show_sorted" in to_save:
+ content.sidebar_view += ub.SIDEBAR_SORTED
+ if "show_recent" in to_save:
+ content.sidebar_view += ub.SIDEBAR_RECENT
+
content.role = 0
if "admin_role" in to_save:
content.role = content.role + ub.ROLE_ADMIN
@@ -3345,22 +3379,19 @@ def edit_book(book_id):
return redirect(url_for("index"))
for indx in range(0, len(book.languages)):
- try:
- book.languages[indx].language_name = LC.parse(book.languages[indx].lang_code).get_language_name(
- get_locale())
- except UnknownLocaleError:
- book.languages[indx].language_name = _(isoLanguages.get(part3=book.languages[indx].lang_code).name)
+ book.languages[indx].language_name = language_table[get_locale()][book.languages[indx].lang_code]
for authr in book.authors:
author_names.append(authr.name.replace('|', ','))
# Option for showing convertbook button
+ valid_source_formats=list()
if config.config_ebookconverter == 2:
- display_convertbtn = True
- else:
- display_convertbtn = False
+ for file in book.data:
+ if file.format.lower() in EXTENSIONS_CONVERT:
+ valid_source_formats.append(file.format.lower())
# Determine what formats don't already exist
- allowed_conversion_formats = ALLOWED_EXTENSIONS.copy()
+ allowed_conversion_formats = EXTENSIONS_CONVERT.copy()
for file in book.data:
try:
allowed_conversion_formats.remove(file.format.lower())
@@ -3372,12 +3403,9 @@ def edit_book(book_id):
# Show form
if request.method != 'POST':
return render_title_template('book_edit.html', book=book, authors=author_names, cc=cc,
- title=_(u"edit metadata"), page="editbook", display_convertbtn=display_convertbtn,
- conversion_formats=allowed_conversion_formats)
-
- # Update book
- edited_books_id = set()
-
+ title=_(u"edit metadata"), page="editbook",
+ conversion_formats=allowed_conversion_formats,
+ source_formats=valid_source_formats)
# Check and handle Uploaded file
if 'btn-upload-format' in request.files:
requested_file = request.files['btn-upload-format']
@@ -3385,7 +3413,7 @@ def edit_book(book_id):
if requested_file.filename != '':
if '.' in requested_file.filename:
file_ext = requested_file.filename.rsplit('.', 1)[-1].lower()
- if file_ext not in ALLOWED_EXTENSIONS:
+ if file_ext not in EXTENSIONS_UPLOAD:
flash(_("File extension '%(ext)s' is not allowed to be uploaded to this server", ext=file_ext),
category="error")
return redirect(url_for('show_book', book_id=book.id))
@@ -3432,7 +3460,6 @@ def edit_book(book_id):
# check for empty request
if requested_file.filename != '':
file_ext = requested_file.filename.rsplit('.', 1)[-1].lower()
- # file_name = book.path.rsplit('/', 1)[-1]
filepath = os.path.normpath(os.path.join(config.config_calibre_dir, book.path))
saved_filename = os.path.join(filepath, 'cover.' + file_ext)
@@ -3456,10 +3483,14 @@ def edit_book(book_id):
to_save = request.form.to_dict()
try:
+ # Update book
+ edited_books_id = set()
+ #handle book title
if book.title != to_save["book_title"]:
book.title = to_save["book_title"]
edited_books_id.add(book.id)
+ # handle author(s)
input_authors = to_save["author_name"].split('&')
input_authors = list(map(lambda it: it.strip().replace(',', '|'), input_authors))
# we have all author names now
@@ -3495,22 +3526,22 @@ def edit_book(book_id):
if book.series_index != to_save["series_index"]:
book.series_index = to_save["series_index"]
+ # Handle book comments/description
if len(book.comments):
book.comments[0].text = to_save["description"]
else:
book.comments.append(db.Comments(text=to_save["description"], book=book.id))
+ # Handle book tags
input_tags = to_save["tags"].split(',')
input_tags = list(map(lambda it: it.strip(), input_tags))
modify_database_object(input_tags, book.tags, db.Tags, db.session, 'tags')
+ # Handle book series
input_series = [to_save["series"].strip()]
input_series = [x for x in input_series if x != '']
modify_database_object(input_series, book.series, db.Series, db.session, 'series')
- input_languages = to_save["languages"].split(',')
- input_languages = list(map(lambda it: it.strip().lower(), input_languages))
-
if to_save["pubdate"]:
try:
book.pubdate = datetime.datetime.strptime(to_save["pubdate"], "%Y-%m-%d")
@@ -3518,24 +3549,25 @@ def edit_book(book_id):
book.pubdate = db.Books.DEFAULT_PUBDATE
else:
book.pubdate = db.Books.DEFAULT_PUBDATE
-
'''if len(book.publishers):
if to_save["publisher"] != book.publishers[0].name:
modify_database_object(to_save["publisher"], book.publishers, db.Publishers, db.session, 'series')
else:
modify_database_object(to_save["publisher"], book.publishers, db.Publishers, db.session, 'series')'''
- # retranslate displayed text to language codes
- languages = db.session.query(db.Languages).all()
+ # handle book languages
+ input_languages = to_save["languages"].split(',')
+ # input_languages = list(map(lambda it: it.strip().lower(), input_languages))
+ input_languages = [x.strip().lower() for x in input_languages if x != '']
input_l = []
- for lang in languages:
+ invers_lang_table = [x.lower() for x in language_table[get_locale()].values()]
+ for lang in input_languages:
try:
- lang.name = LC.parse(lang.lang_code).get_language_name(get_locale()).lower()
- except UnknownLocaleError:
- lang.name = _(isoLanguages.get(part3=lang.lang_code).name).lower()
- for inp_lang in input_languages:
- if inp_lang == lang.name:
- input_l.append(lang.lang_code)
+ res = list(language_table[get_locale()].keys())[invers_lang_table.index(lang)]
+ input_l.append(res)
+ except ValueError:
+ app.logger.error('%s is not a valid language' % lang)
+ flash(_(u"%(langname)s is not a valid language", langname=lang), category="error")
modify_database_object(input_l, book.languages, db.Languages, db.session, 'languages')
if to_save["rating"].strip():
@@ -3676,7 +3708,7 @@ def upload():
# check if file extension is correct
if '.' in requested_file.filename:
file_ext = requested_file.filename.rsplit('.', 1)[-1].lower()
- if file_ext not in ALLOWED_EXTENSIONS:
+ if file_ext not in EXTENSIONS_UPLOAD:
flash(
_("File extension '%(ext)s' is not allowed to be uploaded to this server",
ext=file_ext), category="error")
diff --git a/cps/worker.py b/cps/worker.py
index a842c1de..02ca742f 100644
--- a/cps/worker.py
+++ b/cps/worker.py
@@ -232,10 +232,25 @@ class WorkerThread(threading.Thread):
bookid = self.queue[self.current]['bookid']
format_old_ext = u'.' + self.queue[self.current]['settings']['old_book_format'].lower()
format_new_ext = u'.' + self.queue[self.current]['settings']['new_book_format'].lower()
+
+ # check to see if destination format already exists -
+ # if it does - mark the conversion task as complete and return a success
+ # this will allow send to kindle workflow to continue to work
+ if os.path.isfile(file_path + format_new_ext):
+ web.app.logger.info("Book id %d already converted to %s", bookid, format_new_ext)
+ cur_book = web.db.session.query(web.db.Books).filter(web.db.Books.id == bookid).first()
+ self.queue[self.current]['path'] = file_path
+ self.queue[self.current]['title'] = cur_book.title
+ self._handleSuccess()
+ return file_path + format_new_ext
+ else:
+ web.app.logger.info("Book id %d - target format of %s does not existing. Moving forward with convert.", bookid, format_new_ext)
+
# check if converter-executable is existing
if not os.path.exists(web.ub.config.config_converterpath):
self._handleError(_(u"Convertertool %(converter)s not found", converter=web.ub.config.config_converterpath))
return
+
try:
# check which converter to use kindlegen is "1"
if format_old_ext == '.epub' and format_new_ext == '.mobi':
@@ -313,11 +328,7 @@ class WorkerThread(threading.Thread):
self.queue[self.current]['title'] = cur_book.title
if web.ub.config.config_use_google_drive:
os.remove(file_path + format_old_ext)
- self.queue[self.current]['status'] = STAT_FINISH_SUCCESS
- self.UIqueue[self.current]['status'] = _('Finished')
- self.UIqueue[self.current]['progress'] = "100 %"
- self.UIqueue[self.current]['runtime'] = self._formatRuntime(
- datetime.now() - self.queue[self.current]['starttime'])
+ self._handleSuccess()
return file_path + format_new_ext
else:
error_message = format_new_ext.upper() + ' format not found on disk'
@@ -434,12 +445,7 @@ class WorkerThread(threading.Thread):
self.asyncSMTP.login(str(obj['settings']["mail_login"]), str(obj['settings']["mail_password"]))
self.asyncSMTP.sendmail(obj['settings']["mail_from"], obj['recipent'], msg)
self.asyncSMTP.quit()
- self.queue[self.current]['status'] = STAT_FINISH_SUCCESS
- self.UIqueue[self.current]['status'] = _('Finished')
- self.UIqueue[self.current]['progress'] = "100 %"
- self.UIqueue[self.current]['runtime'] = self._formatRuntime(
- datetime.now() - self.queue[self.current]['starttime'])
-
+ self._handleSuccess()
sys.stderr = org_stderr
except (MemoryError) as e:
@@ -452,8 +458,6 @@ class WorkerThread(threading.Thread):
self._handleError(u'Error sending email: ' + e.strerror)
return None
-
-
def _formatRuntime(self, runtime):
self.UIqueue[self.current]['rt'] = runtime.total_seconds()
val = re.split('\:|\.', str(runtime))[0:3]
@@ -475,8 +479,15 @@ class WorkerThread(threading.Thread):
datetime.now() - self.queue[self.current]['starttime'])
self.UIqueue[self.current]['message'] = error_message
+ def _handleSuccess(self):
+ self.queue[self.current]['status'] = STAT_FINISH_SUCCESS
+ self.UIqueue[self.current]['status'] = _('Finished')
+ self.UIqueue[self.current]['progress'] = "100 %"
+ self.UIqueue[self.current]['runtime'] = self._formatRuntime(
+ datetime.now() - self.queue[self.current]['starttime'])
+# Enable logging of smtp lib debug output
class StderrLogger(object):
buffer = ''
diff --git a/messages.pot b/messages.pot
index 96c53c06..0cc3c9cf 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: 2018-09-08 14:49+0200\n"
+"POT-Creation-Date: 2018-09-14 21:11+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -113,705 +113,750 @@ msgstr ""
msgid "Unrar binary file not found"
msgstr ""
-#: cps/web.py:1114
-msgid "Requesting update package"
+#: cps/web.py:1112 cps/web.py:2778
+msgid "Unknown"
msgstr ""
-#: cps/web.py:1115
-msgid "Downloading update package"
+#: cps/web.py:1121 cps/web.py:1152
+msgid "HTTP Error"
msgstr ""
-#: cps/web.py:1116
-msgid "Unzipping update package"
+#: cps/web.py:1123 cps/web.py:1154
+msgid "Connection error"
msgstr ""
-#: cps/web.py:1117
-msgid "Files are replaced"
+#: cps/web.py:1125 cps/web.py:1156
+msgid "Timeout while establishing connection"
msgstr ""
-#: cps/web.py:1118
-msgid "Database connections are closed"
+#: cps/web.py:1127 cps/web.py:1158
+msgid "General error"
msgstr ""
-#: cps/web.py:1119
-msgid "Server is stopped"
-msgstr ""
-
-#: cps/web.py:1120
-msgid "Update finished, please press okay and reload page"
+#: cps/web.py:1133
+msgid "Unexpected data while reading update information"
msgstr ""
#: cps/web.py:1140
+msgid "No update available. You already have the latest version installed"
+msgstr ""
+
+#: cps/web.py:1165
+msgid "A new update is available. Click on the button below to update to the latest version."
+msgstr ""
+
+#: cps/web.py:1215
+msgid "Could not fetch update information"
+msgstr ""
+
+#: cps/web.py:1230
+msgid "Requesting update package"
+msgstr ""
+
+#: cps/web.py:1231
+msgid "Downloading update package"
+msgstr ""
+
+#: cps/web.py:1232
+msgid "Unzipping update package"
+msgstr ""
+
+#: cps/web.py:1233
+msgid "Files are replaced"
+msgstr ""
+
+#: cps/web.py:1234
+msgid "Database connections are closed"
+msgstr ""
+
+#: cps/web.py:1235
+msgid "Server is stopped"
+msgstr ""
+
+#: cps/web.py:1236
+msgid "Update finished, please press okay and reload page"
+msgstr ""
+
+#: cps/web.py:1256
msgid "Recently Added Books"
msgstr ""
-#: cps/web.py:1150
+#: cps/web.py:1266
msgid "Newest Books"
msgstr ""
-#: cps/web.py:1162
+#: cps/web.py:1278
msgid "Oldest Books"
msgstr ""
-#: cps/web.py:1174
+#: cps/web.py:1290
msgid "Books (A-Z)"
msgstr ""
-#: cps/web.py:1185
+#: cps/web.py:1301
msgid "Books (Z-A)"
msgstr ""
-#: cps/web.py:1214
+#: cps/web.py:1330
msgid "Hot Books (most downloaded)"
msgstr ""
-#: cps/web.py:1227
+#: cps/web.py:1343
msgid "Best rated books"
msgstr ""
-#: cps/templates/index.xml:36 cps/web.py:1239
+#: cps/templates/index.xml:36 cps/web.py:1355
msgid "Random Books"
msgstr ""
-#: cps/web.py:1254
+#: cps/web.py:1370
msgid "Author list"
msgstr ""
-#: cps/web.py:1266 cps/web.py:1329 cps/web.py:1484 cps/web.py:2036
+#: cps/web.py:1382 cps/web.py:1445 cps/web.py:1600 cps/web.py:2152
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr ""
-#: cps/templates/index.xml:73 cps/web.py:1313
+#: cps/templates/index.xml:73 cps/web.py:1429
msgid "Series list"
msgstr ""
-#: cps/web.py:1327
+#: cps/web.py:1443
#, python-format
msgid "Series: %(serie)s"
msgstr ""
-#: cps/web.py:1354
+#: cps/web.py:1470
msgid "Available languages"
msgstr ""
-#: cps/web.py:1371
+#: cps/web.py:1487
#, python-format
msgid "Language: %(name)s"
msgstr ""
-#: cps/templates/index.xml:66 cps/web.py:1382
+#: cps/templates/index.xml:66 cps/web.py:1498
msgid "Category list"
msgstr ""
-#: cps/web.py:1396
+#: cps/web.py:1512
#, python-format
msgid "Category: %(name)s"
msgstr ""
-#: cps/templates/layout.html:71 cps/web.py:1535
+#: cps/templates/layout.html:71 cps/web.py:1651
msgid "Tasks"
msgstr ""
-#: cps/web.py:1565
+#: cps/web.py:1681
msgid "Statistics"
msgstr ""
-#: cps/web.py:1670
+#: cps/web.py:1786
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr ""
-#: cps/web.py:1746
+#: cps/web.py:1861
msgid "Server restarted, please reload page"
msgstr ""
-#: cps/web.py:1749
+#: cps/web.py:1864
msgid "Performing shutdown of server, please close window"
msgstr ""
-#: cps/web.py:1767
+#: cps/web.py:1883
msgid "Update done"
msgstr ""
-#: cps/web.py:1837
+#: cps/web.py:1953
msgid "Published after "
msgstr ""
-#: cps/web.py:1844
+#: cps/web.py:1960
msgid "Published before "
msgstr ""
-#: cps/web.py:1858
+#: cps/web.py:1974
#, python-format
msgid "Rating <= %(rating)s"
msgstr ""
-#: cps/web.py:1860
+#: cps/web.py:1976
#, python-format
msgid "Rating >= %(rating)s"
msgstr ""
-#: cps/web.py:1919 cps/web.py:1928
+#: cps/web.py:2035 cps/web.py:2044
msgid "search"
msgstr ""
#: cps/templates/index.xml:44 cps/templates/index.xml:48
-#: cps/templates/layout.html:146 cps/web.py:1995
+#: cps/templates/layout.html:146 cps/web.py:2111
msgid "Read Books"
msgstr ""
#: cps/templates/index.xml:52 cps/templates/index.xml:56
-#: cps/templates/layout.html:148 cps/web.py:1998
+#: cps/templates/layout.html:148 cps/web.py:2114
msgid "Unread Books"
msgstr ""
-#: cps/web.py:2046 cps/web.py:2048 cps/web.py:2050 cps/web.py:2062
+#: cps/web.py:2162 cps/web.py:2164 cps/web.py:2166 cps/web.py:2178
msgid "Read a Book"
msgstr ""
-#: cps/web.py:2128 cps/web.py:3006
+#: cps/web.py:2244 cps/web.py:3129
msgid "Please fill out all fields!"
msgstr ""
-#: cps/web.py:2129 cps/web.py:2150 cps/web.py:2154 cps/web.py:2159
-#: cps/web.py:2161
+#: cps/web.py:2245 cps/web.py:2266 cps/web.py:2270 cps/web.py:2275
+#: cps/web.py:2277
msgid "register"
msgstr ""
-#: cps/web.py:2149 cps/web.py:3222
+#: cps/web.py:2265 cps/web.py:3345
msgid "An unknown error occurred. Please try again later."
msgstr ""
-#: cps/web.py:2152
+#: cps/web.py:2268
msgid "Your e-mail is not allowed to register"
msgstr ""
-#: cps/web.py:2155
+#: cps/web.py:2271
msgid "Confirmation e-mail was send to your e-mail account."
msgstr ""
-#: cps/web.py:2158
+#: cps/web.py:2274
msgid "This username or e-mail address is already in use."
msgstr ""
-#: cps/web.py:2175 cps/web.py:2271
+#: cps/web.py:2291 cps/web.py:2387
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr ""
-#: cps/web.py:2180
+#: cps/web.py:2296
msgid "Wrong Username or Password"
msgstr ""
-#: cps/web.py:2186 cps/web.py:2207
+#: cps/web.py:2302 cps/web.py:2323
msgid "login"
msgstr ""
-#: cps/web.py:2219 cps/web.py:2250
+#: cps/web.py:2335 cps/web.py:2366
msgid "Token not found"
msgstr ""
-#: cps/web.py:2227 cps/web.py:2258
+#: cps/web.py:2343 cps/web.py:2374
msgid "Token has expired"
msgstr ""
-#: cps/web.py:2235
+#: cps/web.py:2351
msgid "Success! Please return to your device"
msgstr ""
-#: cps/web.py:2285
+#: cps/web.py:2401
msgid "Please configure the SMTP mail settings first..."
msgstr ""
-#: cps/web.py:2289
+#: cps/web.py:2405
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr ""
-#: cps/web.py:2293
+#: cps/web.py:2409
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr ""
-#: cps/web.py:2295 cps/web.py:3060
+#: cps/web.py:2411 cps/web.py:3183
msgid "Please configure your kindle e-mail address first..."
msgstr ""
-#: cps/web.py:2339
+#: cps/web.py:2455
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2350
+#: cps/web.py:2466
msgid "Invalid shelf specified"
msgstr ""
-#: cps/web.py:2355
+#: cps/web.py:2471
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr ""
-#: cps/web.py:2360
+#: cps/web.py:2476
msgid "User is not allowed to edit public shelves"
msgstr ""
-#: cps/web.py:2378
+#: cps/web.py:2494
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr ""
-#: cps/web.py:2392
+#: cps/web.py:2508
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2394
+#: cps/web.py:2510
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2431
+#: cps/web.py:2547
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2437
+#: cps/web.py:2553
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr ""
-#: cps/web.py:2457 cps/web.py:2481
+#: cps/web.py:2573 cps/web.py:2597
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr ""
-#: cps/web.py:2462
+#: cps/web.py:2578
#, python-format
msgid "Shelf %(title)s created"
msgstr ""
-#: cps/web.py:2464 cps/web.py:2492
+#: cps/web.py:2580 cps/web.py:2608
msgid "There was an error"
msgstr ""
-#: cps/web.py:2465 cps/web.py:2467
+#: cps/web.py:2581 cps/web.py:2583
msgid "create a shelf"
msgstr ""
-#: cps/web.py:2490
+#: cps/web.py:2606
#, python-format
msgid "Shelf %(title)s changed"
msgstr ""
-#: cps/web.py:2493 cps/web.py:2495
+#: cps/web.py:2609 cps/web.py:2611
msgid "Edit a shelf"
msgstr ""
-#: cps/web.py:2516
+#: cps/web.py:2632
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr ""
-#: cps/web.py:2538
+#: cps/web.py:2659
#, python-format
msgid "Shelf: '%(name)s'"
msgstr ""
-#: cps/web.py:2541
+#: cps/web.py:2662
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr ""
-#: cps/web.py:2572
+#: cps/web.py:2693
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr ""
-#: cps/web.py:2601 cps/web.py:3012
+#: cps/web.py:2722 cps/web.py:3135
msgid "E-mail is not from valid domain"
msgstr ""
-#: cps/web.py:2603 cps/web.py:2644 cps/web.py:2647
+#: cps/web.py:2724 cps/web.py:2765 cps/web.py:2768
#, python-format
msgid "%(name)s's profile"
msgstr ""
-#: cps/web.py:2642
+#: cps/web.py:2763
msgid "Found an existing account for this e-mail address."
msgstr ""
-#: cps/web.py:2645
+#: cps/web.py:2766
msgid "Profile updated"
msgstr ""
-#: cps/web.py:2657
-msgid "Unknown"
-msgstr ""
-
-#: cps/web.py:2671
+#: cps/web.py:2794
msgid "Admin page"
msgstr ""
-#: cps/web.py:2749 cps/web.py:2922
+#: cps/web.py:2872 cps/web.py:3045
msgid "Calibre-Web configuration updated"
msgstr ""
-#: cps/templates/admin.html:91 cps/web.py:2762
+#: cps/templates/admin.html:100 cps/web.py:2885
msgid "UI Configuration"
msgstr ""
-#: cps/web.py:2780
+#: cps/web.py:2903
msgid "Import of optional Google Drive requirements missing"
msgstr ""
-#: cps/web.py:2783
+#: cps/web.py:2906
msgid "client_secrets.json is missing or not readable"
msgstr ""
-#: cps/web.py:2788 cps/web.py:2815
+#: cps/web.py:2911 cps/web.py:2938
msgid "client_secrets.json is not configured for web application"
msgstr ""
-#: cps/templates/admin.html:90 cps/web.py:2818 cps/web.py:2844 cps/web.py:2856
-#: cps/web.py:2898 cps/web.py:2913 cps/web.py:2930 cps/web.py:2937
-#: cps/web.py:2954
+#: cps/templates/admin.html:99 cps/web.py:2941 cps/web.py:2967 cps/web.py:2979
+#: cps/web.py:3021 cps/web.py:3036 cps/web.py:3053 cps/web.py:3060
+#: cps/web.py:3077
msgid "Basic Configuration"
msgstr ""
-#: cps/web.py:2841
+#: cps/web.py:2964
msgid "Keyfile location is not valid, please enter correct path"
msgstr ""
-#: cps/web.py:2853
+#: cps/web.py:2976
msgid "Certfile location is not valid, please enter correct path"
msgstr ""
-#: cps/web.py:2895
+#: cps/web.py:3018
msgid "Logfile location is not valid, please enter correct path"
msgstr ""
-#: cps/web.py:2934
+#: cps/web.py:3057
msgid "DB location is not valid, please enter correct path"
msgstr ""
-#: cps/templates/admin.html:31 cps/web.py:3008 cps/web.py:3014 cps/web.py:3030
+#: cps/templates/admin.html:33 cps/web.py:3131 cps/web.py:3137 cps/web.py:3153
msgid "Add new user"
msgstr ""
-#: cps/web.py:3020
+#: cps/web.py:3143
#, python-format
msgid "User '%(user)s' created"
msgstr ""
-#: cps/web.py:3024
+#: cps/web.py:3147
msgid "Found an existing account for this e-mail address or nickname."
msgstr ""
-#: cps/web.py:3048 cps/web.py:3062
+#: cps/web.py:3171 cps/web.py:3185
msgid "E-mail server settings updated"
msgstr ""
-#: cps/web.py:3055
+#: cps/web.py:3178
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr ""
-#: cps/web.py:3058
+#: cps/web.py:3181
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr ""
-#: cps/web.py:3063
+#: cps/web.py:3186
msgid "Edit e-mail server settings"
msgstr ""
-#: cps/web.py:3088
+#: cps/web.py:3211
#, python-format
msgid "User '%(nick)s' deleted"
msgstr ""
-#: cps/web.py:3197
+#: cps/web.py:3320
#, python-format
msgid "User '%(nick)s' updated"
msgstr ""
-#: cps/web.py:3200
+#: cps/web.py:3323
msgid "An unknown error occured."
msgstr ""
-#: cps/web.py:3202
+#: cps/web.py:3325
#, python-format
msgid "Edit User %(nick)s"
msgstr ""
-#: cps/web.py:3219
+#: cps/web.py:3342
#, python-format
msgid "Password for user %(user)s reset"
msgstr ""
-#: cps/web.py:3239
+#: cps/web.py:3362
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr ""
-#: cps/web.py:3270 cps/web.py:3546 cps/web.py:3551 cps/web.py:3706
+#: cps/web.py:3390 cps/web.py:3667 cps/web.py:3672 cps/web.py:3827
msgid "edit metadata"
msgstr ""
-#: cps/web.py:3284 cps/web.py:3576
+#: cps/web.py:3401 cps/web.py:3697
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr ""
-#: cps/web.py:3288 cps/web.py:3580
+#: cps/web.py:3405 cps/web.py:3701
msgid "File to be uploaded must have an extension"
msgstr ""
-#: cps/web.py:3300 cps/web.py:3600
+#: cps/web.py:3417 cps/web.py:3721
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr ""
-#: cps/web.py:3305
+#: cps/web.py:3422
#, python-format
msgid "Failed to store file %(file)s."
msgstr ""
-#: cps/web.py:3321
+#: cps/web.py:3438
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr ""
-#: cps/web.py:3339
+#: cps/web.py:3455
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr ""
-#: cps/web.py:3346
+#: cps/web.py:3462
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr ""
-#: cps/web.py:3349
+#: cps/web.py:3465
msgid "Cover-file is not a valid image file"
msgstr ""
-#: cps/web.py:3362 cps/web.py:3366
+#: cps/web.py:3482 cps/web.py:3486
msgid "unknown"
msgstr ""
-#: cps/web.py:3388
+#: cps/web.py:3508
msgid "Cover is not a jpg file, can't save"
msgstr ""
-#: cps/web.py:3555
+#: cps/web.py:3554
+#, python-format
+msgid "%(langname)s is not a valid language"
+msgstr ""
+
+#: cps/web.py:3676
msgid "Error editing book, please check logfile for details"
msgstr ""
-#: cps/web.py:3605
+#: cps/web.py:3726
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr ""
-#: cps/web.py:3610
+#: cps/web.py:3731
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr ""
-#: cps/web.py:3692
+#: cps/web.py:3813
#, python-format
msgid "File %(file)s uploaded"
msgstr ""
-#: cps/web.py:3722
+#: cps/web.py:3843
msgid "Source or destination format for conversion missing"
msgstr ""
-#: cps/web.py:3732
+#: cps/web.py:3853
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr ""
-#: cps/web.py:3736
+#: cps/web.py:3857
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr ""
-#: cps/worker.py:215 cps/worker.py:387
+#: cps/worker.py:215 cps/worker.py:398
msgid "Started"
msgstr ""
-#: cps/worker.py:237
+#: cps/worker.py:251
#, python-format
msgid "Convertertool %(converter)s not found"
msgstr ""
-#: cps/worker.py:272
+#: cps/worker.py:287
#, python-format
msgid "Ebook-converter failed: %(error)s"
msgstr ""
-#: cps/worker.py:283
+#: cps/worker.py:298
#, python-format
msgid "Kindlegen failed with Error %(error)s. Message: %(message)s"
msgstr ""
-#: cps/worker.py:317 cps/worker.py:377 cps/worker.py:438
-msgid "Finished"
-msgstr ""
-
-#: cps/worker.py:344 cps/worker.py:363
+#: cps/worker.py:355 cps/worker.py:374
msgid "Waiting"
msgstr ""
-#: cps/worker.py:351
+#: cps/worker.py:362
msgid "This e-mail has been sent via Calibre-Web."
msgstr ""
-#: cps/worker.py:472
+#: cps/worker.py:388 cps/worker.py:484
+msgid "Finished"
+msgstr ""
+
+#: cps/worker.py:476
msgid "Failed"
msgstr ""
-#: cps/templates/admin.html:4
+#: cps/templates/admin.html:6
msgid "User list"
msgstr ""
-#: cps/templates/admin.html:7
+#: cps/templates/admin.html:9
msgid "Nickname"
msgstr ""
-#: cps/templates/admin.html:8
+#: cps/templates/admin.html:10
msgid "E-mail"
msgstr ""
-#: cps/templates/admin.html:9
+#: cps/templates/admin.html:11
msgid "Kindle"
msgstr ""
-#: cps/templates/admin.html:10
+#: cps/templates/admin.html:12
msgid "DLS"
msgstr ""
-#: cps/templates/admin.html:11 cps/templates/layout.html:74
+#: cps/templates/admin.html:13 cps/templates/layout.html:74
msgid "Admin"
msgstr ""
-#: cps/templates/admin.html:12 cps/templates/detail.html:22
+#: cps/templates/admin.html:14 cps/templates/detail.html:22
#: cps/templates/detail.html:31
msgid "Download"
msgstr ""
-#: cps/templates/admin.html:13 cps/templates/layout.html:64
+#: cps/templates/admin.html:15 cps/templates/layout.html:64
msgid "Upload"
msgstr ""
-#: cps/templates/admin.html:14
+#: cps/templates/admin.html:16
msgid "Edit"
msgstr ""
-#: cps/templates/admin.html:32
+#: cps/templates/admin.html:39
msgid "SMTP e-mail server settings"
msgstr ""
-#: cps/templates/admin.html:35 cps/templates/email_edit.html:11
+#: cps/templates/admin.html:42 cps/templates/email_edit.html:11
msgid "SMTP hostname"
msgstr ""
-#: cps/templates/admin.html:36
+#: cps/templates/admin.html:43
msgid "SMTP port"
msgstr ""
-#: cps/templates/admin.html:37
+#: cps/templates/admin.html:44
msgid "SSL"
msgstr ""
-#: cps/templates/admin.html:38 cps/templates/email_edit.html:27
+#: cps/templates/admin.html:45 cps/templates/email_edit.html:27
msgid "SMTP login"
msgstr ""
-#: cps/templates/admin.html:39
+#: cps/templates/admin.html:46
msgid "From mail"
msgstr ""
-#: cps/templates/admin.html:48
+#: cps/templates/admin.html:56
msgid "Change SMTP settings"
msgstr ""
-#: cps/templates/admin.html:50
+#: cps/templates/admin.html:62
msgid "Configuration"
msgstr ""
-#: cps/templates/admin.html:53
+#: cps/templates/admin.html:65
msgid "Calibre DB dir"
msgstr ""
-#: cps/templates/admin.html:57
+#: cps/templates/admin.html:69
msgid "Log level"
msgstr ""
-#: cps/templates/admin.html:61
+#: cps/templates/admin.html:73
msgid "Port"
msgstr ""
-#: cps/templates/admin.html:67 cps/templates/config_view_edit.html:23
+#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23
msgid "Books per page"
msgstr ""
-#: cps/templates/admin.html:71
+#: cps/templates/admin.html:83
msgid "Uploading"
msgstr ""
-#: cps/templates/admin.html:75
+#: cps/templates/admin.html:87
msgid "Anonymous browsing"
msgstr ""
-#: cps/templates/admin.html:79
+#: cps/templates/admin.html:91
msgid "Public registration"
msgstr ""
-#: cps/templates/admin.html:83 cps/templates/remote_login.html:4
+#: cps/templates/admin.html:95 cps/templates/remote_login.html:4
msgid "Remote login"
msgstr ""
-#: cps/templates/admin.html:93
+#: cps/templates/admin.html:106
msgid "Administration"
msgstr ""
-#: cps/templates/admin.html:94
-msgid "Current commit timestamp"
-msgstr ""
-
-#: cps/templates/admin.html:95
-msgid "Newest commit timestamp"
-msgstr ""
-
-#: cps/templates/admin.html:97
+#: cps/templates/admin.html:107
msgid "Reconnect to Calibre DB"
msgstr ""
-#: cps/templates/admin.html:98
+#: cps/templates/admin.html:108
msgid "Restart Calibre-Web"
msgstr ""
-#: cps/templates/admin.html:99
+#: cps/templates/admin.html:109
msgid "Stop Calibre-Web"
msgstr ""
-#: cps/templates/admin.html:100
+#: cps/templates/admin.html:115
+msgid "Update"
+msgstr ""
+
+#: cps/templates/admin.html:119
+msgid "Version"
+msgstr ""
+
+#: cps/templates/admin.html:120
+msgid "Details"
+msgstr ""
+
+#: cps/templates/admin.html:126
+msgid "Current version"
+msgstr ""
+
+#: cps/templates/admin.html:132
msgid "Check for update"
msgstr ""
-#: cps/templates/admin.html:101
+#: cps/templates/admin.html:133
msgid "Perform Update"
msgstr ""
-#: cps/templates/admin.html:110
+#: cps/templates/admin.html:145
msgid "Do you really want to restart Calibre-Web?"
msgstr ""
-#: cps/templates/admin.html:115 cps/templates/admin.html:129
-#: cps/templates/admin.html:150 cps/templates/shelf.html:59
+#: cps/templates/admin.html:150 cps/templates/admin.html:164
+#: cps/templates/admin.html:184 cps/templates/shelf.html:59
msgid "Ok"
msgstr ""
-#: cps/templates/admin.html:116 cps/templates/admin.html:130
+#: cps/templates/admin.html:151 cps/templates/admin.html:165
#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:164
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75
@@ -820,11 +865,11 @@ msgstr ""
msgid "Back"
msgstr ""
-#: cps/templates/admin.html:128
+#: cps/templates/admin.html:163
msgid "Do you really want to stop Calibre-Web?"
msgstr ""
-#: cps/templates/admin.html:141
+#: cps/templates/admin.html:175
msgid "Updating, please do not reload page"
msgstr ""
diff --git a/optional-requirements.txt b/optional-requirements.txt
index 22accfc1..154612b3 100644
--- a/optional-requirements.txt
+++ b/optional-requirements.txt
@@ -15,6 +15,6 @@ six==1.10.0
goodreads>=0.3.2
python-Levenshtein>=0.12.0
# other
-lxml==3.7.2
+lxml>=3.8.0
rarfile>=2.7
natsort>=2.2.0
diff --git a/version b/version
deleted file mode 100644
index 4cc309a9..00000000
--- a/version
+++ /dev/null
@@ -1,2 +0,0 @@
-$Format:%H$
-$Format:%cI$
\ No newline at end of file
{{_('Description:')}}
+ {{entry.comments[0].text|safe}} +