diff --git a/Changelog.yaml b/Changelog.yaml index 4ff8ebf7fb..6b41c53e30 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -4,6 +4,140 @@ # for important features/bug fixes. # Also, each release can have new and improved recipes. +- version: 0.7.18 + date: 2010-09-10 + + new features: + - title: "All new Preferences dialog, with nicer layout and the ability to restore settings to defaults" + type: major + + - title: "Add series info when available to generated cover. Also auto-resize the logo on the cover to ensure all text fits" + tickets: [6724] + + - title: "On device column: Now indicates when multiple copies of the same book are present on the device" + + - title: "Driver for the Gemei GM2000" + + - title: "Extract fb2 files from zip container when adding to calibre. Can be disables by disabling the Archive Extract file type plugin." + tickets: [6739] + + - title: "Switch to using raster icons for a small speedup in startup time" + + bug fixes: + - title: "On device column: Fix matching bug when multiple books in the library have the same title and author" + + - title: "Content server: Use /mobile version for Kindle browser" + + - title: "E-book viewer: When adding a bookmark, a default name is generated" + tickets: [6450] + + - title: "Hide visible menus before clearing toolbar." + tickets: [6706] + + - title: "Batch conversion: Don't overwrite the insert page break before setting" + tickets: [6729] + + - title: "Catalog generation: Fixed improper title display in catalog when title contains ':'. Added 'ondevice' field to CSV/XML catalog output (only with connected device|folder|iTunes). Added optional 'Series' section to generated catalogs with hyperlinks between books and series. Tweaks to catalog formatting." + + - title: "Fix regression when checking database integrity with custom columns introduced in 0.7.17" + + - title: "Sending email: Ignore geenric records when trying to resolve domain" + tickets: [6723] + + - title: "Fix a bug where the open state of the splitter was not being saved on shutdown if the splitter had been closed at startup and was opened by dragging the center line" + + - title: "MOBI Output: Fix bug generating index when chapter names contained non ASCII characters" + tickets: [6595] + + - title: "PDF Input: Fix handling of more non ascii characters" + + - title: "Content server: Triple AJAX timeout for main book list to 30 seconds" + + - title: "Use ImageMagick instead of Qt to generate thumbnails when sending covers to device. Should fix corrupted nook covers on some windows installs" + + - title: "FB2 Output: Improve creation of sections and fix a couple of bugs that could result in invalid output" + + new recipes: + - title: "Journal Gazette" + author: cynvision + + - title: "Milenio" + author: bmsleight + + - title: "Winnipeg Free Press" + author: buyo + + - title: "Buckmasters in the kitchen, The Walrus Magazine and Kansas City Star" + author: Tony Stegall + + - title: "Europa Sur" + author: "Darko Miletic" + + + improved recipes: + - El Pais + - La Jornada + - nrcnext + - WSJ (free) + + +- version: 0.7.17 + date: 2010-09-03 + + new features: + - title: "Content server: Show custom column data in the book listing" + + - title: "Add preference to automatically set a tag when adding books (Preferences->General)" + + - title: "Add a tweak to create compound search terms. Show error message in tooltip when user inputs an invalid search query." + + - title: "Managing multiple libraries: Allow renaming/deleting libraries from the Choose library menu" + + - title: "Searching on series index is now possible. See the User Manual for details." + + bug fixes: + - title: "Fix regression in 0.7.16 that broke conversion of HTML files with preprocess turned on" + + - title: "MOBI Output: When converting an input document that specifies an inline TOC in the but not in the , add it correctly. Fixes #6661 (Conversion to MOBI fails to create TOC)" + tickets: [6661] + + - title: "JetBook driver: Only use JetBook naming scheme for txt, pdf and fb2 files." + tickets: [6638] + + - title: "Copy to library action now respects merge preferences" + tickets: [6641] + + - title: "Fix bug in email sending when using an SSL connection" + + - title: "Kobo driver: Fix bug that prevented metadata caching from working correctly" + tickets: [6015] + + - title: "Fix regression in 0.7.16 that caused calibre to forget its preferences on each restart for new installs on linux" + + - title: "News downloads: Cut off long downloaded from URLs" + tickets: [6649] + + new recipes: + - title: "HOY" + author: Fco Javier Nieto + + - title: "Milenio" + author: bmsleight + + - title: "Winnipeg Free Press" + author: buyo + + - title: "Field and stream blog, West Hawaii Today, Marietta Daily Journal" + author: Tony Stegall + + - title: "Europa Sur" + author: "Darko Miletic" + + + improved recipes: + - La Jornada + - Slate + - version: 0.7.16 date: 2010-08-27 diff --git a/resources/images/add_book.svg b/imgsrc/add_book.svg similarity index 100% rename from resources/images/add_book.svg rename to imgsrc/add_book.svg diff --git a/resources/images/arrow-down.svg b/imgsrc/arrow-down.svg similarity index 100% rename from resources/images/arrow-down.svg rename to imgsrc/arrow-down.svg diff --git a/resources/images/arrow-up.svg b/imgsrc/arrow-up.svg similarity index 100% rename from resources/images/arrow-up.svg rename to imgsrc/arrow-up.svg diff --git a/resources/images/auto_author_sort.svg b/imgsrc/auto_author_sort.svg similarity index 100% rename from resources/images/auto_author_sort.svg rename to imgsrc/auto_author_sort.svg diff --git a/resources/images/back.svg b/imgsrc/back.svg similarity index 100% rename from resources/images/back.svg rename to imgsrc/back.svg diff --git a/resources/images/blank.svg b/imgsrc/blank.svg similarity index 100% rename from resources/images/blank.svg rename to imgsrc/blank.svg diff --git a/resources/images/book.svg b/imgsrc/book.svg similarity index 100% rename from resources/images/book.svg rename to imgsrc/book.svg diff --git a/resources/images/bookmarks.svg b/imgsrc/bookmarks.svg similarity index 100% rename from resources/images/bookmarks.svg rename to imgsrc/bookmarks.svg diff --git a/resources/images/books_in_series.svg b/imgsrc/books_in_series.svg similarity index 100% rename from resources/images/books_in_series.svg rename to imgsrc/books_in_series.svg diff --git a/resources/images/catalog.svg b/imgsrc/catalog.svg similarity index 100% rename from resources/images/catalog.svg rename to imgsrc/catalog.svg diff --git a/resources/images/chapters.svg b/imgsrc/chapters.svg similarity index 100% rename from resources/images/chapters.svg rename to imgsrc/chapters.svg diff --git a/resources/images/clear_left.svg b/imgsrc/clear_left.svg similarity index 100% rename from resources/images/clear_left.svg rename to imgsrc/clear_left.svg diff --git a/imgsrc/column.svg b/imgsrc/column.svg new file mode 100644 index 0000000000..ac2f026473 --- /dev/null +++ b/imgsrc/column.svg @@ -0,0 +1,211 @@ + + + +Capitello modanatura modanature moulure mouluresbuildingArchitetto Francesco RollandinArchitetto Francesco RollandinArchitetto Francesco Rollandinimage/svg+xmlen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/config.svg b/imgsrc/config.svg similarity index 100% rename from resources/images/config.svg rename to imgsrc/config.svg diff --git a/resources/images/connect_share.svg b/imgsrc/connect_share.svg similarity index 100% rename from resources/images/connect_share.svg rename to imgsrc/connect_share.svg diff --git a/resources/images/convert.svg b/imgsrc/convert.svg similarity index 100% rename from resources/images/convert.svg rename to imgsrc/convert.svg diff --git a/resources/images/cover_flow.svg b/imgsrc/cover_flow.svg similarity index 100% rename from resources/images/cover_flow.svg rename to imgsrc/cover_flow.svg diff --git a/resources/images/debug.svg b/imgsrc/debug.svg similarity index 100% rename from resources/images/debug.svg rename to imgsrc/debug.svg diff --git a/resources/images/default_cover.svg b/imgsrc/default_cover.svg similarity index 100% rename from resources/images/default_cover.svg rename to imgsrc/default_cover.svg diff --git a/resources/images/devices/folder.svg b/imgsrc/devices/folder.svg similarity index 100% rename from resources/images/devices/folder.svg rename to imgsrc/devices/folder.svg diff --git a/resources/images/dialog_error.svg b/imgsrc/dialog_error.svg similarity index 100% rename from resources/images/dialog_error.svg rename to imgsrc/dialog_error.svg diff --git a/resources/images/dialog_information.svg b/imgsrc/dialog_information.svg similarity index 100% rename from resources/images/dialog_information.svg rename to imgsrc/dialog_information.svg diff --git a/resources/images/dialog_question.svg b/imgsrc/dialog_question.svg similarity index 100% rename from resources/images/dialog_question.svg rename to imgsrc/dialog_question.svg diff --git a/resources/images/dialog_warning.svg b/imgsrc/dialog_warning.svg similarity index 100% rename from resources/images/dialog_warning.svg rename to imgsrc/dialog_warning.svg diff --git a/resources/images/dictionary.svg b/imgsrc/dictionary.svg similarity index 100% rename from resources/images/dictionary.svg rename to imgsrc/dictionary.svg diff --git a/resources/images/document_open.svg b/imgsrc/document_open.svg similarity index 100% rename from resources/images/document_open.svg rename to imgsrc/document_open.svg diff --git a/resources/images/donate.svg b/imgsrc/donate.svg similarity index 100% rename from resources/images/donate.svg rename to imgsrc/donate.svg diff --git a/imgsrc/drawer.svg b/imgsrc/drawer.svg new file mode 100644 index 0000000000..22e54a1537 --- /dev/null +++ b/imgsrc/drawer.svg @@ -0,0 +1,2508 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/edit_copy.svg b/imgsrc/edit_copy.svg similarity index 100% rename from resources/images/edit_copy.svg rename to imgsrc/edit_copy.svg diff --git a/resources/images/edit_input.svg b/imgsrc/edit_input.svg similarity index 100% rename from resources/images/edit_input.svg rename to imgsrc/edit_input.svg diff --git a/resources/images/eject.svg b/imgsrc/eject.svg similarity index 100% rename from resources/images/eject.svg rename to imgsrc/eject.svg diff --git a/resources/images/exec.svg b/imgsrc/exec.svg similarity index 100% rename from resources/images/exec.svg rename to imgsrc/exec.svg diff --git a/resources/images/font_size_larger.svg b/imgsrc/font_size_larger.svg similarity index 100% rename from resources/images/font_size_larger.svg rename to imgsrc/font_size_larger.svg diff --git a/resources/images/font_size_smaller.svg b/imgsrc/font_size_smaller.svg similarity index 100% rename from resources/images/font_size_smaller.svg rename to imgsrc/font_size_smaller.svg diff --git a/resources/images/forward.svg b/imgsrc/forward.svg similarity index 100% rename from resources/images/forward.svg rename to imgsrc/forward.svg diff --git a/resources/images/help.svg b/imgsrc/help.svg similarity index 100% rename from resources/images/help.svg rename to imgsrc/help.svg diff --git a/resources/images/jobs.svg b/imgsrc/jobs.svg similarity index 100% rename from resources/images/jobs.svg rename to imgsrc/jobs.svg diff --git a/resources/images/list_remove.svg b/imgsrc/list_remove.svg similarity index 100% rename from resources/images/list_remove.svg rename to imgsrc/list_remove.svg diff --git a/resources/images/lookfeel.svg b/imgsrc/lookfeel.svg similarity index 100% rename from resources/images/lookfeel.svg rename to imgsrc/lookfeel.svg diff --git a/resources/images/mail.svg b/imgsrc/mail.svg similarity index 100% rename from resources/images/mail.svg rename to imgsrc/mail.svg diff --git a/resources/images/merge_books.svg b/imgsrc/merge_books.svg similarity index 100% rename from resources/images/merge_books.svg rename to imgsrc/merge_books.svg diff --git a/resources/images/metadata.svg b/imgsrc/metadata.svg similarity index 100% rename from resources/images/metadata.svg rename to imgsrc/metadata.svg diff --git a/resources/images/mimetypes/bmp.svg b/imgsrc/mimetypes/bmp.svg similarity index 100% rename from resources/images/mimetypes/bmp.svg rename to imgsrc/mimetypes/bmp.svg diff --git a/resources/images/mimetypes/computer.svg b/imgsrc/mimetypes/computer.svg similarity index 100% rename from resources/images/mimetypes/computer.svg rename to imgsrc/mimetypes/computer.svg diff --git a/resources/images/mimetypes/dir.svg b/imgsrc/mimetypes/dir.svg similarity index 100% rename from resources/images/mimetypes/dir.svg rename to imgsrc/mimetypes/dir.svg diff --git a/imgsrc/mimetypes/epub.svg b/imgsrc/mimetypes/epub.svg new file mode 100644 index 0000000000..9f2648db6d --- /dev/null +++ b/imgsrc/mimetypes/epub.svg @@ -0,0 +1,336 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + PUB + e + + diff --git a/imgsrc/mimetypes/fb2.svg b/imgsrc/mimetypes/fb2.svg new file mode 100644 index 0000000000..a88a4a8b8c --- /dev/null +++ b/imgsrc/mimetypes/fb2.svg @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/resources/images/mimetypes/gif.svg b/imgsrc/mimetypes/gif.svg similarity index 100% rename from resources/images/mimetypes/gif.svg rename to imgsrc/mimetypes/gif.svg diff --git a/resources/images/mimetypes/html.svg b/imgsrc/mimetypes/html.svg similarity index 100% rename from resources/images/mimetypes/html.svg rename to imgsrc/mimetypes/html.svg diff --git a/resources/images/mimetypes/jpeg.svg b/imgsrc/mimetypes/jpeg.svg similarity index 100% rename from resources/images/mimetypes/jpeg.svg rename to imgsrc/mimetypes/jpeg.svg diff --git a/resources/images/mimetypes/lit.svg b/imgsrc/mimetypes/lit.svg similarity index 100% rename from resources/images/mimetypes/lit.svg rename to imgsrc/mimetypes/lit.svg diff --git a/resources/images/mimetypes/lrf.svg b/imgsrc/mimetypes/lrf.svg similarity index 100% rename from resources/images/mimetypes/lrf.svg rename to imgsrc/mimetypes/lrf.svg diff --git a/resources/images/mimetypes/lrx.svg b/imgsrc/mimetypes/lrx.svg similarity index 100% rename from resources/images/mimetypes/lrx.svg rename to imgsrc/mimetypes/lrx.svg diff --git a/imgsrc/mimetypes/mobi.svg b/imgsrc/mimetypes/mobi.svg new file mode 100644 index 0000000000..970456b0cb --- /dev/null +++ b/imgsrc/mimetypes/mobi.svg @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + mobi + + + + + diff --git a/resources/images/mimetypes/odt.svg b/imgsrc/mimetypes/odt.svg similarity index 100% rename from resources/images/mimetypes/odt.svg rename to imgsrc/mimetypes/odt.svg diff --git a/resources/images/mimetypes/pdf.svg b/imgsrc/mimetypes/pdf.svg similarity index 100% rename from resources/images/mimetypes/pdf.svg rename to imgsrc/mimetypes/pdf.svg diff --git a/resources/images/mimetypes/png.svg b/imgsrc/mimetypes/png.svg similarity index 100% rename from resources/images/mimetypes/png.svg rename to imgsrc/mimetypes/png.svg diff --git a/resources/images/mimetypes/rar.svg b/imgsrc/mimetypes/rar.svg similarity index 100% rename from resources/images/mimetypes/rar.svg rename to imgsrc/mimetypes/rar.svg diff --git a/resources/images/mimetypes/rtf.svg b/imgsrc/mimetypes/rtf.svg similarity index 100% rename from resources/images/mimetypes/rtf.svg rename to imgsrc/mimetypes/rtf.svg diff --git a/resources/images/mimetypes/svg.svg b/imgsrc/mimetypes/svg.svg similarity index 100% rename from resources/images/mimetypes/svg.svg rename to imgsrc/mimetypes/svg.svg diff --git a/resources/images/mimetypes/txt.svg b/imgsrc/mimetypes/txt.svg similarity index 100% rename from resources/images/mimetypes/txt.svg rename to imgsrc/mimetypes/txt.svg diff --git a/resources/images/mimetypes/unknown.svg b/imgsrc/mimetypes/unknown.svg similarity index 100% rename from resources/images/mimetypes/unknown.svg rename to imgsrc/mimetypes/unknown.svg diff --git a/resources/images/mimetypes/zero.svg b/imgsrc/mimetypes/zero.svg similarity index 100% rename from resources/images/mimetypes/zero.svg rename to imgsrc/mimetypes/zero.svg diff --git a/resources/images/mimetypes/zip.svg b/imgsrc/mimetypes/zip.svg similarity index 100% rename from resources/images/mimetypes/zip.svg rename to imgsrc/mimetypes/zip.svg diff --git a/resources/images/minus.svg b/imgsrc/minus.svg similarity index 100% rename from resources/images/minus.svg rename to imgsrc/minus.svg diff --git a/resources/images/network-server.svg b/imgsrc/network-server.svg similarity index 100% rename from resources/images/network-server.svg rename to imgsrc/network-server.svg diff --git a/resources/images/news.svg b/imgsrc/news.svg similarity index 100% rename from resources/images/news.svg rename to imgsrc/news.svg diff --git a/resources/images/next.svg b/imgsrc/next.svg similarity index 100% rename from resources/images/next.svg rename to imgsrc/next.svg diff --git a/resources/images/ok.svg b/imgsrc/ok.svg similarity index 100% rename from resources/images/ok.svg rename to imgsrc/ok.svg diff --git a/resources/images/page.svg b/imgsrc/page.svg similarity index 100% rename from resources/images/page.svg rename to imgsrc/page.svg diff --git a/resources/images/plugins.svg b/imgsrc/plugins.svg similarity index 100% rename from resources/images/plugins.svg rename to imgsrc/plugins.svg diff --git a/resources/images/plus.svg b/imgsrc/plus.svg similarity index 100% rename from resources/images/plus.svg rename to imgsrc/plus.svg diff --git a/resources/images/previous.svg b/imgsrc/previous.svg similarity index 100% rename from resources/images/previous.svg rename to imgsrc/previous.svg diff --git a/resources/images/print-preview.svg b/imgsrc/print-preview.svg similarity index 100% rename from resources/images/print-preview.svg rename to imgsrc/print-preview.svg diff --git a/resources/images/print.svg b/imgsrc/print.svg similarity index 100% rename from resources/images/print.svg rename to imgsrc/print.svg diff --git a/resources/images/reader.svg b/imgsrc/reader.svg similarity index 100% rename from resources/images/reader.svg rename to imgsrc/reader.svg diff --git a/resources/images/save.svg b/imgsrc/save.svg similarity index 100% rename from resources/images/save.svg rename to imgsrc/save.svg diff --git a/resources/images/scheduler.svg b/imgsrc/scheduler.svg similarity index 100% rename from resources/images/scheduler.svg rename to imgsrc/scheduler.svg diff --git a/resources/images/sd.svg b/imgsrc/sd.svg similarity index 100% rename from resources/images/sd.svg rename to imgsrc/sd.svg diff --git a/resources/images/search.svg b/imgsrc/search.svg similarity index 100% rename from resources/images/search.svg rename to imgsrc/search.svg diff --git a/resources/images/search_add_saved.svg b/imgsrc/search_add_saved.svg similarity index 100% rename from resources/images/search_add_saved.svg rename to imgsrc/search_add_saved.svg diff --git a/resources/images/search_copy_saved.svg b/imgsrc/search_copy_saved.svg similarity index 100% rename from resources/images/search_copy_saved.svg rename to imgsrc/search_copy_saved.svg diff --git a/resources/images/search_delete_saved.svg b/imgsrc/search_delete_saved.svg similarity index 100% rename from resources/images/search_delete_saved.svg rename to imgsrc/search_delete_saved.svg diff --git a/resources/images/series.svg b/imgsrc/series.svg similarity index 100% rename from resources/images/series.svg rename to imgsrc/series.svg diff --git a/resources/images/swap.svg b/imgsrc/swap.svg similarity index 100% rename from resources/images/swap.svg rename to imgsrc/swap.svg diff --git a/resources/images/sync.svg b/imgsrc/sync.svg similarity index 100% rename from resources/images/sync.svg rename to imgsrc/sync.svg diff --git a/resources/images/tags.svg b/imgsrc/tags.svg similarity index 100% rename from resources/images/tags.svg rename to imgsrc/tags.svg diff --git a/resources/images/trash.svg b/imgsrc/trash.svg similarity index 100% rename from resources/images/trash.svg rename to imgsrc/trash.svg diff --git a/resources/images/user_profile.svg b/imgsrc/user_profile.svg similarity index 100% rename from resources/images/user_profile.svg rename to imgsrc/user_profile.svg diff --git a/resources/images/view.svg b/imgsrc/view.svg similarity index 100% rename from resources/images/view.svg rename to imgsrc/view.svg diff --git a/resources/images/viewer.svg b/imgsrc/viewer.svg similarity index 100% rename from resources/images/viewer.svg rename to imgsrc/viewer.svg diff --git a/resources/images/welcome_wizard.svg b/imgsrc/welcome_wizard.svg similarity index 100% rename from resources/images/welcome_wizard.svg rename to imgsrc/welcome_wizard.svg diff --git a/resources/images/window-close.svg b/imgsrc/window-close.svg similarity index 100% rename from resources/images/window-close.svg rename to imgsrc/window-close.svg diff --git a/resources/images/wizard.svg b/imgsrc/wizard.svg similarity index 100% rename from resources/images/wizard.svg rename to imgsrc/wizard.svg diff --git a/resources/catalog/stylesheet.css b/resources/catalog/stylesheet.css index 4f9ca9ac41..4c5045d378 100644 --- a/resources/catalog/stylesheet.css +++ b/resources/catalog/stylesheet.css @@ -6,7 +6,7 @@ p.title { text-align:center; font-style:italic; font-size:xx-large; - border-bottom: solid black 4px; + border-bottom: solid black 2px; } p.author { @@ -17,6 +17,15 @@ p.author { font-size:large; } +p.author_index { + font-size:large; + font-weight:bold; + text-align:left; + margin-top:0px; + margin-bottom:-2px; + text-indent: 0em; + } + p.tags { margin-top:0em; margin-bottom:0em; @@ -47,19 +56,12 @@ p.letter_index { margin-bottom:0px; } -p.author_index { - font-size:large; - text-align:left; - margin-top:0px; - margin-bottom:0px; - text-indent: 0em; - } - p.series { - text-align: left; - margin-top:0px; + font-style:italic; + margin-top:2px; margin-bottom:0px; margin-left:2em; + text-align:left; text-indent:-2em; } @@ -87,11 +89,13 @@ p.date_read { text-indent:-6em; } -hr.series_divider { - width:50%; - margin-left:1em; - margin-top:0em; - margin-bottom:0em; +hr.description_divider { + width:90%; + margin-left:5%; + border-top: solid white 0px; + border-right: solid white 0px; + border-bottom: solid black 1px; + border-left: solid white 0px; } hr.annotations_divider { diff --git a/resources/content_server/gui.js b/resources/content_server/gui.js index 9c20037207..631fb8b617 100644 --- a/resources/content_server/gui.js +++ b/resources/content_server/gui.js @@ -26,7 +26,7 @@ var current_library_request = null; ////////////////////////////// GET BOOK LIST ////////////////////////////// -var LIBRARY_FETCH_TIMEOUT = 10000; // milliseconds +var LIBRARY_FETCH_TIMEOUT = 30000; // milliseconds function create_table_headers() { var thead = $('table#book_list thead tr'); @@ -50,7 +50,7 @@ function render_book(book) { var comments = $.trim(book.text()).replace(/\n\n/, '
'); var formats = new Array(); var size = (parseFloat(book.attr('size'))/(1024*1024)).toFixed(1); - var tags = book.attr('tags').replace(/,/g, ', '); + var tags = book.attr('tags') formats = book.attr("formats").split(","); if (formats.length > 0) { for (i=0; i < formats.length; i++) { @@ -59,7 +59,14 @@ function render_book(book) { title = title.slice(0, title.length-2); title += ' ({0} MB) '.format(size); } - if (tags) title += '[{0}]'.format(tags); + if (tags) title += 'Tags=[{0}] '.format(tags); + custcols = book.attr("custcols").split(',') + for ( i = 0; i < custcols.length; i++) { + if (custcols[i].length > 0) { + vals = book.attr(custcols[i]).split(':#:', 2); + title += '{0}=[{1}] '.format(vals[0], vals[1]); + } + } title += ''.format(id); title += '
{0}
'.format(comments) // Render authors cell @@ -290,7 +297,7 @@ function layout() { } $(function() { - // document is ready + // document is ready create_table_headers(); // Setup widgets diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index e03b0680be..66ee4d1471 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -90,4 +90,27 @@ save_template_title_series_sorting = 'library_order' # Examples: # auto_connect_to_folder = 'C:\\Users\\someone\\Desktop\\testlib' # auto_connect_to_folder = '/home/dropbox/My Dropbox/someone/library' -auto_connect_to_folder = '' \ No newline at end of file +auto_connect_to_folder = '' + + +# Create search terms to apply a query across several built-in search terms. +# Syntax: {'new term':['existing term 1', 'term 2', ...], 'new':['old'...] ...} +# Example: create the term 'myseries' that when used as myseries:foo would +# search all of the search categories 'series', '#myseries', and '#myseries2': +# grouped_search_terms={'myseries':['series','#myseries', '#myseries2']} +# Example: two search terms 'a' and 'b' both that search 'tags' and '#mytags': +# grouped_search_terms={'a':['tags','#mytags'], 'b':['tags','#mytags']} +# Note: You cannot create a search term that is a duplicate of an existing term. +# Such duplicates will be silently ignored. Also note that search terms ignore +# case. 'MySearch' and 'mysearch' are the same term. +grouped_search_terms = {} + + +# Set this to True (not 'True') to ensure that tags in 'Tags to add when adding +# a book' are added when copying books to another library +add_new_book_tags_when_importing_books = False + + +# Set the maximum number of tags to show per book in the content server +max_content_server_tags_shown=5 + diff --git a/resources/images/add_book.png b/resources/images/add_book.png new file mode 100644 index 0000000000..d6c678ecac Binary files /dev/null and b/resources/images/add_book.png differ diff --git a/resources/images/arrow-down.png b/resources/images/arrow-down.png new file mode 100644 index 0000000000..3ff7d46058 Binary files /dev/null and b/resources/images/arrow-down.png differ diff --git a/resources/images/arrow-up.png b/resources/images/arrow-up.png new file mode 100644 index 0000000000..f16e69a8ec Binary files /dev/null and b/resources/images/arrow-up.png differ diff --git a/resources/images/auto_author_sort.png b/resources/images/auto_author_sort.png new file mode 100644 index 0000000000..a6787f19fb Binary files /dev/null and b/resources/images/auto_author_sort.png differ diff --git a/resources/images/back.png b/resources/images/back.png new file mode 100644 index 0000000000..4b2bceb6ed Binary files /dev/null and b/resources/images/back.png differ diff --git a/resources/images/blank.png b/resources/images/blank.png new file mode 100644 index 0000000000..60b8803d95 Binary files /dev/null and b/resources/images/blank.png differ diff --git a/resources/images/book.png b/resources/images/book.png new file mode 100644 index 0000000000..a49c8f3db9 Binary files /dev/null and b/resources/images/book.png differ diff --git a/resources/images/bookmarks.png b/resources/images/bookmarks.png new file mode 100644 index 0000000000..91613db90b Binary files /dev/null and b/resources/images/bookmarks.png differ diff --git a/resources/images/books_in_series.png b/resources/images/books_in_series.png new file mode 100644 index 0000000000..67d5be2fdd Binary files /dev/null and b/resources/images/books_in_series.png differ diff --git a/resources/images/catalog.png b/resources/images/catalog.png new file mode 100644 index 0000000000..c422cf0861 Binary files /dev/null and b/resources/images/catalog.png differ diff --git a/resources/images/chapters.png b/resources/images/chapters.png new file mode 100644 index 0000000000..a904bcec87 Binary files /dev/null and b/resources/images/chapters.png differ diff --git a/resources/images/clear_left.png b/resources/images/clear_left.png new file mode 100644 index 0000000000..dcf7263e89 Binary files /dev/null and b/resources/images/clear_left.png differ diff --git a/resources/images/column.png b/resources/images/column.png new file mode 100644 index 0000000000..0a5f184601 Binary files /dev/null and b/resources/images/column.png differ diff --git a/resources/images/column.svg b/resources/images/column.svg deleted file mode 100644 index 4d6f4b809e..0000000000 --- a/resources/images/column.svg +++ /dev/null @@ -1,61 +0,0 @@ - -Capitello modanatura modanature moulure mouluresbuildingArchitetto Francesco RollandinArchitetto Francesco RollandinArchitetto Francesco Rollandinimage/svg+xmlen - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/images/config.png b/resources/images/config.png new file mode 100644 index 0000000000..81d1318b56 Binary files /dev/null and b/resources/images/config.png differ diff --git a/resources/images/connect_share.png b/resources/images/connect_share.png new file mode 100644 index 0000000000..0932ce42de Binary files /dev/null and b/resources/images/connect_share.png differ diff --git a/resources/images/convert.png b/resources/images/convert.png new file mode 100644 index 0000000000..89f0d7352e Binary files /dev/null and b/resources/images/convert.png differ diff --git a/resources/images/cover_flow.png b/resources/images/cover_flow.png new file mode 100644 index 0000000000..0f3a324a1a Binary files /dev/null and b/resources/images/cover_flow.png differ diff --git a/resources/images/debug.png b/resources/images/debug.png new file mode 100644 index 0000000000..790a603dcd Binary files /dev/null and b/resources/images/debug.png differ diff --git a/resources/images/default_cover.png b/resources/images/default_cover.png new file mode 100644 index 0000000000..bd3d546203 Binary files /dev/null and b/resources/images/default_cover.png differ diff --git a/resources/images/devices/folder.png b/resources/images/devices/folder.png new file mode 100644 index 0000000000..febee0ce2c Binary files /dev/null and b/resources/images/devices/folder.png differ diff --git a/resources/images/dialog_error.png b/resources/images/dialog_error.png new file mode 100644 index 0000000000..2956723fee Binary files /dev/null and b/resources/images/dialog_error.png differ diff --git a/resources/images/dialog_information.png b/resources/images/dialog_information.png new file mode 100644 index 0000000000..bdfe771002 Binary files /dev/null and b/resources/images/dialog_information.png differ diff --git a/resources/images/dialog_question.png b/resources/images/dialog_question.png new file mode 100644 index 0000000000..251ced14c9 Binary files /dev/null and b/resources/images/dialog_question.png differ diff --git a/resources/images/dialog_warning.png b/resources/images/dialog_warning.png new file mode 100644 index 0000000000..8375ed463e Binary files /dev/null and b/resources/images/dialog_warning.png differ diff --git a/resources/images/dictionary.png b/resources/images/dictionary.png new file mode 100644 index 0000000000..a4b395685c Binary files /dev/null and b/resources/images/dictionary.png differ diff --git a/resources/images/document_open.png b/resources/images/document_open.png new file mode 100644 index 0000000000..b9fd9e5f1e Binary files /dev/null and b/resources/images/document_open.png differ diff --git a/resources/images/donate.png b/resources/images/donate.png new file mode 100644 index 0000000000..dc726c896a Binary files /dev/null and b/resources/images/donate.png differ diff --git a/resources/images/drawer.png b/resources/images/drawer.png new file mode 100644 index 0000000000..dd33c2ad6e Binary files /dev/null and b/resources/images/drawer.png differ diff --git a/resources/images/drawer.svg b/resources/images/drawer.svg deleted file mode 100644 index 679bca53b2..0000000000 --- a/resources/images/drawer.svg +++ /dev/null @@ -1,2679 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/images/edit_copy.png b/resources/images/edit_copy.png new file mode 100644 index 0000000000..0760f6b52b Binary files /dev/null and b/resources/images/edit_copy.png differ diff --git a/resources/images/edit_input.png b/resources/images/edit_input.png new file mode 100644 index 0000000000..63fe3d34e5 Binary files /dev/null and b/resources/images/edit_input.png differ diff --git a/resources/images/eject.png b/resources/images/eject.png new file mode 100644 index 0000000000..748a8b7f7d Binary files /dev/null and b/resources/images/eject.png differ diff --git a/resources/images/exec.png b/resources/images/exec.png new file mode 100644 index 0000000000..f4a2161d3f Binary files /dev/null and b/resources/images/exec.png differ diff --git a/resources/images/font_size_larger.png b/resources/images/font_size_larger.png new file mode 100644 index 0000000000..7bc0fad27a Binary files /dev/null and b/resources/images/font_size_larger.png differ diff --git a/resources/images/font_size_smaller.png b/resources/images/font_size_smaller.png new file mode 100644 index 0000000000..56bff937e1 Binary files /dev/null and b/resources/images/font_size_smaller.png differ diff --git a/resources/images/forward.png b/resources/images/forward.png new file mode 100644 index 0000000000..95bde41e8d Binary files /dev/null and b/resources/images/forward.png differ diff --git a/resources/images/help.png b/resources/images/help.png new file mode 100644 index 0000000000..5e869ef201 Binary files /dev/null and b/resources/images/help.png differ diff --git a/resources/images/jobs.png b/resources/images/jobs.png new file mode 100644 index 0000000000..a9e8dcec89 Binary files /dev/null and b/resources/images/jobs.png differ diff --git a/resources/images/list_remove.png b/resources/images/list_remove.png new file mode 100644 index 0000000000..323bcdd697 Binary files /dev/null and b/resources/images/list_remove.png differ diff --git a/resources/images/lookfeel.png b/resources/images/lookfeel.png new file mode 100644 index 0000000000..4d3690bf8d Binary files /dev/null and b/resources/images/lookfeel.png differ diff --git a/resources/images/mail.png b/resources/images/mail.png new file mode 100644 index 0000000000..718103cb53 Binary files /dev/null and b/resources/images/mail.png differ diff --git a/resources/images/merge_books.png b/resources/images/merge_books.png new file mode 100644 index 0000000000..4097e3457e Binary files /dev/null and b/resources/images/merge_books.png differ diff --git a/resources/images/metadata.png b/resources/images/metadata.png new file mode 100644 index 0000000000..0d294b1ca9 Binary files /dev/null and b/resources/images/metadata.png differ diff --git a/resources/images/mimetypes/bmp.png b/resources/images/mimetypes/bmp.png new file mode 100644 index 0000000000..f8d4274e14 Binary files /dev/null and b/resources/images/mimetypes/bmp.png differ diff --git a/resources/images/mimetypes/computer.png b/resources/images/mimetypes/computer.png new file mode 100644 index 0000000000..c15662dba7 Binary files /dev/null and b/resources/images/mimetypes/computer.png differ diff --git a/resources/images/mimetypes/dir.png b/resources/images/mimetypes/dir.png new file mode 100644 index 0000000000..36f9f423bb Binary files /dev/null and b/resources/images/mimetypes/dir.png differ diff --git a/resources/images/mimetypes/epub.png b/resources/images/mimetypes/epub.png new file mode 100644 index 0000000000..61f0f51384 Binary files /dev/null and b/resources/images/mimetypes/epub.png differ diff --git a/resources/images/mimetypes/epub.svg b/resources/images/mimetypes/epub.svg deleted file mode 100644 index 0c3a31964f..0000000000 --- a/resources/images/mimetypes/epub.svg +++ /dev/null @@ -1,830 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PUB - - e - diff --git a/resources/images/mimetypes/fb2.png b/resources/images/mimetypes/fb2.png new file mode 100644 index 0000000000..4778a4848f Binary files /dev/null and b/resources/images/mimetypes/fb2.png differ diff --git a/resources/images/mimetypes/fb2.svg b/resources/images/mimetypes/fb2.svg deleted file mode 100644 index 009ca7d109..0000000000 --- a/resources/images/mimetypes/fb2.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - diff --git a/resources/images/mimetypes/gif.png b/resources/images/mimetypes/gif.png new file mode 100644 index 0000000000..f8d4274e14 Binary files /dev/null and b/resources/images/mimetypes/gif.png differ diff --git a/resources/images/mimetypes/html.png b/resources/images/mimetypes/html.png new file mode 100644 index 0000000000..710c721ab3 Binary files /dev/null and b/resources/images/mimetypes/html.png differ diff --git a/resources/images/mimetypes/jpeg.png b/resources/images/mimetypes/jpeg.png new file mode 100644 index 0000000000..f8d4274e14 Binary files /dev/null and b/resources/images/mimetypes/jpeg.png differ diff --git a/resources/images/mimetypes/lit.png b/resources/images/mimetypes/lit.png new file mode 100644 index 0000000000..83999940a6 Binary files /dev/null and b/resources/images/mimetypes/lit.png differ diff --git a/resources/images/mimetypes/lrf.png b/resources/images/mimetypes/lrf.png new file mode 100644 index 0000000000..b29d3b381a Binary files /dev/null and b/resources/images/mimetypes/lrf.png differ diff --git a/resources/images/mimetypes/lrx.png b/resources/images/mimetypes/lrx.png new file mode 100644 index 0000000000..8496a30345 Binary files /dev/null and b/resources/images/mimetypes/lrx.png differ diff --git a/resources/images/mimetypes/mobi.png b/resources/images/mimetypes/mobi.png new file mode 100644 index 0000000000..cb1230a15b Binary files /dev/null and b/resources/images/mimetypes/mobi.png differ diff --git a/resources/images/mimetypes/mobi.svg b/resources/images/mimetypes/mobi.svg deleted file mode 100644 index 88d19f6c0d..0000000000 --- a/resources/images/mimetypes/mobi.svg +++ /dev/null @@ -1,583 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - mobi - - - - diff --git a/resources/images/mimetypes/odt.png b/resources/images/mimetypes/odt.png new file mode 100644 index 0000000000..8765b3eb0b Binary files /dev/null and b/resources/images/mimetypes/odt.png differ diff --git a/resources/images/mimetypes/pdf.png b/resources/images/mimetypes/pdf.png new file mode 100644 index 0000000000..a0b1961cde Binary files /dev/null and b/resources/images/mimetypes/pdf.png differ diff --git a/resources/images/mimetypes/png.png b/resources/images/mimetypes/png.png new file mode 100644 index 0000000000..edbe5afa1b Binary files /dev/null and b/resources/images/mimetypes/png.png differ diff --git a/resources/images/mimetypes/rar.png b/resources/images/mimetypes/rar.png new file mode 100644 index 0000000000..1be23aabbb Binary files /dev/null and b/resources/images/mimetypes/rar.png differ diff --git a/resources/images/mimetypes/rtf.png b/resources/images/mimetypes/rtf.png new file mode 100644 index 0000000000..4cc6604cc2 Binary files /dev/null and b/resources/images/mimetypes/rtf.png differ diff --git a/resources/images/mimetypes/svg.png b/resources/images/mimetypes/svg.png new file mode 100644 index 0000000000..c6ee95c4e2 Binary files /dev/null and b/resources/images/mimetypes/svg.png differ diff --git a/resources/images/mimetypes/txt.png b/resources/images/mimetypes/txt.png new file mode 100644 index 0000000000..1febe414d4 Binary files /dev/null and b/resources/images/mimetypes/txt.png differ diff --git a/resources/images/mimetypes/unknown.png b/resources/images/mimetypes/unknown.png new file mode 100644 index 0000000000..75d1ae4ae5 Binary files /dev/null and b/resources/images/mimetypes/unknown.png differ diff --git a/resources/images/mimetypes/zero.png b/resources/images/mimetypes/zero.png new file mode 100644 index 0000000000..43462d91f4 Binary files /dev/null and b/resources/images/mimetypes/zero.png differ diff --git a/resources/images/mimetypes/zip.png b/resources/images/mimetypes/zip.png new file mode 100644 index 0000000000..a3ee074086 Binary files /dev/null and b/resources/images/mimetypes/zip.png differ diff --git a/resources/images/minus.png b/resources/images/minus.png new file mode 100644 index 0000000000..d9054cc90c Binary files /dev/null and b/resources/images/minus.png differ diff --git a/resources/images/network-server.png b/resources/images/network-server.png new file mode 100644 index 0000000000..b75de74928 Binary files /dev/null and b/resources/images/network-server.png differ diff --git a/resources/images/news.png b/resources/images/news.png new file mode 100644 index 0000000000..bfa62b211f Binary files /dev/null and b/resources/images/news.png differ diff --git a/resources/images/news/journalgazette.png b/resources/images/news/journalgazette.png new file mode 100644 index 0000000000..f9b3316cab Binary files /dev/null and b/resources/images/news/journalgazette.png differ diff --git a/resources/images/news/kstar.png b/resources/images/news/kstar.png new file mode 100644 index 0000000000..03eced9c44 Binary files /dev/null and b/resources/images/news/kstar.png differ diff --git a/resources/images/news/walrusmag.png b/resources/images/news/walrusmag.png new file mode 100644 index 0000000000..17030d94b8 Binary files /dev/null and b/resources/images/news/walrusmag.png differ diff --git a/resources/images/next.png b/resources/images/next.png new file mode 100644 index 0000000000..2df68e42dc Binary files /dev/null and b/resources/images/next.png differ diff --git a/resources/images/ok.png b/resources/images/ok.png new file mode 100644 index 0000000000..3f8dc38a8c Binary files /dev/null and b/resources/images/ok.png differ diff --git a/resources/images/page.png b/resources/images/page.png new file mode 100644 index 0000000000..71a1b00e68 Binary files /dev/null and b/resources/images/page.png differ diff --git a/resources/images/plugins.png b/resources/images/plugins.png new file mode 100644 index 0000000000..804aa98d7a Binary files /dev/null and b/resources/images/plugins.png differ diff --git a/resources/images/plus.png b/resources/images/plus.png new file mode 100644 index 0000000000..130528836c Binary files /dev/null and b/resources/images/plus.png differ diff --git a/resources/images/previous.png b/resources/images/previous.png new file mode 100644 index 0000000000..d21b443aa3 Binary files /dev/null and b/resources/images/previous.png differ diff --git a/resources/images/print-preview.png b/resources/images/print-preview.png new file mode 100644 index 0000000000..88e7cc0c97 Binary files /dev/null and b/resources/images/print-preview.png differ diff --git a/resources/images/print.png b/resources/images/print.png new file mode 100644 index 0000000000..c120d5ff01 Binary files /dev/null and b/resources/images/print.png differ diff --git a/resources/images/reader.png b/resources/images/reader.png new file mode 100644 index 0000000000..bfc532f5ee Binary files /dev/null and b/resources/images/reader.png differ diff --git a/resources/images/save.png b/resources/images/save.png new file mode 100644 index 0000000000..57ba0686ae Binary files /dev/null and b/resources/images/save.png differ diff --git a/resources/images/scheduler.png b/resources/images/scheduler.png new file mode 100644 index 0000000000..0035262d1c Binary files /dev/null and b/resources/images/scheduler.png differ diff --git a/resources/images/sd.png b/resources/images/sd.png new file mode 100644 index 0000000000..23ebd3d6a5 Binary files /dev/null and b/resources/images/sd.png differ diff --git a/resources/images/search.png b/resources/images/search.png new file mode 100644 index 0000000000..1fd7872786 Binary files /dev/null and b/resources/images/search.png differ diff --git a/resources/images/search_add_saved.png b/resources/images/search_add_saved.png new file mode 100644 index 0000000000..1395f69094 Binary files /dev/null and b/resources/images/search_add_saved.png differ diff --git a/resources/images/search_copy_saved.png b/resources/images/search_copy_saved.png new file mode 100644 index 0000000000..579b529cf0 Binary files /dev/null and b/resources/images/search_copy_saved.png differ diff --git a/resources/images/search_delete_saved.png b/resources/images/search_delete_saved.png new file mode 100644 index 0000000000..5e40e68de3 Binary files /dev/null and b/resources/images/search_delete_saved.png differ diff --git a/resources/images/series.png b/resources/images/series.png new file mode 100644 index 0000000000..7b1138b5e4 Binary files /dev/null and b/resources/images/series.png differ diff --git a/resources/images/swap.png b/resources/images/swap.png new file mode 100644 index 0000000000..e5aeb60e22 Binary files /dev/null and b/resources/images/swap.png differ diff --git a/resources/images/sync.png b/resources/images/sync.png new file mode 100644 index 0000000000..2219f01fa8 Binary files /dev/null and b/resources/images/sync.png differ diff --git a/resources/images/tags.png b/resources/images/tags.png new file mode 100644 index 0000000000..816adb3504 Binary files /dev/null and b/resources/images/tags.png differ diff --git a/resources/images/trash.png b/resources/images/trash.png new file mode 100644 index 0000000000..f5d453a173 Binary files /dev/null and b/resources/images/trash.png differ diff --git a/resources/images/user_profile.png b/resources/images/user_profile.png new file mode 100644 index 0000000000..7f08ad437c Binary files /dev/null and b/resources/images/user_profile.png differ diff --git a/resources/images/view.png b/resources/images/view.png new file mode 100644 index 0000000000..6c9d3e498d Binary files /dev/null and b/resources/images/view.png differ diff --git a/resources/images/viewer.png b/resources/images/viewer.png new file mode 100644 index 0000000000..8bcab85ed2 Binary files /dev/null and b/resources/images/viewer.png differ diff --git a/resources/images/welcome_wizard.png b/resources/images/welcome_wizard.png new file mode 100644 index 0000000000..fa1536a3a4 Binary files /dev/null and b/resources/images/welcome_wizard.png differ diff --git a/resources/images/window-close.png b/resources/images/window-close.png new file mode 100644 index 0000000000..2bee0fc10e Binary files /dev/null and b/resources/images/window-close.png differ diff --git a/resources/images/wizard.png b/resources/images/wizard.png new file mode 100644 index 0000000000..df492e6112 Binary files /dev/null and b/resources/images/wizard.png differ diff --git a/resources/recipes/buckmasters.recipe b/resources/recipes/buckmasters.recipe new file mode 100644 index 0000000000..e3d852fa07 --- /dev/null +++ b/resources/recipes/buckmasters.recipe @@ -0,0 +1,42 @@ +from calibre.web.feeds.news import BasicNewsRecipe +from calibre.ebooks.BeautifulSoup import Tag + +class AdvancedUserRecipe1282101454(BasicNewsRecipe): + title = 'BuckMasters In The Kitchen' + language = 'en' + __author__ = 'TonytheBookworm & Starson17' + description = 'Learn how to cook all those outdoor varments' + publisher = 'BuckMasters.com' + category = 'food,cooking,recipes' + oldest_article = 365 + max_articles_per_feed = 100 + conversion_options = {'linearize_tables' : True} + masthead_url = 'http://www.buckmasters.com/Portals/_default/Skins/BM_10/images/header_bg.jpg' + keep_only_tags = [ + dict(name='table', attrs={'class':['containermaster_black']}) + ] + remove_tags_after = [dict(name='div', attrs={'align':['left']})] + feeds = [ + ('Recipes', 'http://www.buckmasters.com/DesktopModules/DnnForge%20-%20NewsArticles/RSS.aspx?TabID=292&ModuleID=658&MaxCount=25'), + ] + + def preprocess_html(self, soup): + item = soup.find('a', attrs={'class':['MenuTopSelected']}) + if item: + item.parent.extract() + for img_tag in soup.findAll('img'): + parent_tag = img_tag.parent + if parent_tag.name == 'a': + new_tag = Tag(soup,'p') + new_tag.insert(0,img_tag) + parent_tag.replaceWith(new_tag) + elif parent_tag.name == 'p': + if not self.tag_to_string(parent_tag) == '': + new_div = Tag(soup,'div') + new_tag = Tag(soup,'p') + new_tag.insert(0,img_tag) + parent_tag.replaceWith(new_div) + new_div.insert(0,new_tag) + new_div.insert(1,parent_tag) + return soup + diff --git a/resources/recipes/el_pais.recipe b/resources/recipes/el_pais.recipe index c953a4dd95..1e2164b2af 100644 --- a/resources/recipes/el_pais.recipe +++ b/resources/recipes/el_pais.recipe @@ -1,8 +1,8 @@ #!/usr/bin/env python __license__ = 'GPL v3' -__author__ = 'Lorenzo Vigentini, based on earlier version by Kovid Goyal' +__author__ = 'Jordi Balcells, based on an earlier version by Lorenzo Vigentini & Kovid Goyal' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' -description = 'Main daily newspaper from Spain - v1.02 (10, January 2010)' +description = 'Main daily newspaper from Spain - v1.03 (03, September 2010)' __docformat__ = 'restructuredtext en' ''' @@ -12,12 +12,12 @@ elpais.es from calibre.web.feeds.news import BasicNewsRecipe class ElPais(BasicNewsRecipe): - __author__ = 'Kovid Goyal & Lorenzo Vigentini' + __author__ = 'Kovid Goyal & Lorenzo Vigentini & Jordi Balcells' description = 'Main daily newspaper from Spain' cover_url = 'http://www.elpais.com/im/tit_logo_global.gif' title = u'El Pais' - publisher = 'Ediciones El Pais SL' + publisher = u'Ediciones El Pa\xeds SL' category = 'News, politics, culture, economy, general interest' language = 'es' @@ -32,7 +32,8 @@ class ElPais(BasicNewsRecipe): remove_javascript = True no_stylesheets = True - keep_only_tags = [ dict(name='div', attrs={'class':['cabecera_noticia','cabecera_noticia_reportaje','contenido_noticia','caja_despiece','presentacion']})] + keep_only_tags = [ dict(name='div', attrs={'class':['cabecera_noticia','cabecera_noticia_reportaje','cabecera_noticia_opinion','contenido_noticia','caja_despiece','presentacion']})] + extra_css = ''' p{style:normal size:12 serif} @@ -40,25 +41,29 @@ class ElPais(BasicNewsRecipe): remove_tags = [ dict(name='div', attrs={'class':['zona_superior','pie_enlaces_inferiores','contorno_f','ampliar']}), - dict(name='div', attrs={'class':['limpiar','mod_apoyo','borde_sup','votos','info_complementa','info_relacionada']}), - dict(name='div', attrs={'id':['suscribirse suscrito','google_noticia','utilidades','coment','foros_not','pie','lomas']}) + dict(name='div', attrs={'class':['limpiar','mod_apoyo','borde_sup','votos','info_complementa','info_relacionada','buscador_m','nav_ant_sig']}), + dict(name='div', attrs={'id':['suscribirse suscrito','google_noticia','utilidades','coment','foros_not','pie','lomas','calendar']}), + dict(name='p', attrs={'class':'nav_meses'}), + dict(attrs={'class':['enlaces_m','miniaturas_m']}) ] feeds = [ (u'Titulares de portada', u'http://www.elpais.com/rss/feed.html?feedId=1022'), (u'Internacional', u'http://www.elpais.com/rss/feed.html?feedId=1001'), - (u'Espana', u'http://www.elpais.com/rss/feed.html?feedId=1002'), + (u'Espa\xf1a', u'http://www.elpais.com/rss/feed.html?feedId=1002'), (u'Deportes', u'http://www.elpais.com/rss/feed.html?feedId=1007'), - (u'Economia', u'http://www.elpais.com/rss/feed.html?feedId=1006'), - (u'Politica', u'http://www.elpais.com/rss/feed.html?feedId=17073'), - (u'Tecnologia', u'http://www.elpais.com/rss/feed.html?feedId=1005'), + (u'Econom\xeda', u'http://www.elpais.com/rss/feed.html?feedId=1006'), + (u'Pol\xedtica', u'http://www.elpais.com/rss/feed.html?feedId=17073'), + (u'Tecnolog\xeda', u'http://www.elpais.com/rss/feed.html?feedId=1005'), (u'Cultura', u'http://www.elpais.com/rss/feed.html?feedId=1008'), (u'Gente', u'http://www.elpais.com/rss/feed.html?feedId=1009'), (u'Sociedad', u'http://www.elpais.com/rss/feed.html?feedId=1004'), - (u'Opinion', u'http://www.elpais.com/rss/feed.html?feedId=1003'), + (u'Opini\xf3n', u'http://www.elpais.com/rss/feed.html?feedId=1003'), (u'Ciencia', u'http://www.elpais.com/rss/feed.html?feedId=17068'), (u'Justicia y leyes', u'http://www.elpais.com/rss/feed.html?feedId=17069'), - ] + (u'Medio ambiente', u'http://www.elpais.com/rss/feed.html?feedId=17071'), + (u'Vi\xf1etas', u'http://www.elpais.com/rss/feed.html?feedId=17058') + ] def print_version(self, url): url = url+'?print=1' diff --git a/resources/recipes/hawaii.recipe b/resources/recipes/hawaii.recipe index 30a2b26def..5413d289b5 100644 --- a/resources/recipes/hawaii.recipe +++ b/resources/recipes/hawaii.recipe @@ -2,8 +2,8 @@ from calibre.web.feeds.news import BasicNewsRecipe class AdvancedUserRecipe1282101454(BasicNewsRecipe): title = 'West Hawaii Today' - language = 'en' __author__ = 'Tony Stegall' + language = 'en' description = 'Westhawaiitoday.com' publisher = 'West Hawaii ' category = 'news,Hawaii,USA' @@ -22,7 +22,7 @@ class AdvancedUserRecipe1282101454(BasicNewsRecipe): ('Local News', 'http://www.westhawaiitoday.com/?rss=local/'), ('Local Sports', 'http://www.westhawaiitoday.com/?rss=sports/local_sports/'), ('Big Fish List', 'http://www.westhawaiitoday.com/?rss=sports/big_fish_list/'), - ('Local Features' 'http://www.westhawaiitoday.com/?rss=features/'), + ('Local Features', 'http://www.westhawaiitoday.com/?rss=features/'), ('Obituaries', 'http://www.westhawaiitoday.com/?rss=obituaries/'), ('Letters To Editor', 'http://www.westhawaiitoday.com/?rss=opinion/letters_-_your_voice/'), ('Editorial', 'http://www.westhawaiitoday.com/?rss=opinion/editorial/'), diff --git a/resources/recipes/hoy.recipe b/resources/recipes/hoy.recipe new file mode 100644 index 0000000000..167d57d3a1 --- /dev/null +++ b/resources/recipes/hoy.recipe @@ -0,0 +1,69 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +__license__ = 'GPL v3' +__copyright__ = '2010, Francisco Javier Nieto ' +''' +www.hoy.es +''' + +from calibre.web.feeds.news import BasicNewsRecipe +from calibre.ebooks.BeautifulSoup import Tag + +class Hoy(BasicNewsRecipe): + title = 'HOY' + __author__ = 'Fco Javier Nieto' + description = u'Noticias desde Extremadura' + publisher = 'HOY' + category = 'news, politics, Spain, Extremadura' + oldest_article = 2 + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + delay = 1 + encoding = 'cp1252' + language = 'es' + + feeds = [ + (u'Portada' , u'http://www.hoy.es/portada.xml' ), + (u'Regional' , u'http://www.hoy.es/rss/feeds/regional.xml' ), + (u'Prov de Badajoz' , u'http://www.hoy.es/rss/feeds/prov_badajoz.xml' ), + (u'Prov de Caceres' , u'http://www.hoy.es/rss/feeds/prov_caceres.xml' ), + (u'Badajoz' , u'http://www.hoy.es/rss/feeds/badajoz.xml' ), + (u'Caceres' , u'http://www.hoy.es/rss/feeds/caceres.xml' ), + (u'Merida' , u'http://www.hoy.es/rss/feeds/merida.xml' ), + (u'Opinion' , u'http://www.hoy.es/rss/feeds/opinion.xml' ), + (u'Nacional' , u'http://www.hoy.es/rss/feeds/nacional.xml' ), + (u'Internacional' , u'http://www.hoy.es/rss/feeds/internacional.xml' ), + (u'Economia' , u'http://www.hoy.es/rss/feeds/economia.xml' ), + (u'Deportes' , u'http://www.hoy.es/rss/feeds/deportes.xml' ), + (u'Sociedad' , u'http://www.hoy.es/rss/feeds/sociedad.xml' ), + (u'Cultura' , u'http://www.hoy.es/rss/feeds/cultura.xml' ), + (u'Television' , u'http://www.hoy.es/rss/feeds/television.xml' ), + (u'contraportada' , u'http://www.hoy.es/rss/feeds/contraportada.xml' ) + ] + + + keep_only_tags = [ + dict(name='h1', attrs={'class':['headline']}), + dict(name='h2', attrs={'class':['subhead']}), + dict(name='div', attrs={'class':['text']}) + ] + + remove_tags = [ + dict(name=['object','link','script']) + ,dict(name='div', attrs={'class':['colC_articulo','peu']}) + ] + + remove_tags_after = [dict(name='div', attrs={'class':'text'})] + + extra_css = '.headline {font: sans-serif 2em;}\n.subhead,h2{font: sans-serif 1.5em\n' + + def preprocess_html(self, soup): + soup.html['dir' ] = self.direction + mcharset = Tag(soup,'meta',[("http-equiv","Content-Type"),("content","text/html; charset=utf-8")]) + soup.head.insert(0,mcharset) + for item in soup.findAll(style=True): + del item['style'] + return soup + diff --git a/resources/recipes/journalgazette.recipe b/resources/recipes/journalgazette.recipe new file mode 100644 index 0000000000..406917f5ce --- /dev/null +++ b/resources/recipes/journalgazette.recipe @@ -0,0 +1,64 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__author__ = 'somedayson & TonytheBookworm, revised by Cynthia Clavey' +__copyright__ = '2010, Cynthia Clavey cynvision@yahoo.com' +__version__ = '1.02' +__date__ = '05, september 2010' +__docformat__ = 'restructuredtext en' +from calibre.web.feeds.recipes import BasicNewsRecipe + +class AdvancedUserRecipe1283666183(BasicNewsRecipe): + title = u'Journal Gazette Ft. Wayne IN' + __author__ = 'cynvision' + oldest_article = 1 + max_articles_per_feed = 8 + no_stylesheets = True + remove_javascript = True + use_embedded_content = False + keep_only_tags = [dict(name='div', attrs={'id':'mainContent'})] + extra_css = '#copyinfo { font-size: 6 ;} \n #photocredit { font-size: 6 ;} \n .pubinfo { font-size: 6 ;}' + masthead_url = 'http://www.journalgazette.net/img/icons/jgmini.gif' +# cover_url = 'http://www.journalgazette.net/img/icons/jgmini.gif' + encoding = 'cp1252' + + feeds = [(u'Opinion', u'http://journalgazette.net/apps/pbcs.dll/section?Category=EDIT&template=blogrss&mime=xml'), + (u'Local News',u'http://journalgazette.net/apps/pbcs.dll/section?Category=LOCAL&template=blogrss&mime=xml') , + (u'Sports',u'http://journalgazette.net/apps/pbcs.dll/section?Category=SPORTS&template=blogrss&mime=xml' ), + (u'Features',u'http://journalgazette.net/apps/pbcs.dll/section?Category=FEAT&template=blogrss&mime=xml'), + (u'Business',u'http://journalgazette.net/apps/pbcs.dll/section?Category=BIZ&template=blogrss&mime=xml'), + (u'Ice Chips',u'http://journalgazette.net/apps/pbcs.dll/section?Category=BLOGS11&template=blogrss&mime=xml '), + (u'Entertainment',u'http://journalgazette.net/apps/pbcs.dll/section?Category=ENT&template=blogrss&mime=xml'), + (u'Food',u'http://journalgazette.net/apps/pbcs.dll/section?Category=FOOD&template=blogrss&mime=xml') + ] + + + + + def print_version(self, url): + split1 = url.split("/") + #print 'THE SPLIT IS: ', split1 + #url1 = split1[0] + #url2 = split1[1] + url3 = split1[2] + #url4 = split1[3] + url5 = split1[4] + url6 = split1[5] + url7 = split1[6] + #url8 = split1[7] + + #need to convert to print_version + #originalversion is : http://www.journalgazette.net/article/20100905/EDIT10/309059959/1021/EDIT + #printversion should be: http://www.journalgazette.net/apps/pbcs.dll/article?AID=/20100905/EDIT10/309059959/-1/EDIT01&template=printart + #results of the split + #THE SPLIT IS: [u'http:', u'', u'www.journalgazette.net', u'article', u'20100905', u'EDIT10', u'309059959', u'1021', u'EDIT'] + + + + print_url = 'http://' + url3 + '/apps/pbcs.dll/article?AID=/' + url5 + '/' + url6 + '/' + url7 + '/-1/EDIT01&template=printart' + #print 'THIS URL WILL PRINT: ', print_url # this is a test string to see what the url is it will return + return print_url + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + return soup diff --git a/resources/recipes/kstar.recipe b/resources/recipes/kstar.recipe new file mode 100644 index 0000000000..fe44bfd679 --- /dev/null +++ b/resources/recipes/kstar.recipe @@ -0,0 +1,58 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1282101454(BasicNewsRecipe): + title = 'Kansascity Star' + language = 'en' + __author__ = 'TonytheBookworm' + description = 'www.kansascity.com feed' + publisher = 'Tony Stegall' + category = 'news, politics, USA, kansascity' + oldest_article = 7 + max_articles_per_feed = 100 + no_stylesheets = True + + masthead_url = 'http://media.kansascity.com/images/site_logo_340x60.gif' + keep_only_tags = [ + dict(attrs={'id':['storyTitle','sub_headline','byLine']}) + ,dict(name='div', attrs={'id':['storyDate-Links','storyBody']}) + + ] + feeds = [ + ('Kansas News', 'http://www.kansascity.com/105/index.xml'), + + ] + + + + + def print_version(self, url): + split1 = url.split("/") + #url1 = split1[0] + #url2 = split1[1] + url3 = split1[2] + url4 = split1[3] + url5 = split1[4] + url6 = split1[5] + url7 = split1[6] + url8 = split1[7] + + + #example of link to convert + #Original link: http://www.kansascity.com/2010/09/04/2199362/lees-summit-school-appears-to.html + #print version: http://www.kansascity.com/2010/09/04/v-print/2199362/lees-summit-school-appears-to.html + + print_url = 'http://' + url3 + '/' + url4 + '/' + url5 + '/' + url6 + '/v-print/' + url7 + '/' + url8 + + return print_url + + + + + + + + + + + + diff --git a/resources/recipes/la_jornada.recipe b/resources/recipes/la_jornada.recipe index 2e1a3bb50d..afeae08201 100644 --- a/resources/recipes/la_jornada.recipe +++ b/resources/recipes/la_jornada.recipe @@ -1,15 +1,16 @@ __license__ = 'GPL v3' -__copyright__ = '2010, Darko Miletic ' +__copyright__ = '2010, Darko Miletic , Rogelio Domínguez ' ''' www.jornada.unam.mx ''' +import re from calibre import strftime from calibre.web.feeds.news import BasicNewsRecipe class LaJornada_mx(BasicNewsRecipe): title = 'La Jornada (Mexico)' - __author__ = 'Darko Miletic' + __author__ = 'Darko Miletic/Rogelio Domínguez' description = 'Noticias del diario mexicano La Jornada' publisher = 'DEMOS, Desarrollo de Medios, S.A. de C.V.' category = 'news, Mexico' @@ -20,12 +21,26 @@ class LaJornada_mx(BasicNewsRecipe): use_embedded_content = False language = 'es' remove_empty_feeds = True - cover_url = strftime("http://www.jornada.unam.mx/%Y/%m/%d/planitas/portadita.jpg") + cover_url = strftime("http://www.jornada.unam.mx/%Y/%m/%d/portada.pdf") masthead_url = 'http://www.jornada.unam.mx/v7.0/imagenes/la-jornada-trans.png' + publication_type = 'newspaper' extra_css = """ body{font-family: "Times New Roman",serif } .cabeza{font-size: xx-large; font-weight: bold } - .credito-articulo{font-size: 1.3em} + .documentFirstHeading{font-size: xx-large; font-weight: bold } + .credito-articulo{font-variant: small-caps; font-weight: bold } + .foto{text-align: center} + .pie-foto{font-size: 0.9em} + .credito{font-weight: bold; margin-left: 1em} + .credito-autor{font-variant: small-caps; font-weight: bold } + .credito-titulo{text-align: right} + .hemero{text-align: right; font-size: 0.9em; margin-bottom: 0.5em } + .loc{font-weight: bold} + .carton{text-align: center} + .credit{font-weight: bold} + .text{margin-top: 1.4em} + p.inicial{display: inline; font-size: xx-large; font-weight: bold} + p.s-s{display: inline; text-indent: 0} """ conversion_options = { @@ -35,15 +50,21 @@ class LaJornada_mx(BasicNewsRecipe): , 'language' : language } + preprocess_regexps = [ + (re.compile( r'
(.*)

' + ,re.DOTALL|re.IGNORECASE) + ,lambda match: '

' + match.group(1) + '

') + ] + keep_only_tags = [ - dict(name='div', attrs={'class':['documentContent','cabeza','sumarios','text']}) + dict(name='div', attrs={'class':['documentContent','cabeza','sumarios','credito-articulo','text','carton']}) ,dict(name='div', attrs={'id':'renderComments'}) ] - remove_tags = [dict(name='div', attrs={'class':'buttonbar'})] + remove_tags = [dict(name='div', attrs={'class':['buttonbar','comment-cont']})] feeds = [ - (u'Ultimas noticias' , u'http://www.jornada.unam.mx/ultimas/news/RSS' ) - ,(u'Opinion' , u'http://www.jornada.unam.mx/rss/opinion.xml' ) + (u'Opinion' , u'http://www.jornada.unam.mx/rss/opinion.xml' ) + ,(u'Cartones' , u'http://www.jornada.unam.mx/rss/cartones.xml' ) ,(u'Politica' , u'http://www.jornada.unam.mx/rss/politica.xml' ) ,(u'Economia' , u'http://www.jornada.unam.mx/rss/economia.xml' ) ,(u'Mundo' , u'http://www.jornada.unam.mx/rss/mundo.xml' ) @@ -55,6 +76,7 @@ class LaJornada_mx(BasicNewsRecipe): ,(u'Gastronomia' , u'http://www.jornada.unam.mx/rss/gastronomia.xml' ) ,(u'Espectaculos' , u'http://www.jornada.unam.mx/rss/espectaculos.xml' ) ,(u'Deportes' , u'http://www.jornada.unam.mx/rss/deportes.xml' ) + ,(u'Ultimas noticias' , u'http://www.jornada.unam.mx/ultimas/news/RSS' ) ] def preprocess_html(self, soup): @@ -62,3 +84,7 @@ class LaJornada_mx(BasicNewsRecipe): del item['style'] return soup + def get_article_url(self, article): + rurl = article.get('link', None) + return rurl.rpartition('&partner=')[0] + diff --git a/resources/recipes/milenio.recipe b/resources/recipes/milenio.recipe new file mode 100644 index 0000000000..a279eb37dc --- /dev/null +++ b/resources/recipes/milenio.recipe @@ -0,0 +1,47 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2010, Brendan Sleight ' +''' +impreso.milenio.com +''' +from calibre import strftime +from calibre.web.feeds.news import BasicNewsRecipe + +import datetime + +class Milenio(BasicNewsRecipe): + title = u'Milenio-diario' + __author__ = 'Bmsleight' + language = 'es' + description = 'Milenio-diario' + oldest_article = 10 + max_articles_per_feed = 100 + no_stylesheets = False + index = 'http://impreso.milenio.com' + + keep_only_tags = [ + dict(name='div', attrs={'class':'content'}) + ] + + def parse_index(self): + # "%m/%d/%Y" + # http://impreso.milenio.com/Nacional/2010/09/01/ + totalfeeds = [] + soup = self.index_to_soup(self.index + "/Nacional/" + datetime.date.today().strftime("%Y/%m/%d")) + maincontent = soup.find('div',attrs={'class':'content'}) + mfeed = [] + if maincontent: + for itt in maincontent.findAll('a',href=True): + if "/node/" in str(itt['href']): + url = self.index + itt['href'] + title = self.tag_to_string(itt) + description = '' + date = strftime(self.timefmt) + mfeed.append({ + 'title' :title + ,'date' :date + ,'url' :url + ,'description':description + }) + totalfeeds.append(('Articles', mfeed)) + return totalfeeds diff --git a/resources/recipes/ncrnext.recipe b/resources/recipes/ncrnext.recipe index e03da301fa..6585cc9665 100644 --- a/resources/recipes/ncrnext.recipe +++ b/resources/recipes/ncrnext.recipe @@ -22,10 +22,19 @@ class NrcNextRecipe(BasicNewsRecipe): remove_tags = [] remove_tags.append(dict(name = 'div', attrs = {'class' : 'meta'})) + remove_tags.append(dict(name = 'p', attrs = {'class' : 'meta'})) remove_tags.append(dict(name = 'div', attrs = {'class' : 'datumlabel'})) + remove_tags.append(dict(name = 'div', attrs = {'class' : 'sharing-is-caring'})) + remove_tags.append(dict(name = 'div', attrs = {'class' : 'navigation'})) + remove_tags.append(dict(name = 'div', attrs = {'class' : 'reageer'})) + remove_tags.append(dict(name = 'div', attrs = {'class' : 'comment odd alt thread-odd thread-alt depth-1 reactie '})) + remove_tags.append(dict(name = 'div', attrs = {'class' : 'comment even thread-even depth-1 reactie '})) remove_tags.append(dict(name = 'ul', attrs = {'class' : 'cats single'})) remove_tags.append(dict(name = 'ul', attrs = {'class' : 'cats onderwerpen'})) remove_tags.append(dict(name = 'ul', attrs = {'class' : 'cats rubrieken'})) + remove_tags.append(dict(name = 'h3', attrs = {'class' : 'reacties'})) + + extra_css = ''' body {font-family: verdana, arial, helvetica, geneva, sans-serif; text-align: left;} @@ -41,20 +50,18 @@ class NrcNextRecipe(BasicNewsRecipe): feeds[u'koken'] = u'http://www.nrcnext.nl/koken/' feeds[u'geld & werk'] = u'http://www.nrcnext.nl/geld-en-werk/' feeds[u'vandaag'] = u'http://www.nrcnext.nl' - feeds[u'city life in afrika'] = u'http://www.nrcnext.nl/city-life-in-afrika/' + # feeds[u'city life in afrika'] = u'http://www.nrcnext.nl/city-life-in-afrika/' answer = [] articles = {} indices = [] for index, feed in feeds.items() : soup = self.index_to_soup(feed) - - for post in soup.findAll(True, attrs={'class' : 'post'}) : + for post in soup.findAll(True, attrs={'class' : 'post '}) : # Find the links to the actual articles and rember the location they're pointing to and the title a = post.find('a', attrs={'rel' : 'bookmark'}) href = a['href'] title = self.tag_to_string(a) - if index == 'columnisten' : # In this feed/page articles can be written by more than one author. # It is nice to see their names in the titles. @@ -74,7 +81,8 @@ class NrcNextRecipe(BasicNewsRecipe): indices.append(index) # Now, sort the temporary list of feeds in the order they appear on the website - indices = self.sort_index_by(indices, {u'columnisten' : 1, u'koken' : 3, u'geld & werk' : 2, u'vandaag' : 0, u'city life in afrika' : 4}) + # indices = self.sort_index_by(indices, {u'columnisten' : 1, u'koken' : 3, u'geld & werk' : 2, u'vandaag' : 0, u'city life in afrika' : 4}) + indices = self.sort_index_by(indices, {u'columnisten' : 1, u'koken' : 3, u'geld & werk' : 2, u'vandaag' : 0}) # Apply this sort order to the actual list of feeds and articles answer = [(key, articles[key]) for key in indices if articles.has_key(key)] diff --git a/resources/recipes/nejm.recipe b/resources/recipes/nejm.recipe index 415377b5c2..c860413926 100644 --- a/resources/recipes/nejm.recipe +++ b/resources/recipes/nejm.recipe @@ -26,13 +26,13 @@ class NYTimes(BasicNewsRecipe): #TO LOGIN def get_browser(self): br = BasicNewsRecipe.get_browser() - br.open('http://content.nejm.org/cgi/login?uri=/') - br.select_form(nr=0) - br['username'] = self.username - br['code'] = self.password + br.open('http://www.nejm.org/action/showLogin?uri=http://www.nejm.org/') + br.select_form(name='frmLogin') + br['login'] = self.username + br['password'] = self.password response = br.submit() raw = response.read() - if 'Welcome' not in raw: + if '>Sign Out<' not in raw: raise Exception('Login failed. Check your username and password') return br diff --git a/resources/recipes/taz.recipe b/resources/recipes/taz.recipe index 530fa7d6b7..45b414f3cd 100644 --- a/resources/recipes/taz.recipe +++ b/resources/recipes/taz.recipe @@ -13,50 +13,51 @@ from calibre.web.feeds.news import BasicNewsRecipe class TazDigiabo(BasicNewsRecipe): - title = u'Taz Digiabo' - description = u'Das EPUB DigiAbo der Taz' - language = 'de' - lang = 'de-DE' + title = u'Taz Digiabo' + description = u'Das EPUB DigiAbo der Taz' + language = 'de' + lang = 'de-DE' - __author__ = 'Lars Jacob' - needs_subscription = True + __author__ = 'Lars Jacob' + needs_subscription = True - conversion_options = { - 'no_default_epub_cover' : True - } + conversion_options = { + 'no_default_epub_cover' : True + } - def build_index(self): - if self.username is not None and self.password is not None: - domain = "http://www.taz.de" + def build_index(self): + if self.username is not None and self.password is not None: + domain = "http://www.taz.de" - url = domain + "/epub/" + url = domain + "/epub/" - auth_handler = urllib2.HTTPBasicAuthHandler() - auth_handler.add_password(realm='TAZ-ABO', - uri=url, - user=self.username, - passwd=self.password) - opener = urllib2.build_opener(auth_handler) - urllib2.install_opener(opener) + auth_handler = urllib2.HTTPBasicAuthHandler() + auth_handler.add_password(realm='TAZ-ABO', + uri=url, + user=self.username, + passwd=self.password) + opener = urllib2.build_opener(auth_handler) + urllib2.install_opener(opener) - try: - f = urllib2.urlopen(url) - except urllib2.HTTPError: - self.report_progress(0,_('Can\'t login to download issue')) - return + try: + f = urllib2.urlopen(url) + except urllib2.HTTPError: + self.report_progress(0,_('Can\'t login to download issue')) + raise ValueError('Failed to login, check your username and' + ' password') - tmp = tempfile.TemporaryFile() - self.report_progress(0,_('downloading epub')) - tmp.write(f.read()) + tmp = tempfile.TemporaryFile() + self.report_progress(0,_('downloading epub')) + tmp.write(f.read()) - zfile = zipfile.ZipFile(tmp, 'r') - self.report_progress(0,_('extracting epub')) + zfile = zipfile.ZipFile(tmp, 'r') + self.report_progress(0,_('extracting epub')) - zfile.extractall(self.output_dir) + zfile.extractall(self.output_dir) - tmp.close() - index = os.path.join(self.output_dir, 'content.opf') + tmp.close() + index = os.path.join(self.output_dir, 'content.opf') - self.report_progress(1,_('epub downloaded and extracted')) + self.report_progress(1,_('epub downloaded and extracted')) - return index + return index diff --git a/resources/recipes/walrusmag.recipe b/resources/recipes/walrusmag.recipe new file mode 100644 index 0000000000..5c10100fe4 --- /dev/null +++ b/resources/recipes/walrusmag.recipe @@ -0,0 +1,46 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1282101454(BasicNewsRecipe): + title = 'The Walrus Mag' + language = 'en' + __author__ = 'TonytheBookworm' + description = 'national general interest magazine about Canada and its place in the world' + publisher = 'Tony Stegall' + category = 'Canada, news' + oldest_article = 365 + max_articles_per_feed = 100 + + masthead_url = 'http://www.walrusmagazine.com/images/wordmark.png' + keep_only_tags = [ + dict(name='h1'), + dict(name='div', attrs={'id':['prbody']}) + # ,dict(attrs={'id':['cxArticleText','cxArticleBodyText']}) + ] + feeds = [ + ('Walrus Magazine', 'http://feeds.feedburner.com/WalrusFeatureArticles?format=xml'), + + ] + + + + + def print_version(self, url): + split1 = url.split("/articles/") + #print 'THE SPLIT IS: ', split1 + url1 = split1[0] + #print 'url1 is: ',url1 + url2 = split1[1] + #print 'url2 is: ',url2 + + + #need to convert to print_version + #originalversion is : http://www.walrusmagazine.com/articles/2010.09-frontier-no-one-can-hear-you-scream/ + #printversion should be: http://www.walrusmagazine.com/print/2010.09-frontier-no-one-can-hear-you-scream/ + + + + + print_url = url1 + '/print/' + url2 + #print 'THIS URL WILL PRINT: ', print_url # this is a test string to see what the url is it will return + return print_url + diff --git a/resources/recipes/wsj_free.recipe b/resources/recipes/wsj_free.recipe new file mode 100644 index 0000000000..7f3664f1c4 --- /dev/null +++ b/resources/recipes/wsj_free.recipe @@ -0,0 +1,153 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +from calibre.web.feeds.news import BasicNewsRecipe +import copy + +class WallStreetJournal(BasicNewsRecipe): + + title = 'Wall Street Journal (free)' + __author__ = 'Kovid Goyal, Sujata Raman, Joshua Oster-Morris, Starson17' + description = 'News and current affairs' + language = 'en' + cover_url = 'http://dealbreaker.com/images/thumbs/Wall%20Street%20Journal%20A1.JPG' + max_articles_per_feed = 1000 + timefmt = ' [%a, %b %d, %Y]' + no_stylesheets = True + + extra_css = '''h1{color:#093D72 ; font-size:large ; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; } + h2{color:#474537; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small; font-style:italic;} + .subhead{color:gray; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small; font-style:italic;} + .insettipUnit {color:#666666; font-family:Arial,Sans-serif;font-size:xx-small } + .targetCaption{ font-size:x-small; color:#333333; font-family:Arial,Helvetica,sans-serif} + .article{font-family :Arial,Helvetica,sans-serif; font-size:x-small} + .tagline {color:#333333; font-size:xx-small} + .dateStamp {color:#666666; font-family:Arial,Helvetica,sans-serif} + h3{color:blue ;font-family:Arial,Helvetica,sans-serif; font-size:xx-small} + .byline{color:blue;font-family:Arial,Helvetica,sans-serif; font-size:xx-small} + h6{color:#333333; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small;font-style:italic; } + .paperLocation{color:#666666; font-size:xx-small}''' + + remove_tags_before = dict(name='h1') + remove_tags = [ + dict(id=["articleTabs_tab_article", "articleTabs_tab_comments", "articleTabs_tab_interactive","articleTabs_tab_video","articleTabs_tab_map","articleTabs_tab_slideshow"]), + {'class':['footer_columns','network','insetCol3wide','interactive','video','slideshow','map','insettip','insetClose','more_in', "insetContent", 'articleTools_bottom', 'aTools', "tooltip", "adSummary", "nav-inline"]}, + dict(name='div', attrs={'data-flash-settings':True}), + {'class':['insetContent embedType-interactive insetCol3wide','insetCol6wide','insettipUnit']}, + dict(rel='shortcut icon'), + ] + remove_tags_after = [dict(id="article_story_body"), {'class':"article story"},] + + def postprocess_html(self, soup, first): + for tag in soup.findAll(name=['table', 'tr', 'td']): + tag.name = 'div' + + for tag in soup.findAll('div', dict(id=["articleThumbnail_1", "articleThumbnail_2", "articleThumbnail_3", "articleThumbnail_4", "articleThumbnail_5", "articleThumbnail_6", "articleThumbnail_7"])): + tag.extract() + + return soup + + def wsj_get_index(self): + return self.index_to_soup('http://online.wsj.com/itp') + + def wsj_add_feed(self,feeds,title,url): + self.log('Found section:', title) + if url.endswith('whatsnews'): + articles = self.wsj_find_wn_articles(url) + else: + articles = self.wsj_find_articles(url) + if articles: + feeds.append((title, articles)) + return feeds + + def parse_index(self): + soup = self.wsj_get_index() + + date = soup.find('span', attrs={'class':'date-date'}) + if date is not None: + self.timefmt = ' [%s]'%self.tag_to_string(date) + + feeds = [] + div = soup.find('div', attrs={'class':'itpHeader'}) + div = div.find('ul', attrs={'class':'tab'}) + for a in div.findAll('a', href=lambda x: x and '/itp/' in x): + pageone = a['href'].endswith('pageone') + if pageone: + title = 'Front Section' + url = 'http://online.wsj.com' + a['href'] + feeds = self.wsj_add_feed(feeds,title,url) + title = 'What''s News' + url = url.replace('pageone','whatsnews') + feeds = self.wsj_add_feed(feeds,title,url) + else: + title = self.tag_to_string(a) + url = 'http://online.wsj.com' + a['href'] + feeds = self.wsj_add_feed(feeds,title,url) + return feeds + + def wsj_find_wn_articles(self, url): + soup = self.index_to_soup(url) + articles = [] + + whats_news = soup.find('div', attrs={'class':lambda x: x and 'whatsNews-simple' in x}) + if whats_news is not None: + for a in whats_news.findAll('a', href=lambda x: x and '/article/' in x): + container = a.findParent(['p']) + meta = a.find(attrs={'class':'meta_sectionName'}) + if meta is not None: + meta.extract() + title = self.tag_to_string(a).strip() + url = a['href'] + desc = '' + if container is not None: + desc = self.tag_to_string(container) + + articles.append({'title':title, 'url':url, + 'description':desc, 'date':''}) + + self.log('\tFound WN article:', title) + + return articles + + def wsj_find_articles(self, url): + soup = self.index_to_soup(url) + + whats_news = soup.find('div', attrs={'class':lambda x: x and 'whatsNews-simple' in x}) + if whats_news is not None: + whats_news.extract() + + articles = [] + + flavorarea = soup.find('div', attrs={'class':lambda x: x and 'ahed' in x}) + if flavorarea is not None: + flavorstory = flavorarea.find('a', href=lambda x: x and x.startswith('/article')) + if flavorstory is not None: + flavorstory['class'] = 'mjLinkItem' + metapage = soup.find('span', attrs={'class':lambda x: x and 'meta_sectionName' in x}) + if metapage is not None: + flavorstory.append( copy.copy(metapage) ) #metapage should always be A1 because that should be first on the page + + for a in soup.findAll('a', attrs={'class':'mjLinkItem'}, href=True): + container = a.findParent(['li', 'div']) + meta = a.find(attrs={'class':'meta_sectionName'}) + if meta is not None: + meta.extract() + title = self.tag_to_string(a).strip() + ' [%s]'%self.tag_to_string(meta) + url = 'http://online.wsj.com'+a['href'] + desc = '' + p = container.find('p') + if p is not None: + desc = self.tag_to_string(p) + + articles.append({'title':title, 'url':url, + 'description':desc, 'date':''}) + + self.log('\tFound article:', title) + + return articles + + def cleanup(self): + self.browser.open('http://online.wsj.com/logout?url=http://online.wsj.com') + diff --git a/setup/installer/__init__.py b/setup/installer/__init__.py index 82902edf76..959d8d14e1 100644 --- a/setup/installer/__init__.py +++ b/setup/installer/__init__.py @@ -18,6 +18,7 @@ class Rsync(Command): SYNC_CMD = ('rsync -avz --delete --exclude src/calibre/plugins ' '--exclude src/calibre/manual --exclude src/calibre/trac ' '--exclude .bzr --exclude .build --exclude .svn --exclude build --exclude dist ' + '--exclude imgsrc ' '--exclude "*.pyc" --exclude "*.pyo" --exclude "*.swp" --exclude "*.swo" ' 'rsync://{host}/work/{project} ..') diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 49ce83864e..c72265b1fa 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -2,7 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' __appname__ = 'calibre' -__version__ = '0.7.16' +__version__ = '0.7.18' __author__ = "Kovid Goyal " import re diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index 2b7c476579..d89a7c45a3 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -294,7 +294,7 @@ class CatalogPlugin(Plugin): # {{{ # Return a list of requested fields, with opts.sort_by first all_fields = set( ['author_sort','authors','comments','cover','formats', - 'id','isbn','pubdate','publisher','rating', + 'id','isbn','ondevice','pubdate','publisher','rating', 'series_index','series','size','tags','timestamp', 'title','uuid']) @@ -306,6 +306,9 @@ class CatalogPlugin(Plugin): # {{{ else: fields = list(all_fields) + if not opts.connected_device['is_device_connected'] and 'ondevice' in fields: + fields.pop(int(fields.index('ondevice'))) + fields.sort() if opts.sort_by and opts.sort_by in fields: fields.insert(0,fields.pop(int(fields.index(opts.sort_by)))) @@ -371,6 +374,13 @@ class InterfaceActionBase(Plugin): # {{{ class PreferencesPlugin(Plugin): # {{{ + ''' + A plugin representing a widget displayed in the Preferences dialog. + + This plugin has only one important method :meth:`create_widget`. The + various fields of the plugin control how it is categorized in the UI. + ''' + supported_platforms = ['windows', 'osx', 'linux'] author = 'Kovid Goyal' type = _('Preferences') @@ -391,20 +401,33 @@ class PreferencesPlugin(Plugin): # {{{ #: The category this plugin should be in category = None + #: The category name displayed to the user for this plugin + gui_category = None + #: The name displayed to the user for this plugin gui_name = None + #: The icon for this plugin, should be an absolute path + icon = None + + #: The description used for tooltips and the like + description = None + def create_widget(self, parent=None): ''' Create and return the actual Qt widget used for setting this group of - preferences. The widget must implement the ConfigWidgetInterface. + preferences. The widget must implement the + :class:`calibre.gui2.preferences.ConfigWidgetInterface`. The default implementation uses :attr:`config_widget` to instantiate the widget. ''' - base = __import__(self.config_widget, fromlist=[1]) - widget = base.ConfigWidget(parent) - return widget + base, _, wc = self.config_widget.partition(':') + if not wc: + wc = 'ConfigWidget' + base = __import__(base, fromlist=[1]) + widget = getattr(base, wc) + return widget(parent) # }}} diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index f7bc29784e..4c87236e71 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -461,7 +461,7 @@ from calibre.devices.hanvon.driver import N516, EB511, ALEX, AZBOOKA, THEBOOK from calibre.devices.edge.driver import EDGE from calibre.devices.teclast.driver import TECLAST_K3, NEWSMY, IPAPYRUS from calibre.devices.sne.driver import SNE -from calibre.devices.misc import PALMPRE, AVANT, SWEEX, PDNOVEL, KOGAN +from calibre.devices.misc import PALMPRE, AVANT, SWEEX, PDNOVEL, KOGAN, GEMEI from calibre.devices.folder_device.driver import FOLDER_DEVICE_FOR_CONFIG from calibre.devices.kobo.driver import KOBO @@ -570,6 +570,7 @@ plugins += [ KOGAN, PDNOVEL, SPECTRA, + GEMEI, ITUNES, ] plugins += [x for x in list(locals().values()) if isinstance(x, type) and \ @@ -678,13 +679,181 @@ plugins += [ActionAdd, ActionFetchAnnotations, ActionGenerateCatalog, class LookAndFeel(PreferencesPlugin): name = 'Look & Feel' + icon = I('lookfeel.png') gui_name = _('Look and Feel') - category = _('Interface') + category = 'Interface' + gui_category = _('Interface') category_order = 1 name_order = 1 config_widget = 'calibre.gui2.preferences.look_feel' + description = _('Adjust the look and feel of the calibre interface' + ' to suit your tastes') -plugins += [LookAndFeel] +class Behavior(PreferencesPlugin): + name = 'Behavior' + icon = I('config.png') + gui_name = _('Behavior') + category = 'Interface' + gui_category = _('Interface') + category_order = 1 + name_order = 2 + config_widget = 'calibre.gui2.preferences.behavior' + description = _('Change the way calibre behaves') + +class Columns(PreferencesPlugin): + name = 'Custom Columns' + icon = I('column.png') + gui_name = _('Add your own columns') + category = 'Interface' + gui_category = _('Interface') + category_order = 1 + name_order = 3 + config_widget = 'calibre.gui2.preferences.columns' + description = _('Add/remove your own columns to the calibre book list') + +class Toolbar(PreferencesPlugin): + name = 'Toolbar' + icon = I('wizard.png') + gui_name = _('Customize the toolbar') + category = 'Interface' + gui_category = _('Interface') + category_order = 1 + name_order = 4 + config_widget = 'calibre.gui2.preferences.toolbar' + description = _('Customize the toolbars and context menus, changing which' + ' actions are available in each') + +class InputOptions(PreferencesPlugin): + name = 'Input Options' + icon = I('arrow-down.png') + gui_name = _('Input Options') + category = 'Conversion' + gui_category = _('Conversion') + category_order = 2 + name_order = 1 + config_widget = 'calibre.gui2.preferences.conversion:InputOptions' + description = _('Set conversion options specific to each input format') + +class CommonOptions(PreferencesPlugin): + name = 'Common Options' + icon = I('convert.png') + gui_name = _('Common Options') + category = 'Conversion' + gui_category = _('Conversion') + category_order = 2 + name_order = 2 + config_widget = 'calibre.gui2.preferences.conversion:CommonOptions' + description = _('Set conversion options common to all formats') + +class OutputOptions(PreferencesPlugin): + name = 'Output Options' + icon = I('arrow-up.png') + gui_name = _('Output Options') + category = 'Conversion' + gui_category = _('Conversion') + category_order = 2 + name_order = 3 + config_widget = 'calibre.gui2.preferences.conversion:OutputOptions' + description = _('Set conversion options specific to each output format') + +class Adding(PreferencesPlugin): + name = 'Adding' + icon = I('add_book.png') + gui_name = _('Adding books') + category = 'Import/Export' + gui_category = _('Import/Export') + category_order = 3 + name_order = 1 + config_widget = 'calibre.gui2.preferences.adding' + description = _('Control how calibre reads metadata from files when ' + 'adding books') + +class Saving(PreferencesPlugin): + name = 'Saving' + icon = I('save.png') + gui_name = _('Saving books to disk') + category = 'Import/Export' + gui_category = _('Import/Export') + category_order = 3 + name_order = 2 + config_widget = 'calibre.gui2.preferences.saving' + description = _('Control how calibre exports files from its database ' + 'to disk when using Save to disk') + +class Sending(PreferencesPlugin): + name = 'Sending' + icon = I('sync.png') + gui_name = _('Sending books to devices') + category = 'Import/Export' + gui_category = _('Import/Export') + category_order = 3 + name_order = 3 + config_widget = 'calibre.gui2.preferences.sending' + description = _('Control how calibre transfers files to your ' + 'ebook reader') + +class Email(PreferencesPlugin): + name = 'Email' + icon = I('mail.png') + gui_name = _('Sharing books by email') + category = 'Sharing' + gui_category = _('Sharing') + category_order = 4 + name_order = 1 + config_widget = 'calibre.gui2.preferences.emailp' + description = _('Setup sharing of books via email. Can be used ' + 'for automatic sending of downloaded news to your devices') + +class Server(PreferencesPlugin): + name = 'Server' + icon = I('network-server.png') + gui_name = _('Sharing over the net') + category = 'Sharing' + gui_category = _('Sharing') + category_order = 4 + name_order = 2 + config_widget = 'calibre.gui2.preferences.server' + description = _('Setup the calibre Content Server which will ' + 'give you access to your calibre library from anywhere, ' + 'on any device, over the internet') + +class Plugins(PreferencesPlugin): + name = 'Plugins' + icon = I('plugins.png') + gui_name = _('Plugins') + category = 'Advanced' + gui_category = _('Advanced') + category_order = 5 + name_order = 1 + config_widget = 'calibre.gui2.preferences.plugins' + description = _('Add/remove/customize various bits of calibre ' + 'functionality') + +class Tweaks(PreferencesPlugin): + name = 'Tweaks' + icon = I('drawer.png') + gui_name = _('Tweaks') + category = 'Advanced' + gui_category = _('Advanced') + category_order = 5 + name_order = 2 + config_widget = 'calibre.gui2.preferences.tweaks' + description = _('Fine tune how calibre behaves in various contexts') + +class Misc(PreferencesPlugin): + name = 'Misc' + icon = I('exec.png') + gui_name = _('Miscellaneous') + category = 'Advanced' + gui_category = _('Advanced') + category_order = 5 + name_order = 3 + config_widget = 'calibre.gui2.preferences.misc' + description = _('Miscellaneous advanced configuration') + +plugins += [LookAndFeel, Behavior, Columns, Toolbar, InputOptions, + CommonOptions, OutputOptions, Adding, Saving, Sending, Email, Server, + Plugins, Tweaks, Misc] #}}} diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index f5736ae6b1..7a451112c0 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -41,7 +41,7 @@ class ANDROID(USBMS): 0x502 : { 0x3203 : [0x0100]}, # Dell - 0x413c : { 0xb007 : [0x0100]}, + 0x413c : { 0xb007 : [0x0100, 0x0224]}, # Eken? 0x040d : { 0x0851 : [0x0001]}, diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index 916c88f203..e318d368ff 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -82,7 +82,7 @@ class ITUNES(DriverBase): ''' name = 'Apple device interface' - gui_name = 'Apple device' + gui_name = _('Apple device') icon = I('devices/ipad.png') description = _('Communicate with iTunes/iBooks.') supported_platforms = ['osx','windows'] @@ -2303,9 +2303,9 @@ class ITUNES(DriverBase): # Delete existing from Device|Books, add to self.update_list # for deletion from booklist[0] during add_books_to_metadata for book in self.cached_books: - if self.cached_books[book]['uuid'] == metadata.uuid and \ - self.cached_books[book]['title'] == metadata.title and \ - self.cached_books[book]['author'] == metadata.authors[0]: + if self.cached_books[book]['uuid'] == metadata.uuid or \ + (self.cached_books[book]['title'] == metadata.title and \ + self.cached_books[book]['author'] == metadata.authors[0]): self.update_list.append(self.cached_books[book]) self._remove_from_device(self.cached_books[book]) if DEBUG: @@ -2322,9 +2322,9 @@ class ITUNES(DriverBase): # Delete existing from Library|Books, add to self.update_list # for deletion from booklist[0] during add_books_to_metadata for book in self.cached_books: - if self.cached_books[book]['uuid'] == metadata.uuid and \ - self.cached_books[book]['title'] == metadata.title and \ - self.cached_books[book]['author'] == metadata.authors[0]: + if self.cached_books[book]['uuid'] == metadata.uuid or \ + (self.cached_books[book]['title'] == metadata.title and \ + self.cached_books[book]['author'] == metadata.authors[0]): self.update_list.append(self.cached_books[book]) self._remove_from_iTunes(self.cached_books[book]) if DEBUG: @@ -2488,7 +2488,8 @@ class ITUNES(DriverBase): zf_opf.close() # If 'News' in tags, tweak the title/author for friendlier display in iBooks - if _('News') in metadata.tags: + if _('News') in metadata.tags or \ + _('Catalog') in metadata.tags: if metadata.title.find('[') > 0: metadata.title = metadata.title[:metadata.title.find('[')-1] date_as_author = '%s, %s %s, %s' % (strftime('%A'), strftime('%B'), strftime('%d').lstrip('0'), strftime('%Y')) diff --git a/src/calibre/devices/folder_device/driver.py b/src/calibre/devices/folder_device/driver.py index 552e713ad8..9cd1280cc9 100644 --- a/src/calibre/devices/folder_device/driver.py +++ b/src/calibre/devices/folder_device/driver.py @@ -42,7 +42,7 @@ class FOLDER_DEVICE(USBMS): SUPPORTS_SUB_DIRS = True #: Icon for this device - icon = I('devices/folder.svg') + icon = I('devices/folder.png') METADATA_CACHE = '.metadata.calibre' _main_prefix = '' diff --git a/src/calibre/devices/interface.py b/src/calibre/devices/interface.py index 1384fa03d9..ab52b08568 100644 --- a/src/calibre/devices/interface.py +++ b/src/calibre/devices/interface.py @@ -43,7 +43,7 @@ class DevicePlugin(Plugin): path_sep = os.sep #: Icon for this device - icon = I('reader.svg') + icon = I('reader.png') # Used by gui2.ui:annotations_fetched() and devices.kindle.driver:get_annotations() UserAnnotation = namedtuple('Annotation','type, value') diff --git a/src/calibre/devices/jetbook/driver.py b/src/calibre/devices/jetbook/driver.py index 6a3bc635ff..6ee1c07464 100644 --- a/src/calibre/devices/jetbook/driver.py +++ b/src/calibre/devices/jetbook/driver.py @@ -50,6 +50,8 @@ class JETBOOK(USBMS): def filename_callback(self, fname, mi): fileext = os.path.splitext(os.path.basename(fname))[1] + if fileext.lower() not in ('txt', 'pdf', 'fb2'): + return fname title = mi.title if mi.title else 'Unknown' title = title.replace(' ', '_') au = mi.format_authors() @@ -85,7 +87,7 @@ class MIBUK(USBMS): name = 'MiBuk Wolder Device Interface' description = _('Communicate with the MiBuk Wolder reader.') author = 'Kovid Goyal' - supported_platforms = ['windows', 'osx', 'linux'] + supported_platforms = ['windows'] FORMATS = ['epub', 'mobi', 'prc', 'fb2', 'txt', 'rtf', 'pdf'] diff --git a/src/calibre/devices/misc.py b/src/calibre/devices/misc.py index 7e8f5fbdd3..bb75ceabd1 100644 --- a/src/calibre/devices/misc.py +++ b/src/calibre/devices/misc.py @@ -108,4 +108,23 @@ class PDNOVEL(USBMS): with open('%s.jpg' % os.path.join(path, filename), 'wb') as coverfile: coverfile.write(coverdata[2]) +class GEMEI(USBMS): + name = 'Gemei Device Interface' + gui_name = 'GM2000' + description = _('Communicate with the GM2000') + author = 'Kovid Goyal' + supported_platforms = ['windows', 'osx', 'linux'] + + # Ordered list of supported formats + FORMATS = ['epub', 'chm', 'html', 'pdb', 'pdf', 'txt'] + + VENDOR_ID = [0x07c4] + PRODUCT_ID = [0xa4a5] + BCD = None + + VENDOR_NAME = 'CHINA' + WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'CHIP' + + EBOOK_DIR_MAIN = 'eBooks' + SUPPORTS_SUB_DIRS = True diff --git a/src/calibre/devices/prs505/sony_cache.py b/src/calibre/devices/prs505/sony_cache.py index f05d9c0311..879f86d66a 100644 --- a/src/calibre/devices/prs505/sony_cache.py +++ b/src/calibre/devices/prs505/sony_cache.py @@ -89,6 +89,10 @@ class XMLCache(object): raw, strip_encoding_pats=True, assume_utf8=True, verbose=DEBUG)[0], parser=parser) + if self.roots[source_id] is None: + raise Exception(('The SONY database at %s is corrupted. Try ' + ' disconnecting and reconnecting your reader.')%path) + # }}} recs = self.roots[0].xpath('//*[local-name()="records"]') diff --git a/src/calibre/ebooks/__init__.py b/src/calibre/ebooks/__init__.py index 6596e9b1a2..624b277e61 100644 --- a/src/calibre/ebooks/__init__.py +++ b/src/calibre/ebooks/__init__.py @@ -138,3 +138,11 @@ def check_ebook_format(stream, current_guess): stream.seek(0) return ans +def calibre_cover(title, author_string, series_string=None, + output_format='jpg', title_size=46, author_size=36): + from calibre.utils.magick.draw import create_cover_page, TextLine + lines = [TextLine(title, title_size), TextLine(author_string, author_size)] + if series_string: + lines.append(TextLine(series_string, author_size)) + return create_cover_page(lines, I('library.png'), output_format='jpg') + diff --git a/src/calibre/ebooks/conversion/preprocess.py b/src/calibre/ebooks/conversion/preprocess.py index 973e508746..f7b803974f 100644 --- a/src/calibre/ebooks/conversion/preprocess.py +++ b/src/calibre/ebooks/conversion/preprocess.py @@ -142,55 +142,78 @@ class HTMLPreProcessor(object): # Fix pdftohtml markup PDFTOHTML = [ # Fix umlauts - (re.compile(u'¨\s*()*\s*o', re.UNICODE), lambda match: u'ö'), - (re.compile(u'¨\s*()*\s*O', re.UNICODE), lambda match: u'Ö'), - (re.compile(u'¨\s*()*\s*u', re.UNICODE), lambda match: u'ü'), - (re.compile(u'¨\s*()*\s*U', re.UNICODE), lambda match: u'Ü'), + # ¨ + (re.compile(u'¨\s*()*\s*a', re.UNICODE), lambda match: u'ä'), + (re.compile(u'¨\s*()*\s*A', re.UNICODE), lambda match: u'Ä'), (re.compile(u'¨\s*()*\s*e', re.UNICODE), lambda match: u'ë'), (re.compile(u'¨\s*()*\s*E', re.UNICODE), lambda match: u'Ë'), (re.compile(u'¨\s*()*\s*i', re.UNICODE), lambda match: u'ï'), (re.compile(u'¨\s*()*\s*I', re.UNICODE), lambda match: u'Ï'), - (re.compile(u'¨\s*()*\s*a', re.UNICODE), lambda match: u'ä'), - (re.compile(u'¨\s*()*\s*A', re.UNICODE), lambda match: u'Ä'), + (re.compile(u'¨\s*()*\s*o', re.UNICODE), lambda match: u'ö'), + (re.compile(u'¨\s*()*\s*O', re.UNICODE), lambda match: u'Ö'), + (re.compile(u'¨\s*()*\s*u', re.UNICODE), lambda match: u'ü'), + (re.compile(u'¨\s*()*\s*U', re.UNICODE), lambda match: u'Ü'), # Fix accents - (re.compile(u'`\s*()*\s*o', re.UNICODE), lambda match: u'ò'), - (re.compile(u'`\s*()*\s*O', re.UNICODE), lambda match: u'Ò'), - (re.compile(u'`\s*()*\s*u', re.UNICODE), lambda match: u'ù'), - (re.compile(u'`\s*()*\s*U', re.UNICODE), lambda match: u'Ù'), + # ` + (re.compile(u'`\s*()*\s*a', re.UNICODE), lambda match: u'à'), + (re.compile(u'`\s*()*\s*A', re.UNICODE), lambda match: u'À'), (re.compile(u'`\s*()*\s*e', re.UNICODE), lambda match: u'è'), (re.compile(u'`\s*()*\s*E', re.UNICODE), lambda match: u'È'), (re.compile(u'`\s*()*\s*i', re.UNICODE), lambda match: u'ì'), (re.compile(u'`\s*()*\s*I', re.UNICODE), lambda match: u'Ì'), - (re.compile(u'`\s*()*\s*a', re.UNICODE), lambda match: u'à'), - (re.compile(u'`\s*()*\s*A', re.UNICODE), lambda match: u'À'), + (re.compile(u'`\s*()*\s*o', re.UNICODE), lambda match: u'ò'), + (re.compile(u'`\s*()*\s*O', re.UNICODE), lambda match: u'Ò'), + (re.compile(u'`\s*()*\s*u', re.UNICODE), lambda match: u'ù'), + (re.compile(u'`\s*()*\s*U', re.UNICODE), lambda match: u'Ù'), - (re.compile(u'´\s*()*\s*o', re.UNICODE), lambda match: u'ó'), - (re.compile(u'´\s*()*\s*O', re.UNICODE), lambda match: u'Ó'), - (re.compile(u'´\s*()*\s*u', re.UNICODE), lambda match: u'ú'), - (re.compile(u'´\s*()*\s*U', re.UNICODE), lambda match: u'Ú'), + # ´ + (re.compile(u'´\s*()*\s*a', re.UNICODE), lambda match: u'á'), + (re.compile(u'´\s*()*\s*A', re.UNICODE), lambda match: u'Á'), + (re.compile(u'´\s*()*\s*c', re.UNICODE), lambda match: u'ć'), + (re.compile(u'´\s*()*\s*C', re.UNICODE), lambda match: u'Ć'), (re.compile(u'´\s*()*\s*e', re.UNICODE), lambda match: u'é'), (re.compile(u'´\s*()*\s*E', re.UNICODE), lambda match: u'É'), (re.compile(u'´\s*()*\s*i', re.UNICODE), lambda match: u'í'), (re.compile(u'´\s*()*\s*I', re.UNICODE), lambda match: u'Í'), - (re.compile(u'´\s*()*\s*a', re.UNICODE), lambda match: u'á'), - (re.compile(u'´\s*()*\s*A', re.UNICODE), lambda match: u'Á'), + (re.compile(u'´\s*()*\s*o', re.UNICODE), lambda match: u'ó'), + (re.compile(u'´\s*()*\s*O', re.UNICODE), lambda match: u'Ó'), + (re.compile(u'´\s*()*\s*n', re.UNICODE), lambda match: u'ń'), + (re.compile(u'´\s*()*\s*N', re.UNICODE), lambda match: u'Ń'), + (re.compile(u'´\s*()*\s*s', re.UNICODE), lambda match: u'ś'), + (re.compile(u'´\s*()*\s*S', re.UNICODE), lambda match: u'Ś'), + (re.compile(u'´\s*()*\s*u', re.UNICODE), lambda match: u'ú'), + (re.compile(u'´\s*()*\s*U', re.UNICODE), lambda match: u'Ú'), + (re.compile(u'´\s*()*\s*z', re.UNICODE), lambda match: u'ź'), + (re.compile(u'´\s*()*\s*Z', re.UNICODE), lambda match: u'Ź'), - (re.compile(u'ˆ\s*()*\s*o', re.UNICODE), lambda match: u'ô'), - (re.compile(u'ˆ\s*()*\s*O', re.UNICODE), lambda match: u'Ô'), - (re.compile(u'ˆ\s*()*\s*u', re.UNICODE), lambda match: u'û'), - (re.compile(u'ˆ\s*()*\s*U', re.UNICODE), lambda match: u'Û'), + # ˆ + (re.compile(u'ˆ\s*()*\s*a', re.UNICODE), lambda match: u'â'), + (re.compile(u'ˆ\s*()*\s*A', re.UNICODE), lambda match: u'Â'), (re.compile(u'ˆ\s*()*\s*e', re.UNICODE), lambda match: u'ê'), (re.compile(u'ˆ\s*()*\s*E', re.UNICODE), lambda match: u'Ê'), (re.compile(u'ˆ\s*()*\s*i', re.UNICODE), lambda match: u'î'), (re.compile(u'ˆ\s*()*\s*I', re.UNICODE), lambda match: u'Î'), - (re.compile(u'ˆ\s*()*\s*a', re.UNICODE), lambda match: u'â'), - (re.compile(u'ˆ\s*()*\s*A', re.UNICODE), lambda match: u'Â'), + (re.compile(u'ˆ\s*()*\s*o', re.UNICODE), lambda match: u'ô'), + (re.compile(u'ˆ\s*()*\s*O', re.UNICODE), lambda match: u'Ô'), + (re.compile(u'ˆ\s*()*\s*u', re.UNICODE), lambda match: u'û'), + (re.compile(u'ˆ\s*()*\s*U', re.UNICODE), lambda match: u'Û'), - # Fix more special characters + # ¸ (re.compile(u'¸\s*()*\s*c', re.UNICODE), lambda match: u'ç'), (re.compile(u'¸\s*()*\s*C', re.UNICODE), lambda match: u'Ç'), + # ˛ + (re.compile(u'˛\s*()*\s*a', re.UNICODE), lambda match: u'ą'), + (re.compile(u'˛\s*()*\s*A', re.UNICODE), lambda match: u'Ą'), + (re.compile(u'˛\s*()*\s*e', re.UNICODE), lambda match: u'ę'), + (re.compile(u'˛\s*()*\s*E', re.UNICODE), lambda match: u'Ę'), + + # ˙ + (re.compile(u'˙\s*()*\s*z', re.UNICODE), lambda match: u'ż'), + (re.compile(u'˙\s*()*\s*Z', re.UNICODE), lambda match: u'Ż'), + + # Remove page links (re.compile(r'', re.IGNORECASE), lambda match: ''), # Remove


tags diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index d0b680009a..3987ffa1b8 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -153,8 +153,15 @@ class FB2MLizer(object): return ''.join(toc) def sectionize_chapters(self, text): - text = re.sub(r'(?imsu)(?P)\s*(?P(

)*\s*.+?\s*(

)*)', lambda mo: '
%s%s' % (mo.group('anchor'), mo.group('strong')), text) - text = re.sub(r'(?imsu)

\s*(?P)\s*

\s*(?P(

)*\s*.+?\s*(

)*)', lambda mo: '
%s%s' % (mo.group('anchor'), mo.group('strong')), text) + def remove_p(t): + t = t.replace('

', '') + t = t.replace('

', '') + return t + text = re.sub(r'(?imsu)(

)\s*(?P)\s*(

)\s*(

)\s*(?P.+?)\s*(

)', lambda mo: '
%s<p>%s</p>' % (mo.group('anchor'), remove_p(mo.group('strong'))), text) + text = re.sub(r'(?imsu)(

)\s*(?P)\s*(

)\s*(?P.+?)', lambda mo: '
%s<p>%s</p>' % (mo.group('anchor'), remove_p(mo.group('strong'))), text) + text = re.sub(r'(?imsu)(?P)\s*(

)\s*(?P.+?)\s*(

)', lambda mo: '
%s<p>%s</p>' % (mo.group('anchor'), remove_p(mo.group('strong'))), text) + text = re.sub(r'(?imsu)(

)\s*(?P)\s*(?P.+?)\s*(

)', lambda mo: '
%s<p>%s</p>' % (mo.group('anchor'), remove_p(mo.group('strong'))), text) + text = re.sub(r'(?imsu)(?P)\s*(?P.+?)', lambda mo: '
%s<p>%s</p>' % (mo.group('anchor'), remove_p(mo.group('strong'))), text) return text def get_text(self): diff --git a/src/calibre/ebooks/metadata/archive.py b/src/calibre/ebooks/metadata/archive.py index 624c2ad5e5..f5982406ea 100644 --- a/src/calibre/ebooks/metadata/archive.py +++ b/src/calibre/ebooks/metadata/archive.py @@ -70,7 +70,7 @@ class ArchiveExtract(FileTypePlugin): fname = fnames[0] ext = os.path.splitext(fname)[1][1:] if ext.lower() not in ('lit', 'epub', 'mobi', 'prc', 'rtf', 'pdf', - 'mp3', 'pdb', 'azw', 'azw1'): + 'mp3', 'pdb', 'azw', 'azw1', 'fb2'): return archive of = self.temporary_file('_archive_extract.'+ext) diff --git a/src/calibre/ebooks/metadata/epub.py b/src/calibre/ebooks/metadata/epub.py index c2318efa0c..041a1ee603 100644 --- a/src/calibre/ebooks/metadata/epub.py +++ b/src/calibre/ebooks/metadata/epub.py @@ -196,8 +196,7 @@ def set_metadata(stream, mi, apply_null=False, update_timestamp=False): try: new_cdata = open(mi.cover, 'rb').read() except: - import traceback - traceback.print_exc() + pass if new_cdata and raster_cover: try: cpath = posixpath.join(posixpath.dirname(reader.opf_path), diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index f93b614ef2..2d9de7f780 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -1105,7 +1105,8 @@ class OPFCreator(MetaInformation): spine.set('toc', 'ncx') if self.spine is not None: for ref in self.spine: - spine.append(E.itemref(idref=ref.id)) + if ref.id is not None: + spine.append(E.itemref(idref=ref.id)) guide = E.guide() if self.guide is not None: for ref in self.guide: diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index 10f1ee32d6..5d5de7b153 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -1695,12 +1695,11 @@ class MobiWriter(object): header.write(pack('>I', 1)) # 0x1c - 0x1f : Text encoding ? - # header.write(pack('>I', 650001)) - # GR: This needs to be either 0xFDE9 or 0x4E4 - header.write(pack('>I', 0xFDE9)) + # GR: Language encoding for NCX entries (latin_1) + header.write(pack('>I', 0x4e4)) - # 0x20 - 0x23 : Language code? - header.write(iana2mobi(str(self._oeb.metadata.language[0]))) + # 0x20 - 0x23 : Mimicking kindleGen + header.write(pack('>I', 0xFFFFFFFF)) # 0x24 - 0x27 : Number of TOC entries in INDX1 header.write(pack('>I', indxt_count + 1)) @@ -1795,13 +1794,12 @@ class MobiWriter(object): self._oeb.log.debug('Index records dumped to', t) def _clean_text_value(self, text): - if text is not None and text.strip() : - text = text.strip() - if not isinstance(text, unicode): - text = text.decode('utf-8', 'replace') - text = text.encode('utf-8') - else : - text = "(none)".encode('utf-8') + if not text: + text = u'(none)' + text = text.strip() + if not isinstance(text, unicode): + text = text.decode('utf-8', 'replace') + text = text.encode('cp1252','replace') return text def _add_to_ctoc(self, ctoc_str, record_offset): @@ -2151,6 +2149,26 @@ class MobiWriter(object): indxt.write(decint(self._ctoc_map[index]['titleOffset'], DECINT_FORWARD)) # vwi title offset in CNCX indxt.write(decint(0, DECINT_FORWARD)) # unknown byte + def _write_subchapter_node(self, indxt, indices, index, offset, length, count): + # This style works without a parent chapter, mimicking what KindleGen does, + # using a value of 0x0B for parentIndex + # Writes an INDX1 NCXEntry of entryType 0x1F - subchapter + if self.opts.verbose > 2: + # *** GR: Turn this off while I'm developing my code + #self._oeb.log.debug('Writing TOC node to IDXT:', node.title, 'href:', node.href) + pass + + pos = 0xc0 + indxt.tell() + indices.write(pack('>H', pos)) # Save the offset for IDXTIndices + name = "%04X"%count + indxt.write(chr(len(name)) + name) # Write the name + indxt.write(INDXT['subchapter']) # entryType [0x0F | 0xDF | 0xFF | 0x3F] + indxt.write(decint(offset, DECINT_FORWARD)) # offset + indxt.write(decint(length, DECINT_FORWARD)) # length + indxt.write(decint(self._ctoc_map[index]['titleOffset'], DECINT_FORWARD)) # vwi title offset in CNCX + indxt.write(decint(0, DECINT_FORWARD)) # unknown byte + indxt.write(decint(0xb, DECINT_FORWARD)) # parentIndex - null + def _compute_offset_length(self, i, node, entries) : h = node.href if h not in self._id_offsets: diff --git a/src/calibre/ebooks/oeb/transforms/cover.py b/src/calibre/ebooks/oeb/transforms/cover.py index 83b7b5d3c1..59b42df68a 100644 --- a/src/calibre/ebooks/oeb/transforms/cover.py +++ b/src/calibre/ebooks/oeb/transforms/cover.py @@ -89,19 +89,22 @@ class CoverManager(object): ''' Create a generic cover for books that dont have a cover ''' - from calibre.ebooks.metadata import authors_to_string + from calibre.ebooks.metadata import authors_to_string, fmt_sidx if self.no_default_cover: return None self.log('Generating default cover') m = self.oeb.metadata title = unicode(m.title[0]) authors = [unicode(x) for x in m.creator if x.role == 'aut'] + series_string = None + if m.series and m.series_index: + series_string = _('Book %s of %s')%( + fmt_sidx(m.series_index[0], use_roman=True), m.series[0]) try: - from calibre.utils.magick.draw import create_cover_page, TextLine - lines = [TextLine(title, 44), TextLine(authors_to_string(authors), - 32)] - img_data = create_cover_page(lines, I('library.png')) + from calibre.ebooks import calibre_cover + img_data = calibre_cover(title, authors_to_string(authors), + series_string=series_string) id, href = self.oeb.manifest.generate('cover_image', 'cover_image.jpg') item = self.oeb.manifest.add(id, href, guess_type('t.jpg')[0], diff --git a/src/calibre/ebooks/oeb/transforms/htmltoc.py b/src/calibre/ebooks/oeb/transforms/htmltoc.py index 1aef7e56cc..b570420756 100644 --- a/src/calibre/ebooks/oeb/transforms/htmltoc.py +++ b/src/calibre/ebooks/oeb/transforms/htmltoc.py @@ -62,7 +62,16 @@ class HTMLTOCAdder(object): def __call__(self, oeb, context): if 'toc' in oeb.guide: - return + # Ensure toc pointed to in is in spine + from calibre.ebooks.oeb.base import urlnormalize + href = urlnormalize(oeb.guide['toc'].href) + if href in oeb.manifest.hrefs: + item = oeb.manifest.hrefs[href] + if oeb.spine.index(item) < 0: + oeb.spine.add(item, linear=False) + return + else: + oeb.guide.remove('toc') if not getattr(getattr(oeb, 'toc', False), 'nodes', False): return oeb.logger.info('Generating in-line TOC...') diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 5ffd8d723a..1b61404589 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -233,7 +233,7 @@ def warning_dialog(parent, title, msg, det_msg='', show=False, d = MessageBox(QMessageBox.Warning, 'WARNING: '+title, msg, QMessageBox.Ok, parent, det_msg) d.setEscapeButton(QMessageBox.Ok) - d.setIconPixmap(QPixmap(I('dialog_warning.svg'))) + d.setIconPixmap(QPixmap(I('dialog_warning.png'))) if not show_copy_button: d.cb.setVisible(False) if show: @@ -244,7 +244,7 @@ def error_dialog(parent, title, msg, det_msg='', show=False, show_copy_button=True): d = MessageBox(QMessageBox.Critical, 'ERROR: '+title, msg, QMessageBox.Ok, parent, det_msg) - d.setIconPixmap(QPixmap(I('dialog_error.svg'))) + d.setIconPixmap(QPixmap(I('dialog_error.png'))) d.setEscapeButton(QMessageBox.Ok) if not show_copy_button: d.cb.setVisible(False) @@ -256,7 +256,7 @@ def question_dialog(parent, title, msg, det_msg='', show_copy_button=True, buttons=QMessageBox.Yes|QMessageBox.No): d = MessageBox(QMessageBox.Question, title, msg, buttons, parent, det_msg) - d.setIconPixmap(QPixmap(I('dialog_question.svg'))) + d.setIconPixmap(QPixmap(I('dialog_question.png'))) d.setEscapeButton(QMessageBox.No) if not show_copy_button: d.cb.setVisible(False) @@ -266,7 +266,7 @@ def question_dialog(parent, title, msg, det_msg='', show_copy_button=True, def info_dialog(parent, title, msg, det_msg='', show=False): d = MessageBox(QMessageBox.Information, title, msg, QMessageBox.Ok, parent, det_msg) - d.setIconPixmap(QPixmap(I('dialog_information.svg'))) + d.setIconPixmap(QPixmap(I('dialog_information.png'))) if show: return d.exec_() return d @@ -372,7 +372,7 @@ class FileIconProvider(QFileIconProvider): QFileIconProvider.__init__(self) self.icons = {} for key in self.__class__.ICONS.keys(): - self.icons[key] = I('mimetypes/')+self.__class__.ICONS[key]+'.svg' + self.icons[key] = I('mimetypes/')+self.__class__.ICONS[key]+'.png' for i in ('dir', 'default', 'zero'): self.icons[i] = QIcon(self.icons[i]) diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index 95fdb9a6c6..f0ff794fab 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -22,7 +22,7 @@ from calibre.gui2.actions import InterfaceAction class AddAction(InterfaceAction): name = 'Add Books' - action_spec = (_('Add books'), 'add_book.svg', + action_spec = (_('Add books'), 'add_book.png', _('Add books to the calibre library/device from files on your computer') , _('A')) diff --git a/src/calibre/gui2/actions/add_to_library.py b/src/calibre/gui2/actions/add_to_library.py index 7771fa7ed6..6fc0d5fb1f 100644 --- a/src/calibre/gui2/actions/add_to_library.py +++ b/src/calibre/gui2/actions/add_to_library.py @@ -10,7 +10,7 @@ from calibre.gui2.actions import InterfaceAction class AddToLibraryAction(InterfaceAction): name = 'Add To Library' - action_spec = (_('Add books to library'), 'add_book.svg', + action_spec = (_('Add books to library'), 'add_book.png', _('Add books to your calibre library from the connected device'), None) dont_add_to = frozenset(['toolbar', 'context-menu']) diff --git a/src/calibre/gui2/actions/catalog.py b/src/calibre/gui2/actions/catalog.py index 6feaec978d..77fa4755c1 100644 --- a/src/calibre/gui2/actions/catalog.py +++ b/src/calibre/gui2/actions/catalog.py @@ -26,14 +26,18 @@ class GenerateCatalogAction(InterfaceAction): rows = xrange(self.gui.library_view.model().rowCount(QModelIndex())) ids = map(self.gui.library_view.model().id, rows) - dbspec = None if not ids: return error_dialog(self.gui, _('No books selected'), _('No books selected to generate catalog for'), show=True) + db = self.gui.library_view.model().db + dbspec = {} + for id in ids: + dbspec[id] = {'ondevice': db.ondevice(id, index_is_id=True)} + # Calling gui2.tools:generate_catalog() - ret = generate_catalog(self.gui, dbspec, ids, self.gui.device_manager.device) + ret = generate_catalog(self.gui, dbspec, ids, self.gui.device_manager) if ret is None: return diff --git a/src/calibre/gui2/actions/choose_library.py b/src/calibre/gui2/actions/choose_library.py index a5184dfcca..79406da40c 100644 --- a/src/calibre/gui2/actions/choose_library.py +++ b/src/calibre/gui2/actions/choose_library.py @@ -5,15 +5,16 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os +import os, shutil from functools import partial -from PyQt4.Qt import QMenu, Qt +from PyQt4.Qt import QMenu, Qt, QInputDialog from calibre import isbytestring from calibre.constants import filesystem_encoding from calibre.utils.config import prefs -from calibre.gui2 import gprefs, warning_dialog, Dispatcher +from calibre.gui2 import gprefs, warning_dialog, Dispatcher, error_dialog, \ + question_dialog from calibre.gui2.actions import InterfaceAction class LibraryUsageStats(object): @@ -66,6 +67,13 @@ class LibraryUsageStats(object): loc = loc[:-1] return loc.split('/')[-1] + def rename(self, location, newloc): + newloc = self.canonicalize_path(newloc) + stats = self.stats.pop(location, None) + if stats is not None: + self.stats[newloc] = stats + self.write_stats() + class ChooseLibraryAction(InterfaceAction): @@ -80,7 +88,7 @@ class ChooseLibraryAction(InterfaceAction): type=Qt.QueuedConnection) self.stats = LibraryUsageStats() - self.create_action(spec=(_('Switch to library...'), 'lt.png', None, + self.create_action(spec=(_('Switch/create library...'), 'lt.png', None, None), attr='action_choose') self.action_choose.triggered.connect(self.choose_library, type=Qt.QueuedConnection) @@ -90,7 +98,13 @@ class ChooseLibraryAction(InterfaceAction): self.quick_menu = QMenu(_('Quick switch')) self.quick_menu_action = self.choose_menu.addMenu(self.quick_menu) - self.qs_separator = self.choose_menu.addSeparator() + self.rename_menu = QMenu(_('Rename library')) + self.rename_menu_action = self.choose_menu.addMenu(self.rename_menu) + self.delete_menu = QMenu(_('Delete library')) + self.delete_menu_action = self.choose_menu.addMenu(self.delete_menu) + + self.rename_separator = self.choose_menu.addSeparator() + self.switch_actions = [] for i in range(5): ac = self.create_action(spec=('', None, None, None), @@ -123,9 +137,15 @@ class ChooseLibraryAction(InterfaceAction): ac.setVisible(False) self.quick_menu.clear() self.qs_locations = [i[1] for i in locations] + self.rename_menu.clear() + self.delete_menu.clear() for name, loc in locations: self.quick_menu.addAction(name, Dispatcher(partial(self.switch_requested, loc))) + self.rename_menu.addAction(name, Dispatcher(partial(self.rename_requested, + name, loc))) + self.delete_menu.addAction(name, Dispatcher(partial(self.delete_requested, + name, loc))) for i, x in enumerate(locations[:len(self.switch_actions)]): name, loc = x @@ -134,12 +154,59 @@ class ChooseLibraryAction(InterfaceAction): ac.setVisible(True) self.quick_menu_action.setVisible(bool(locations)) + self.rename_menu_action.setVisible(bool(locations)) + self.delete_menu_action.setVisible(bool(locations)) def location_selected(self, loc): enabled = loc == 'library' self.qaction.setEnabled(enabled) + def rename_requested(self, name, location): + loc = location.replace('/', os.sep) + base = os.path.dirname(loc) + newname, ok = QInputDialog.getText(self.gui, _('Rename') + ' ' + name, + '

'+_('Choose a new name for the library %s. ')%name + + '

'+_('Note that the actual library folder will be renamed.'), + text=name) + newname = unicode(newname) + if not ok or not newname or newname == name: + return + newloc = os.path.join(base, newname) + if os.path.exists(newloc): + return error_dialog(self.gui, _('Already exists'), + _('The folder %s already exists. Delete it first.') % + newloc, show=True) + try: + os.rename(loc, newloc) + except: + import traceback + error_dialog(self.gui, _('Rename failed'), + _('Failed to rename the library at %s. ' + 'The most common cause for this is if one of the files' + ' in the library is open in another program.') % loc, + det_msg=traceback.format_exc(), show=True) + return + self.stats.rename(location, newloc) + self.build_menus() + + def delete_requested(self, name, location): + loc = location.replace('/', os.sep) + if not question_dialog(self.gui, _('Are you sure?'), '

'+ + _('All files from %s will be ' + 'permanently deleted. Are you sure?') % loc, + show_copy_button=False): + return + exists = self.gui.library_view.model().db.exists_at(loc) + if exists: + try: + shutil.rmtree(loc, ignore_errors=True) + except: + pass + self.stats.remove(location) + self.build_menus() + + def switch_requested(self, location): if not self.change_library_allowed(): return diff --git a/src/calibre/gui2/actions/convert.py b/src/calibre/gui2/actions/convert.py index 20f5bc457a..ee0f06ab71 100644 --- a/src/calibre/gui2/actions/convert.py +++ b/src/calibre/gui2/actions/convert.py @@ -19,7 +19,7 @@ from calibre.customize.ui import plugin_for_input_format class ConvertAction(InterfaceAction): name = 'Convert Books' - action_spec = (_('Convert books'), 'convert.svg', None, _('C')) + action_spec = (_('Convert books'), 'convert.png', None, _('C')) dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) def genesis(self): diff --git a/src/calibre/gui2/actions/copy_to_library.py b/src/calibre/gui2/actions/copy_to_library.py index 0dcee7507e..7127c91e8c 100644 --- a/src/calibre/gui2/actions/copy_to_library.py +++ b/src/calibre/gui2/actions/copy_to_library.py @@ -5,6 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' +import os from functools import partial from threading import Thread @@ -13,6 +14,7 @@ from PyQt4.Qt import QMenu, QToolButton from calibre.gui2.actions import InterfaceAction from calibre.gui2 import error_dialog, Dispatcher from calibre.gui2.dialogs.progress import ProgressDialog +from calibre.utils.config import prefs, tweaks class Worker(Thread): @@ -38,6 +40,13 @@ class Worker(Thread): self.done() + def add_formats(self, id, paths, newdb, replace=True): + for path in paths: + fmt = os.path.splitext(path)[-1].replace('.', '').upper() + with open(path, 'rb') as f: + newdb.add_format(id, fmt, f, index_is_id=True, + notify=False, replace=replace) + def doit(self): from calibre.library.database2 import LibraryDatabase2 newdb = LibraryDatabase2(self.loc) @@ -49,12 +58,19 @@ class Worker(Thread): else: fmts = fmts.split(',') paths = [self.db.format_abspath(x, fmt, index_is_id=True) for fmt in fmts] - newdb.import_book(mi, paths, notify=False, import_hooks=False) - co = self.db.conversion_options(x, 'PIPE') - if co is not None: - newdb.set_conversion_options(x, 'PIPE', co) - - + added = False + if prefs['add_formats_to_existing']: + identical_book_list = newdb.find_identical_books(mi) + if identical_book_list: # books with same author and nearly same title exist in newdb + added = True + for identical_book in identical_book_list: + self.add_formats(identical_book, paths, newdb, replace=False) + if not added: + newdb.import_book(mi, paths, notify=False, import_hooks=False, + apply_import_tags=tweaks['add_new_book_tags_when_importing_books']) + co = self.db.conversion_options(x, 'PIPE') + if co is not None: + newdb.set_conversion_options(x, 'PIPE', co) class CopyToLibraryAction(InterfaceAction): diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index e0f3ae4d65..0343c6df84 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -15,7 +15,7 @@ from calibre.gui2.actions import InterfaceAction class DeleteAction(InterfaceAction): name = 'Remove Books' - action_spec = (_('Remove books'), 'trash.svg', None, _('Del')) + action_spec = (_('Remove books'), 'trash.png', None, _('Del')) def genesis(self): self.qaction.triggered.connect(self.delete_books) @@ -159,7 +159,7 @@ class DeleteAction(InterfaceAction): if self.gui.stack.currentIndex() == 0: if not confirm('

'+_('The selected books will be ' 'permanently deleted and the files ' - 'removed from your computer. Are you sure?') + 'removed from your calibre library. Are you sure?') +'

', 'library_delete_books', self.gui): return ci = view.currentIndex() diff --git a/src/calibre/gui2/actions/device.py b/src/calibre/gui2/actions/device.py index e71b2d1f45..744ab20d10 100644 --- a/src/calibre/gui2/actions/device.py +++ b/src/calibre/gui2/actions/device.py @@ -23,7 +23,7 @@ class ShareConnMenu(QMenu): # {{{ def __init__(self, parent=None): QMenu.__init__(self, parent) - mitem = self.addAction(QIcon(I('devices/folder.svg')), _('Connect to folder')) + mitem = self.addAction(QIcon(I('devices/folder.png')), _('Connect to folder')) mitem.setEnabled(True) mitem.triggered.connect(lambda x : self.connect_to_folder.emit()) self.connect_to_folder_action = mitem @@ -36,7 +36,7 @@ class ShareConnMenu(QMenu): # {{{ mitem.setVisible(False) self.addSeparator() self.toggle_server_action = \ - self.addAction(QIcon(I('network-server.svg')), + self.addAction(QIcon(I('network-server.png')), _('Start Content Server')) self.toggle_server_action.triggered.connect(lambda x: self.toggle_server.emit()) @@ -63,9 +63,9 @@ class ShareConnMenu(QMenu): # {{{ for account in keys: formats, auto, default = opts.accounts[account] dest = 'mail:'+account+';'+formats - action1 = DeviceAction(dest, False, False, I('mail.svg'), + action1 = DeviceAction(dest, False, False, I('mail.png'), _('Email to')+' '+account) - action2 = DeviceAction(dest, True, False, I('mail.svg'), + action2 = DeviceAction(dest, True, False, I('mail.png'), _('Email to')+' '+account+ _(' and delete from library')) map(self.email_to_menu.addAction, (action1, action2)) map(self.memory.append, (action1, action2)) @@ -95,7 +95,7 @@ class ShareConnMenu(QMenu): # {{{ class SendToDeviceAction(InterfaceAction): name = 'Send To Device' - action_spec = (_('Send to device'), 'sync.svg', None, _('D')) + action_spec = (_('Send to device'), 'sync.png', None, _('D')) dont_remove_from = frozenset(['toolbar-device']) dont_add_to = frozenset(['toolbar', 'context-menu']) @@ -114,7 +114,7 @@ class SendToDeviceAction(InterfaceAction): class ConnectShareAction(InterfaceAction): name = 'Connect Share' - action_spec = (_('Connect/share'), 'connect_share.svg', None, None) + action_spec = (_('Connect/share'), 'connect_share.png', None, None) popup_type = QToolButton.InstantPopup def genesis(self): @@ -122,7 +122,7 @@ class ConnectShareAction(InterfaceAction): self.share_conn_menu.toggle_server.connect(self.toggle_content_server) self.share_conn_menu.config_email.connect(partial( self.gui.iactions['Preferences'].do_config, - initial_category='email')) + initial_plugin=('Sharing', 'Email'))) self.qaction.setMenu(self.share_conn_menu) self.share_conn_menu.connect_to_folder.connect(self.gui.connect_to_folder) self.share_conn_menu.connect_to_itunes.connect(self.gui.connect_to_itunes) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index bb07cfda3d..f0232d9859 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -21,10 +21,10 @@ from calibre.gui2.dialogs.progress import BlockingBusy class EditMetadataAction(InterfaceAction): name = 'Edit Metadata' - action_spec = (_('Edit metadata'), 'edit_input.svg', None, _('E')) + action_spec = (_('Edit metadata'), 'edit_input.png', None, _('E')) def genesis(self): - self.create_action(spec=(_('Merge book records'), 'merge_books.svg', + self.create_action(spec=(_('Merge book records'), 'merge_books.png', None, _('M')), attr='action_merge') md = QMenu() md.addAction(_('Edit metadata individually'), @@ -51,7 +51,8 @@ class EditMetadataAction(InterfaceAction): self.merge_books) mb.addSeparator() mb.addAction(_('Merge into first selected book - keep others'), - partial(self.merge_books, safe_merge=True)) + partial(self.merge_books, safe_merge=True), + Qt.AltModifier+Qt.Key_M) self.merge_menu = mb self.action_merge.setMenu(mb) md.addSeparator() diff --git a/src/calibre/gui2/actions/fetch_news.py b/src/calibre/gui2/actions/fetch_news.py index b2893e0834..98be7cdcb2 100644 --- a/src/calibre/gui2/actions/fetch_news.py +++ b/src/calibre/gui2/actions/fetch_news.py @@ -15,7 +15,7 @@ from calibre.gui2.actions import InterfaceAction class FetchNewsAction(InterfaceAction): name = 'Fetch News' - action_spec = (_('Fetch news'), 'news.svg', None, _('F')) + action_spec = (_('Fetch news'), 'news.png', None, _('F')) def location_selected(self, loc): enabled = loc == 'library' diff --git a/src/calibre/gui2/actions/help.py b/src/calibre/gui2/actions/help.py index 0c6b257b80..2294daf4bb 100644 --- a/src/calibre/gui2/actions/help.py +++ b/src/calibre/gui2/actions/help.py @@ -13,7 +13,7 @@ from calibre.gui2.actions import InterfaceAction class HelpAction(InterfaceAction): name = 'Help' - action_spec = (_('Help'), 'help.svg', _('Browse the calibre User Manual'), _('F1'),) + action_spec = (_('Help'), 'help.png', _('Browse the calibre User Manual'), _('F1'),) def genesis(self): self.qaction.triggered.connect(self.show_help) diff --git a/src/calibre/gui2/actions/open.py b/src/calibre/gui2/actions/open.py index 2c7da7b669..106bfa24f6 100644 --- a/src/calibre/gui2/actions/open.py +++ b/src/calibre/gui2/actions/open.py @@ -11,7 +11,7 @@ from calibre.gui2.actions import InterfaceAction class OpenFolderAction(InterfaceAction): name = 'Open Folder' - action_spec = (_('Open containing folder'), 'document_open.svg', None, + action_spec = (_('Open containing folder'), 'document_open.png', None, _('O')) dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) diff --git a/src/calibre/gui2/actions/preferences.py b/src/calibre/gui2/actions/preferences.py index 267cabf9f3..d9957bd70d 100644 --- a/src/calibre/gui2/actions/preferences.py +++ b/src/calibre/gui2/actions/preferences.py @@ -8,19 +8,19 @@ __docformat__ = 'restructuredtext en' from PyQt4.Qt import QIcon, QMenu from calibre.gui2.actions import InterfaceAction -from calibre.gui2.dialogs.config import ConfigDialog -from calibre.gui2 import error_dialog, config +from calibre.gui2.preferences.main import Preferences +from calibre.gui2 import error_dialog class PreferencesAction(InterfaceAction): name = 'Preferences' - action_spec = (_('Preferences'), 'config.svg', None, _('Ctrl+P')) + action_spec = (_('Preferences'), 'config.png', None, _('Ctrl+P')) dont_remove_from = frozenset(['toolbar']) def genesis(self): pm = QMenu() - pm.addAction(QIcon(I('config.svg')), _('Preferences'), self.do_config) - pm.addAction(QIcon(I('wizard.svg')), _('Run welcome wizard'), + pm.addAction(QIcon(I('config.png')), _('Preferences'), self.do_config) + pm.addAction(QIcon(I('wizard.png')), _('Run welcome wizard'), self.gui.run_wizard) self.qaction.setMenu(pm) self.preferences_menu = pm @@ -28,7 +28,7 @@ class PreferencesAction(InterfaceAction): x.triggered.connect(self.do_config) - def do_config(self, checked=False, initial_category='general'): + def do_config(self, checked=False, initial_plugin=None): if self.gui.job_manager.has_jobs(): d = error_dialog(self.gui, _('Cannot configure'), _('Cannot configure while there are running jobs.')) @@ -39,26 +39,7 @@ class PreferencesAction(InterfaceAction): _('Cannot configure before calibre is restarted.')) d.exec_() return - d = ConfigDialog(self.gui, self.gui.library_view, - server=self.gui.content_server, initial_category=initial_category) - - d.exec_() - self.gui.content_server = d.server - if self.gui.content_server is not None: - self.gui.content_server.state_callback = \ - self.Dispatcher(self.gui.iactions['Connect Share'].content_server_state_changed) - self.gui.content_server.state_callback(self.gui.content_server.is_running) - - if d.result() == d.Accepted: - self.gui.search.search_as_you_type(config['search_as_you_type']) - self.gui.tags_view.set_new_model() # in case columns changed - self.gui.iactions['Save To Disk'].reread_prefs() - self.gui.tags_view.recount() - self.gui.create_device_menu() - self.gui.set_device_menu_items_state(bool(self.gui.device_connected)) - self.gui.tool_bar.build_bar() - self.gui.build_context_menus() - self.gui.tool_bar.apply_settings() - + d = Preferences(self.gui, initial_plugin=initial_plugin) + d.show() diff --git a/src/calibre/gui2/actions/save_to_disk.py b/src/calibre/gui2/actions/save_to_disk.py index fcd7c4e332..bfcc02e130 100644 --- a/src/calibre/gui2/actions/save_to_disk.py +++ b/src/calibre/gui2/actions/save_to_disk.py @@ -37,7 +37,7 @@ class SaveMenu(QMenu): # {{{ class SaveToDiskAction(InterfaceAction): name = "Save To Disk" - action_spec = (_('Save to disk'), 'save.svg', None, _('S')) + action_spec = (_('Save to disk'), 'save.png', None, _('S')) def genesis(self): self.qaction.triggered.connect(self.save_to_disk) diff --git a/src/calibre/gui2/actions/show_book_details.py b/src/calibre/gui2/actions/show_book_details.py index 40ea29bd3b..d17d0998f1 100644 --- a/src/calibre/gui2/actions/show_book_details.py +++ b/src/calibre/gui2/actions/show_book_details.py @@ -13,7 +13,7 @@ from calibre.gui2 import error_dialog class ShowBookDetailsAction(InterfaceAction): name = 'Show Book Details' - action_spec = (_('Show book details'), 'dialog_information.svg', None, + action_spec = (_('Show book details'), 'dialog_information.png', None, _('I')) dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) diff --git a/src/calibre/gui2/actions/similar_books.py b/src/calibre/gui2/actions/similar_books.py index c36eb4915b..1a14869a9c 100644 --- a/src/calibre/gui2/actions/similar_books.py +++ b/src/calibre/gui2/actions/similar_books.py @@ -20,11 +20,11 @@ class SimilarBooksAction(InterfaceAction): def genesis(self): m = QMenu(self.gui) for text, icon, target, shortcut in [ - (_('Books by same author'), 'user_profile.svg', 'authors', _('Alt+A')), - (_('Books in this series'), 'books_in_series.svg', 'series', + (_('Books by same author'), 'user_profile.png', 'authors', _('Alt+A')), + (_('Books in this series'), 'books_in_series.png', 'series', _('Alt+Shift+S')), (_('Books by this publisher'), 'publisher.png', 'publisher', _('Alt+P')), - (_('Books with the same tags'), 'tags.svg', 'tag', _('Alt+T')),]: + (_('Books with the same tags'), 'tags.png', 'tag', _('Alt+T')),]: ac = self.create_action(spec=(text, icon, None, shortcut), attr=target) m.addAction(ac) diff --git a/src/calibre/gui2/actions/view.py b/src/calibre/gui2/actions/view.py index 22592be2fe..2f6be24e5b 100644 --- a/src/calibre/gui2/actions/view.py +++ b/src/calibre/gui2/actions/view.py @@ -21,7 +21,7 @@ from calibre.gui2.actions import InterfaceAction class ViewAction(InterfaceAction): name = 'View' - action_spec = (_('View'), 'view.svg', None, _('V')) + action_spec = (_('View'), 'view.png', None, _('V')) def genesis(self): self.persistent_files = [] diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index b54b885214..5b9fb35be3 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -1,7 +1,7 @@ ''' UI for adding books to the database and saving books to disk ''' -import os, shutil, time, re +import os, shutil, time from Queue import Queue, Empty from threading import Thread @@ -94,14 +94,6 @@ class DBAdder(Thread): # {{{ self.daemon = True self.input_queue = Queue() self.output_queue = Queue() - self.fuzzy_title_patterns = [(re.compile(pat), repl) for pat, repl in - [ - (r'[\[\](){}<>\'";,:#]', ''), - (r'^(the|a|an) ', ''), - (r'[-._]', ' '), - (r'\s+', ' ') - ] - ] self.merged_books = set([]) def run(self): @@ -138,33 +130,6 @@ class DBAdder(Thread): # {{{ fmts[-1] = fmt return fmts - def fuzzy_title(self, title): - title = title.strip().lower() - for pat, repl in self.fuzzy_title_patterns: - title = pat.sub(repl, title) - return title - - def find_identical_books(self, mi): - identical_book_ids = set([]) - if mi.authors: - try: - query = u' and '.join([u'author:"=%s"'%(a.replace('"', '')) for a in - mi.authors]) - except ValueError: - return identical_book_ids - try: - book_ids = self.db.data.parse(query) - except: - import traceback - traceback.print_exc() - return identical_book_ids - for book_id in book_ids: - fbook_title = self.db.title(book_id, index_is_id=True) - fbook_title = self.fuzzy_title(fbook_title) - mbook_title = self.fuzzy_title(mi.title) - if fbook_title == mbook_title: - identical_book_ids.add(book_id) - return identical_book_ids def add(self, id, opf, cover, name): formats = self.ids.pop(id) @@ -191,7 +156,7 @@ class DBAdder(Thread): # {{{ orig_formats = formats formats = [f for f in formats if not f.lower().endswith('.opf')] if prefs['add_formats_to_existing']: - identical_book_list = self.find_identical_books(mi) + identical_book_list = self.db.find_identical_books(mi) if identical_book_list: # books with same author and nearly same title exist in db self.merged_books.add(mi.title) diff --git a/src/calibre/gui2/add_wizard/__init__.py b/src/calibre/gui2/add_wizard/__init__.py index f7518db3fc..da1879ae97 100644 --- a/src/calibre/gui2/add_wizard/__init__.py +++ b/src/calibre/gui2/add_wizard/__init__.py @@ -146,11 +146,11 @@ class Wizard(QWizard): # {{{ QWizard.__init__(self, parent) self.setModal(True) self.setWindowTitle(_('Add books to calibre')) - self.setWindowIcon(QIcon(I('add_book.svg'))) + self.setWindowIcon(QIcon(I('add_book.png'))) self.setPixmap(self.LogoPixmap, QPixmap(P('content_server/calibre.png')).scaledToHeight(80, Qt.SmoothTransformation)) self.setPixmap(self.WatermarkPixmap, - QPixmap(I('welcome_wizard.svg'))) + QPixmap(I('welcome_wizard.png'))) self.register = {} diff --git a/src/calibre/gui2/add_wizard/welcome.ui b/src/calibre/gui2/add_wizard/welcome.ui index 52fcabb714..ad820718e8 100644 --- a/src/calibre/gui2/add_wizard/welcome.ui +++ b/src/calibre/gui2/add_wizard/welcome.ui @@ -59,7 +59,7 @@ - :/images/document_open.svg:/images/document_open.svg + :/images/document_open.png:/images/document_open.png diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index f08dd09429..6b8d4b1d3c 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -80,7 +80,7 @@ class CoverView(QWidget): # {{{ self.setSizePolicy(QSizePolicy.Expanding if vertical else QSizePolicy.Minimum, QSizePolicy.Expanding) - self.default_pixmap = QPixmap(I('book.svg')) + self.default_pixmap = QPixmap(I('book.png')) self.pixmap = self.default_pixmap self.pwidth = self.pheight = None self.data = {} diff --git a/src/calibre/gui2/catalog/catalog_epub_mobi.py b/src/calibre/gui2/catalog/catalog_epub_mobi.py index 5acda0948c..1f0fdae7e2 100644 --- a/src/calibre/gui2/catalog/catalog_epub_mobi.py +++ b/src/calibre/gui2/catalog/catalog_epub_mobi.py @@ -19,6 +19,7 @@ class PluginWidget(QWidget,Ui_Form): OPTION_FIELDS = [('exclude_genre','\[.+\]'), ('exclude_tags','~,'+_('Catalog')), ('generate_titles', True), + ('generate_series', True), ('generate_recently_added', True), ('note_tag','*'), ('numbers_as_text', False), @@ -40,7 +41,7 @@ class PluginWidget(QWidget,Ui_Form): # Update dialog fields from stored options for opt in self.OPTION_FIELDS: opt_value = gprefs.get(self.name + '_' + opt[0], opt[1]) - if opt[0] in ['numbers_as_text','generate_titles','generate_recently_added']: + if opt[0] in ['numbers_as_text','generate_titles','generate_series','generate_recently_added']: getattr(self, opt[0]).setChecked(opt_value) else: getattr(self, opt[0]).setText(opt_value) @@ -52,13 +53,13 @@ class PluginWidget(QWidget,Ui_Form): # others store as lists opts_dict = {} for opt in self.OPTION_FIELDS: - if opt[0] in ['numbers_as_text','generate_titles','generate_recently_added']: + if opt[0] in ['numbers_as_text','generate_titles','generate_series','generate_recently_added']: opt_value = getattr(self,opt[0]).isChecked() else: opt_value = unicode(getattr(self, opt[0]).text()) gprefs.set(self.name + '_' + opt[0], opt_value) - if opt[0] in ['exclude_genre','numbers_as_text','generate_titles','generate_recently_added']: + if opt[0] in ['exclude_genre','numbers_as_text','generate_titles','generate_series','generate_recently_added']: opts_dict[opt[0]] = opt_value else: opts_dict[opt[0]] = opt_value.split(',') diff --git a/src/calibre/gui2/catalog/catalog_epub_mobi.ui b/src/calibre/gui2/catalog/catalog_epub_mobi.ui index cdf91eed6f..fa6b53e3a4 100644 --- a/src/calibre/gui2/catalog/catalog_epub_mobi.ui +++ b/src/calibre/gui2/catalog/catalog_epub_mobi.ui @@ -108,20 +108,27 @@ - + Include 'Recently Added' Section - + Sort numbers as text + + + + Include 'Series' Section + + + diff --git a/src/calibre/gui2/convert/__init__.py b/src/calibre/gui2/convert/__init__.py index c8f8733899..0c3a8b5a4e 100644 --- a/src/calibre/gui2/convert/__init__.py +++ b/src/calibre/gui2/convert/__init__.py @@ -7,9 +7,10 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' import textwrap +from functools import partial from PyQt4.Qt import QWidget, QSpinBox, QDoubleSpinBox, QLineEdit, QTextEdit, \ - QCheckBox, QComboBox, Qt, QIcon, SIGNAL + QCheckBox, QComboBox, Qt, QIcon, pyqtSignal from calibre.customize.conversion import OptionRecommendation from calibre.ebooks.conversion.config import load_defaults, \ @@ -39,10 +40,13 @@ def bulk_defaults_for_input_format(fmt): class Widget(QWidget): TITLE = _('Unknown') - ICON = I('config.svg') + ICON = I('config.png') HELP = '' COMMIT_NAME = None + changed_signal = pyqtSignal() + set_help = pyqtSignal(object) + def __init__(self, parent, options): QWidget.__init__(self, parent) self.setupUi(self) @@ -54,6 +58,7 @@ class Widget(QWidget): if not hasattr(self, 'opt_'+name): raise Exception('Option %s missing in %s'%(name, self.__class__.__name__)) + self.connect_gui_obj(getattr(self, 'opt_'+name)) def initialize_options(self, get_option, get_help, db=None, book_id=None): ''' @@ -76,6 +81,12 @@ class Widget(QWidget): self.apply_recommendations(defaults) self.setup_help(get_help) + def restore_defaults(self, get_option): + defaults = GuiRecommendations() + defaults.merge_recommendations(get_option, OptionRecommendation.LOW, + self._options) + self.apply_recommendations(defaults) + def commit_options(self, save_defaults=False): recs = self.create_recommendations() if save_defaults: @@ -124,6 +135,35 @@ class Widget(QWidget): else: raise Exception('Can\'t get value from %s'%type(g)) + def gui_obj_changed(self, gui_obj, *args): + self.changed_signal.emit() + + def connect_gui_obj(self, g): + f = partial(self.gui_obj_changed, g) + try: + self.connect_gui_obj_handler(g, f) + return + except NotImplementedError: + pass + from calibre.gui2.convert.xpath_wizard import XPathEdit + from calibre.gui2.convert.regex_builder import RegexEdit + if isinstance(g, (QSpinBox, QDoubleSpinBox)): + g.valueChanged.connect(f) + elif isinstance(g, (QLineEdit, QTextEdit)): + g.textChanged.connect(f) + elif isinstance(g, QComboBox): + g.editTextChanged.connect(f) + g.currentIndexChanged.connect(f) + elif isinstance(g, QCheckBox): + g.stateChanged.connect(f) + elif isinstance(g, (XPathEdit, RegexEdit)): + g.edit.editTextChanged.connect(f) + g.edit.currentIndexChanged.connect(f) + else: + raise Exception('Can\'t connect %s'%type(g)) + + def connect_gui_obj_handler(self, gui_obj, slot): + raise NotImplementedError() def set_value(self, g, val): from calibre.gui2.convert.xpath_wizard import XPathEdit @@ -154,7 +194,7 @@ class Widget(QWidget): def set_help(self, msg): if msg and getattr(msg, 'strip', lambda:True)(): try: - self.emit(SIGNAL('set_help(PyQt_PyObject)'), msg) + self.set_help.emit(msg) except: pass diff --git a/src/calibre/gui2/convert/bulk.py b/src/calibre/gui2/convert/bulk.py index 821edd08bd..1affea4e2a 100644 --- a/src/calibre/gui2/convert/bulk.py +++ b/src/calibre/gui2/convert/bulk.py @@ -58,7 +58,8 @@ class BulkConfig(Config): output_path = 'dummy.'+output_format log = Log() log.outputs = [] - self.plumber = Plumber(input_path, output_path, log) + self.plumber = Plumber(input_path, output_path, log, + merge_plugin_recs=False) def widget_factory(cls): return cls(self.stack, self.plumber.get_option_by_name, @@ -76,7 +77,7 @@ class BulkConfig(Config): output_widget = __import__('calibre.gui2.convert.'+name, fromlist=[1]) pw = output_widget.PluginWidget - pw.ICON = I('back.svg') + pw.ICON = I('back.png') pw.HELP = _('Options specific to the output format.') output_widget = widget_factory(pw) except ImportError: diff --git a/src/calibre/gui2/convert/comic_input.py b/src/calibre/gui2/convert/comic_input.py index c2b6bfffaa..fe86f133d1 100644 --- a/src/calibre/gui2/convert/comic_input.py +++ b/src/calibre/gui2/convert/comic_input.py @@ -15,6 +15,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('Comic Input') HELP = _('Options specific to')+' comic '+_('input') COMMIT_NAME = 'comic_input' + ICON = I('mimetypes/png.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, diff --git a/src/calibre/gui2/convert/debug.py b/src/calibre/gui2/convert/debug.py index 6fd1975443..e9963b4892 100644 --- a/src/calibre/gui2/convert/debug.py +++ b/src/calibre/gui2/convert/debug.py @@ -17,7 +17,7 @@ from calibre.gui2 import error_dialog, choose_dir class DebugWidget(Widget, Ui_Form): TITLE = _('Debug') - ICON = I('debug.svg') + ICON = I('debug.png') HELP = _('Debug the conversion process.') COMMIT_NAME = 'debug' diff --git a/src/calibre/gui2/convert/debug.ui b/src/calibre/gui2/convert/debug.ui index 27d2c6fef0..a6db339844 100644 --- a/src/calibre/gui2/convert/debug.ui +++ b/src/calibre/gui2/convert/debug.ui @@ -41,7 +41,7 @@ - :/images/document_open.svg:/images/document_open.svg + :/images/document_open.png:/images/document_open.png @@ -65,7 +65,7 @@ - :/images/clear_left.svg:/images/clear_left.svg + :/images/clear_left.png:/images/clear_left.png diff --git a/src/calibre/gui2/convert/epub_output.py b/src/calibre/gui2/convert/epub_output.py index 2d1fcdfcd8..c1ef6282f7 100644 --- a/src/calibre/gui2/convert/epub_output.py +++ b/src/calibre/gui2/convert/epub_output.py @@ -15,6 +15,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('EPUB Output') HELP = _('Options specific to')+' EPUB '+_('output') COMMIT_NAME = 'epub_output' + ICON = I('mimetypes/epub.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, diff --git a/src/calibre/gui2/convert/fb2_input.py b/src/calibre/gui2/convert/fb2_input.py index 702f87754f..ae4093eb07 100644 --- a/src/calibre/gui2/convert/fb2_input.py +++ b/src/calibre/gui2/convert/fb2_input.py @@ -12,6 +12,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('FB2 Input') HELP = _('Options specific to')+' FB2 '+_('input') COMMIT_NAME = 'fb2_input' + ICON = I('mimetypes/fb2.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, diff --git a/src/calibre/gui2/convert/fb2_output.py b/src/calibre/gui2/convert/fb2_output.py index 145b14f8c9..a3cbe0e647 100644 --- a/src/calibre/gui2/convert/fb2_output.py +++ b/src/calibre/gui2/convert/fb2_output.py @@ -14,6 +14,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('FB2 Output') HELP = _('Options specific to')+' FB2 '+_('output') COMMIT_NAME = 'fb2_output' + ICON = I('mimetypes/fb2.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, ['inline_toc', 'sectionize_chapters']) diff --git a/src/calibre/gui2/convert/font_key.ui b/src/calibre/gui2/convert/font_key.ui index 41d355b9c6..6c8ad2be01 100644 --- a/src/calibre/gui2/convert/font_key.ui +++ b/src/calibre/gui2/convert/font_key.ui @@ -15,7 +15,7 @@ - :/images/wizard.svg:/images/wizard.svg + :/images/wizard.png:/images/wizard.png diff --git a/src/calibre/gui2/convert/gui_conversion.py b/src/calibre/gui2/convert/gui_conversion.py index 148dc328ad..69dabe28b8 100644 --- a/src/calibre/gui2/convert/gui_conversion.py +++ b/src/calibre/gui2/convert/gui_conversion.py @@ -27,13 +27,9 @@ def gui_catalog(fmt, title, dbspec, ids, out_file_name, sync, fmt_options, conne notification=DummyReporter(), log=None): if log is None: log = Log() - if dbspec is None: - from calibre.utils.config import prefs - from calibre.library.database2 import LibraryDatabase2 - dbpath = prefs['library_path'] - db = LibraryDatabase2(dbpath) - else: # To be implemented in the future - pass + from calibre.library import db + db = db() + db.catalog_plugin_on_device_temp_mapping = dbspec # Create a minimal OptionParser that we can append to parser = OptionParser() diff --git a/src/calibre/gui2/convert/look_and_feel.py b/src/calibre/gui2/convert/look_and_feel.py index c5f579fc9e..b0403bf1dd 100644 --- a/src/calibre/gui2/convert/look_and_feel.py +++ b/src/calibre/gui2/convert/look_and_feel.py @@ -14,7 +14,7 @@ from calibre.gui2.convert import Widget class LookAndFeelWidget(Widget, Ui_Form): TITLE = _('Look & Feel') - ICON = I('lookfeel.svg') + ICON = I('lookfeel.png') HELP = _('Control the look and feel of the output') COMMIT_NAME = 'look_and_feel' diff --git a/src/calibre/gui2/convert/look_and_feel.ui b/src/calibre/gui2/convert/look_and_feel.ui index ad8f0a42a9..de48e7caf9 100644 --- a/src/calibre/gui2/convert/look_and_feel.ui +++ b/src/calibre/gui2/convert/look_and_feel.ui @@ -85,7 +85,7 @@ - :/images/wizard.svg:/images/wizard.svg + :/images/wizard.png:/images/wizard.png diff --git a/src/calibre/gui2/convert/lrf_output.py b/src/calibre/gui2/convert/lrf_output.py index 1b4f1acad3..75764164dd 100644 --- a/src/calibre/gui2/convert/lrf_output.py +++ b/src/calibre/gui2/convert/lrf_output.py @@ -19,6 +19,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('LRF Output') HELP = _('Options specific to')+' LRF '+_('output') COMMIT_NAME = 'lrf_output' + ICON = I('mimetypes/lrf.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, diff --git a/src/calibre/gui2/convert/metadata.py b/src/calibre/gui2/convert/metadata.py index daabd6226a..ea62b61f6a 100644 --- a/src/calibre/gui2/convert/metadata.py +++ b/src/calibre/gui2/convert/metadata.py @@ -39,7 +39,7 @@ def create_cover_file(db, book_id): class MetadataWidget(Widget, Ui_Form): TITLE = _('Metadata') - ICON = I('dialog_information.svg') + ICON = I('dialog_information.png') HELP = _('Set the metadata. The output file will contain as much of this ' 'metadata as possible.') COMMIT_NAME = 'metadata' @@ -89,7 +89,7 @@ class MetadataWidget(Widget, Ui_Form): self.cover.setPixmap(pm) self.cover_data = cover else: - self.cover.setPixmap(QPixmap(I('default_cover.svg'))) + self.cover.setPixmap(QPixmap(I('default_cover.png'))) def initialize_combos(self): diff --git a/src/calibre/gui2/convert/metadata.ui b/src/calibre/gui2/convert/metadata.ui index 7bc45e234e..a594f47b5d 100644 --- a/src/calibre/gui2/convert/metadata.ui +++ b/src/calibre/gui2/convert/metadata.ui @@ -87,7 +87,7 @@ - :/images/document_open.svg:/images/document_open.svg + :/images/document_open.png:/images/document_open.png diff --git a/src/calibre/gui2/convert/mobi_output.py b/src/calibre/gui2/convert/mobi_output.py index 7eff3b55a2..23c0b30253 100644 --- a/src/calibre/gui2/convert/mobi_output.py +++ b/src/calibre/gui2/convert/mobi_output.py @@ -20,6 +20,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('MOBI Output') HELP = _('Options specific to')+' MOBI '+_('output') COMMIT_NAME = 'mobi_output' + ICON = I('mimetypes/mobi.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, diff --git a/src/calibre/gui2/convert/page_setup.py b/src/calibre/gui2/convert/page_setup.py index e824c18b57..a0ca16297c 100644 --- a/src/calibre/gui2/convert/page_setup.py +++ b/src/calibre/gui2/convert/page_setup.py @@ -36,6 +36,7 @@ class PageSetupWidget(Widget, Ui_Form): COMMIT_NAME = 'page_setup' def __init__(self, parent, get_option, get_help, db=None, book_id=None): + self.__connections = [] Widget.__init__(self, parent, ['margin_top', 'margin_left', 'margin_right', 'margin_bottom', 'input_profile', 'output_profile'] @@ -46,6 +47,10 @@ class PageSetupWidget(Widget, Ui_Form): self.output_model = ProfileModel(output_profiles()) self.opt_input_profile.setModel(self.input_model) self.opt_output_profile.setModel(self.output_model) + for g, slot in self.__connections: + g.selectionModel().currentChanged.connect(slot) + del self.__connections + for x in (self.opt_input_profile, self.opt_output_profile): x.setMouseTracking(True) self.connect(x, SIGNAL('entered(QModelIndex)'), self.show_desc) @@ -55,12 +60,15 @@ class PageSetupWidget(Widget, Ui_Form): it = unicode(self.opt_output_profile.toolTip()) self.opt_output_profile.setToolTip('

'+it.replace('t.','ce.\n
')) - - def show_desc(self, index): desc = index.model().data(index, Qt.StatusTipRole).toString() self.profile_description.setText(desc) + def connect_gui_obj_handler(self, g, slot): + if g not in (self.opt_input_profile, self.opt_output_profile): + raise NotImplementedError() + self.__connections.append((g, slot)) + def set_value_handler(self, g, val): if g in (self.opt_input_profile, self.opt_output_profile): g.clearSelection() diff --git a/src/calibre/gui2/convert/pdb_input.py b/src/calibre/gui2/convert/pdb_input.py index 6adc49c3ed..4510cf81ba 100644 --- a/src/calibre/gui2/convert/pdb_input.py +++ b/src/calibre/gui2/convert/pdb_input.py @@ -12,6 +12,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('PDB Input') HELP = _('Options specific to')+' PDB '+_('input') COMMIT_NAME = 'pdb_input' + ICON = I('mimetypes/unknown.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, diff --git a/src/calibre/gui2/convert/pdb_output.py b/src/calibre/gui2/convert/pdb_output.py index 3f9d9ad3dc..9f88656f2f 100644 --- a/src/calibre/gui2/convert/pdb_output.py +++ b/src/calibre/gui2/convert/pdb_output.py @@ -16,6 +16,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('PDB Output') HELP = _('Options specific to')+' PDB '+_('output') COMMIT_NAME = 'pdb_output' + ICON = I('mimetypes/unknown.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, ['format', 'inline_toc']) diff --git a/src/calibre/gui2/convert/pdf_input.py b/src/calibre/gui2/convert/pdf_input.py index 511091ae85..967a0fe234 100644 --- a/src/calibre/gui2/convert/pdf_input.py +++ b/src/calibre/gui2/convert/pdf_input.py @@ -12,6 +12,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('PDF Input') HELP = _('Options specific to')+' PDF '+_('input') COMMIT_NAME = 'pdf_input' + ICON = I('mimetypes/pdf.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, diff --git a/src/calibre/gui2/convert/pdf_output.py b/src/calibre/gui2/convert/pdf_output.py index de0a34a508..5d6a595079 100644 --- a/src/calibre/gui2/convert/pdf_output.py +++ b/src/calibre/gui2/convert/pdf_output.py @@ -17,6 +17,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('PDF Output') HELP = _('Options specific to')+' PDF '+_('output') COMMIT_NAME = 'pdf_output' + ICON = I('mimetypes/pdf.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, ['paper_size', diff --git a/src/calibre/gui2/convert/rb_output.py b/src/calibre/gui2/convert/rb_output.py index 5f8a961899..25d1d8b0e0 100644 --- a/src/calibre/gui2/convert/rb_output.py +++ b/src/calibre/gui2/convert/rb_output.py @@ -14,6 +14,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('RB Output') HELP = _('Options specific to')+' RB '+_('output') COMMIT_NAME = 'rb_output' + ICON = I('mimetypes/unknown.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, ['inline_toc']) diff --git a/src/calibre/gui2/convert/single.py b/src/calibre/gui2/convert/single.py index b5cba20c2f..7fa8c29835 100644 --- a/src/calibre/gui2/convert/single.py +++ b/src/calibre/gui2/convert/single.py @@ -181,7 +181,7 @@ class Config(ResizableDialog, Ui_Dialog): output_widget = __import__('calibre.gui2.convert.'+name, fromlist=[1]) pw = output_widget.PluginWidget - pw.ICON = I('back.svg') + pw.ICON = I('back.png') pw.HELP = _('Options specific to the output format.') output_widget = widget_factory(pw) except ImportError: @@ -192,7 +192,7 @@ class Config(ResizableDialog, Ui_Dialog): input_widget = __import__('calibre.gui2.convert.'+name, fromlist=[1]) pw = input_widget.PluginWidget - pw.ICON = I('forward.svg') + pw.ICON = I('forward.png') pw.HELP = _('Options specific to the input format.') input_widget = widget_factory(pw) except ImportError: diff --git a/src/calibre/gui2/convert/single.ui b/src/calibre/gui2/convert/single.ui index 5b976a5cfb..ede548d8d7 100644 --- a/src/calibre/gui2/convert/single.ui +++ b/src/calibre/gui2/convert/single.ui @@ -15,7 +15,7 @@ - :/images/convert.svg:/images/convert.svg + :/images/convert.png:/images/convert.png diff --git a/src/calibre/gui2/convert/structure_detection.py b/src/calibre/gui2/convert/structure_detection.py index cc1a16c617..f2ca49d1bd 100644 --- a/src/calibre/gui2/convert/structure_detection.py +++ b/src/calibre/gui2/convert/structure_detection.py @@ -15,7 +15,7 @@ from calibre.gui2 import error_dialog class StructureDetectionWidget(Widget, Ui_Form): TITLE = _('Structure\nDetection') - ICON = I('chapters.svg') + ICON = I('chapters.png') HELP = _('Fine tune the detection of chapter headings and ' 'other document structure.') COMMIT_NAME = 'structure_detection' diff --git a/src/calibre/gui2/convert/toc.py b/src/calibre/gui2/convert/toc.py index 0908aba576..8121f23192 100644 --- a/src/calibre/gui2/convert/toc.py +++ b/src/calibre/gui2/convert/toc.py @@ -14,7 +14,7 @@ from calibre.gui2 import error_dialog class TOCWidget(Widget, Ui_Form): TITLE = _('Table of\nContents') - ICON = I('series.svg') + ICON = I('series.png') HELP = _('Control the creation/conversion of the Table of Contents.') COMMIT_NAME = 'toc' diff --git a/src/calibre/gui2/convert/txt_input.py b/src/calibre/gui2/convert/txt_input.py index 006c06dd00..31019251e2 100644 --- a/src/calibre/gui2/convert/txt_input.py +++ b/src/calibre/gui2/convert/txt_input.py @@ -12,6 +12,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('TXT Input') HELP = _('Options specific to')+' TXT '+_('input') COMMIT_NAME = 'txt_input' + ICON = I('mimetypes/txt.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, diff --git a/src/calibre/gui2/convert/txt_output.py b/src/calibre/gui2/convert/txt_output.py index 1accd08485..8b2e131ec6 100644 --- a/src/calibre/gui2/convert/txt_output.py +++ b/src/calibre/gui2/convert/txt_output.py @@ -16,6 +16,7 @@ class PluginWidget(Widget, Ui_Form): TITLE = _('TXT Output') HELP = _('Options specific to')+' TXT '+_('output') COMMIT_NAME = 'txt_output' + ICON = I('mimetypes/txt.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, diff --git a/src/calibre/gui2/convert/xexp_edit.ui b/src/calibre/gui2/convert/xexp_edit.ui index f3427bce23..7e89ec5d43 100644 --- a/src/calibre/gui2/convert/xexp_edit.ui +++ b/src/calibre/gui2/convert/xexp_edit.ui @@ -60,7 +60,7 @@ - :/images/wizard.svg:/images/wizard.svg + :/images/wizard.png:/images/wizard.png diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 0e89358c53..67ab94d29a 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -57,7 +57,7 @@ class Bool(Base): QComboBox(parent)] w = self.widgets[1] items = [_('Yes'), _('No'), _('Undefined')] - icons = [I('ok.svg'), I('list_remove.svg'), I('blank.svg')] + icons = [I('ok.png'), I('list_remove.png'), I('blank.png')] if tweaks['bool_custom_columns_are_tristate'] == 'no': items = items[:-1] icons = icons[:-1] diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index bc79a3c9de..45c78ce6da 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -9,9 +9,8 @@ from itertools import repeat from functools import partial from binascii import unhexlify -from PyQt4.Qt import QMenu, QAction, QActionGroup, QIcon, SIGNAL, QPixmap, \ - Qt, pyqtSignal, QColor, QPainter, QDialog, QMessageBox -from PyQt4.QtSvg import QSvgRenderer +from PyQt4.Qt import QMenu, QAction, QActionGroup, QIcon, SIGNAL, \ + Qt, pyqtSignal, QDialog, QMessageBox from calibre.customize.ui import available_input_formats, available_output_formats, \ device_plugins @@ -21,7 +20,7 @@ from calibre.gui2.dialogs.choose_format import ChooseFormatDialog from calibre.utils.ipc.job import BaseJob from calibre.devices.scanner import DeviceScanner from calibre.gui2 import config, error_dialog, Dispatcher, dynamic, \ - pixmap_to_data, warning_dialog, \ + warning_dialog, \ question_dialog, info_dialog, choose_dir from calibre.ebooks.metadata import authors_to_string from calibre import preferred_encoding, prints @@ -34,7 +33,7 @@ from calibre.devices.folder_device.driver import FOLDER_DEVICE from calibre.ebooks.metadata.meta import set_metadata from calibre.constants import DEBUG from calibre.utils.config import prefs, tweaks - +from calibre.utils.magick.draw import thumbnail # }}} class DeviceJob(BaseJob): # {{{ @@ -417,33 +416,33 @@ class DeviceMenu(QMenu): # {{{ self._memory = [] self.set_default_menu = QMenu(_('Set default send to device action')) - self.set_default_menu.setIcon(QIcon(I('config.svg'))) + self.set_default_menu.setIcon(QIcon(I('config.png'))) basic_actions = [ - ('main:', False, False, I('reader.svg'), + ('main:', False, False, I('reader.png'), _('Send to main memory')), - ('carda:0', False, False, I('sd.svg'), + ('carda:0', False, False, I('sd.png'), _('Send to storage card A')), - ('cardb:0', False, False, I('sd.svg'), + ('cardb:0', False, False, I('sd.png'), _('Send to storage card B')), ] delete_actions = [ - ('main:', True, False, I('reader.svg'), + ('main:', True, False, I('reader.png'), _('Main Memory')), - ('carda:0', True, False, I('sd.svg'), + ('carda:0', True, False, I('sd.png'), _('Storage Card A')), - ('cardb:0', True, False, I('sd.svg'), + ('cardb:0', True, False, I('sd.png'), _('Storage Card B')), ] specific_actions = [ - ('main:', False, True, I('reader.svg'), + ('main:', False, True, I('reader.png'), _('Main Memory')), - ('carda:0', False, True, I('sd.svg'), + ('carda:0', False, True, I('sd.png'), _('Storage Card A')), - ('cardb:0', False, True, I('sd.svg'), + ('cardb:0', False, True, I('sd.png'), _('Storage Card B')), ] @@ -488,7 +487,7 @@ class DeviceMenu(QMenu): # {{{ self.group.triggered.connect(self.change_default_action) self.addSeparator() - mitem = self.addAction(QIcon(I('eject.svg')), _('Eject device')) + mitem = self.addAction(QIcon(I('eject.png')), _('Eject device')) mitem.setEnabled(False) mitem.triggered.connect(lambda x : self.disconnect_mounted_device.emit()) self.disconnect_mounted_device_action = mitem @@ -617,14 +616,8 @@ class DeviceMixin(object): # {{{ self.connect_to_folder_named(tweaks['auto_connect_to_folder']) def set_default_thumbnail(self, height): - r = QSvgRenderer(I('book.svg')) - pixmap = QPixmap(height, height) - pixmap.fill(QColor(255,255,255)) - p = QPainter(pixmap) - r.render(p) - p.end() - self.default_thumbnail = (pixmap.width(), pixmap.height(), - pixmap_to_data(pixmap)) + img = I('book.png', data=True) + self.default_thumbnail = thumbnail(img, height, height) def connect_to_folder_named(self, folder): if os.path.exists(folder) and os.path.isdir(folder): @@ -767,8 +760,8 @@ class DeviceMixin(object): # {{{ def refresh_ondevice_info(self, device_connected, reset_only = False): ''' - Force the library view to refresh, taking into consideration - books information + Force the library view to refresh, taking into consideration new + device books information ''' self.book_on_device(None, reset=True) if reset_only: @@ -798,12 +791,14 @@ class DeviceMixin(object): # {{{ self.booklists()) model.paths_deleted(paths) self.upload_booklists() - # Clear the ondevice info so it will be recomputed + # Force recomputation the library's ondevice info. We need to call + # set_books_in_library even though books were not added because + # the deleted book might have been an exact match. + self.set_books_in_library(self.booklists(), reset=True) self.book_on_device(None, None, reset=True) - # We want to reset all the ondevice flags in the library. Use a big - # hammer, so we don't need to worry about whether some succeeded or not - self.library_view.model().refresh() - + # We need to reset the ondevice flags in the library. Use a big hammer, + # so we don't need to worry about whether some succeeded or not. + self.refresh_ondevice_info(device_connected=True, reset_only=False) def dispatch_sync_event(self, dest, delete, specific): rows = self.library_view.selectionModel().selectedRows() @@ -959,13 +954,12 @@ class DeviceMixin(object): # {{{ self.library_view.model().delete_books_by_id(remove) def cover_to_thumbnail(self, data): - p = QPixmap() - p.loadFromData(data) - if not p.isNull(): - ht = self.device_manager.device.THUMBNAIL_HEIGHT \ - if self.device_manager else DevicePlugin.THUMBNAIL_HEIGHT - p = p.scaledToHeight(ht, Qt.SmoothTransformation) - return (p.width(), p.height(), pixmap_to_data(p)) + ht = self.device_manager.device.THUMBNAIL_HEIGHT \ + if self.device_manager else DevicePlugin.THUMBNAIL_HEIGHT + try: + return thumbnail(data, ht, ht) + except: + pass def email_news(self, id): opts = email_config().parse() @@ -1294,8 +1288,14 @@ class DeviceMixin(object): # {{{ books_to_be_deleted = memory[1] self.library_view.model().delete_books_by_id(books_to_be_deleted) - self.set_books_in_library(self.booklists(), - reset=bool(books_to_be_deleted)) + # There are some cases where sending a book to the device overwrites a + # book already there with a different book. This happens frequently in + # news. When this happens, the book match indication will be wrong + # because the UUID changed. Force both the device and the library view + # to refresh the flags. + self.set_books_in_library(self.booklists(), reset=True) + self.book_on_device(None, reset=True) + self.refresh_ondevice_info(device_connected = True) view = self.card_a_view if on_card == 'carda' else self.card_b_view if on_card == 'cardb' else self.memory_view view.model().resort(reset=False) @@ -1303,112 +1303,108 @@ class DeviceMixin(object): # {{{ for f in files: getattr(f, 'close', lambda : True)() - self.book_on_device(None, reset=True) - if metadata: - changed = set([]) - for mi in metadata: - id_ = getattr(mi, 'application_id', None) - if id_ is not None: - changed.add(id_) - if changed: - self.library_view.model().refresh_ids(list(changed)) - def book_on_device(self, id, format=None, reset=False): - loc = [None, None, None] + ''' + Return an indication of whether the given book represented by its db id + is on the currently connected device. It returns a 5 element list. The + first three elements represent memory locations main, carda, and cardb, + and are true if the book is identifiably in that memory. The fourth + is a count of how many instances of the book were found across all + the memory locations. The fifth is a set of paths to the + matching books on the device. + ''' + loc = [None, None, None, 0, set([])] if reset: - self.book_db_title_cache = None - self.book_db_uuid_cache = None + self.book_db_id_cache = None + self.book_db_id_counts = None + self.book_db_uuid_path_map = None return - if self.book_db_title_cache is None: - self.book_db_title_cache = [] - self.book_db_uuid_cache = [] + if not hasattr(self, 'db_book_uuid_cache'): + return loc + + if self.book_db_id_cache is None: + self.book_db_id_cache = [] + self.book_db_id_counts = {} + self.book_db_uuid_path_map = {} for i, l in enumerate(self.booklists()): - self.book_db_title_cache.append({}) - self.book_db_uuid_cache.append(set()) + self.book_db_id_cache.append(set()) for book in l: - book_title = book.title.lower() if book.title else '' - book_title = re.sub('(?u)\W|[_]', '', book_title) - if book_title not in self.book_db_title_cache[i]: - self.book_db_title_cache[i][book_title] = \ - {'authors':set(), 'db_ids':set(), 'uuids':set()} - book_authors = authors_to_string(book.authors).lower() - book_authors = re.sub('(?u)\W|[_]', '', book_authors) - self.book_db_title_cache[i][book_title]['authors'].add(book_authors) db_id = getattr(book, 'application_id', None) if db_id is None: db_id = book.db_id if db_id is not None: - self.book_db_title_cache[i][book_title]['db_ids'].add(db_id) - uuid = getattr(book, 'uuid', None) - if uuid is not None: - self.book_db_uuid_cache[i].add(uuid) + # increment the count of books on the device with this + # db_id. + self.book_db_id_cache[i].add(db_id) + if db_id not in self.book_db_uuid_path_map: + self.book_db_uuid_path_map[db_id] = set() + if getattr(book, 'lpath', False): + self.book_db_uuid_path_map[db_id].add(book.lpath) + c = self.book_db_id_counts.get(db_id, 0) + self.book_db_id_counts[db_id] = c + 1 - mi = self.library_view.model().db.get_metadata(id, index_is_id=True) for i, l in enumerate(self.booklists()): - if mi.uuid in self.book_db_uuid_cache[i]: + if id in self.book_db_id_cache[i]: loc[i] = True - continue - db_title = re.sub('(?u)\W|[_]', '', mi.title.lower()) - cache = self.book_db_title_cache[i].get(db_title, None) - if cache: - if id in cache['db_ids']: - loc[i] = True - continue - if mi.authors and \ - re.sub('(?u)\W|[_]', '', authors_to_string(mi.authors).lower()) \ - in cache['authors']: - loc[i] = True - continue - # Also check author sort, because it can be used as author in - # some formats - if mi.author_sort and \ - re.sub('(?u)\W|[_]', '', mi.author_sort.lower()) \ - in cache['authors']: - loc[i] = True - continue + loc[3] = self.book_db_id_counts.get(id, 0) + loc[4] |= self.book_db_uuid_path_map[id] return loc def set_books_in_library(self, booklists, reset=False): + ''' + Set the ondevice indications in the device database. + This method should be called before book_on_device is called, because + it sets the application_id for matched books. Book_on_device uses that + to both speed up matching and to count matches. + ''' + + string_pat = re.compile('(?u)\W|[_]') + def clean_string(x): + x = x.lower() if x else '' + return string_pat.sub('', x) + # Force a reset if the caches are not initialized if reset or not hasattr(self, 'db_book_title_cache'): # It might be possible to get here without having initialized the # library view. In this case, simply give up - if not hasattr(self, 'library_view') or self.library_view is None: - return - db = getattr(self.library_view.model(), 'db', None) - if db is None: + try: + db = self.library_view.model().db + except: return # Build a cache (map) of the library, so the search isn't On**2 self.db_book_title_cache = {} self.db_book_uuid_cache = {} for id in db.data.iterallids(): mi = db.get_metadata(id, index_is_id=True) - title = re.sub('(?u)\W|[_]', '', mi.title.lower()) + title = clean_string(mi.title) if title not in self.db_book_title_cache: self.db_book_title_cache[title] = \ {'authors':{}, 'author_sort':{}, 'db_ids':{}} + # If there are multiple books in the library with the same title + # and author, then remember the last one. That is OK, because as + # we can't tell the difference between the books, one is as good + # as another. if mi.authors: - authors = authors_to_string(mi.authors).lower() - authors = re.sub('(?u)\W|[_]', '', authors) + authors = clean_string(authors_to_string(mi.authors)) self.db_book_title_cache[title]['authors'][authors] = mi if mi.author_sort: - aus = mi.author_sort.lower() - aus = re.sub('(?u)\W|[_]', '', aus) + aus = clean_string(mi.author_sort) self.db_book_title_cache[title]['author_sort'][aus] = mi self.db_book_title_cache[title]['db_ids'][mi.application_id] = mi self.db_book_uuid_cache[mi.uuid] = mi # Now iterate through all the books on the device, setting the - # in_library field Fastest and most accurate key is the uuid. Second is - # the application_id, which is really the db key, but as this can - # accidentally match across libraries we also verify the title. The - # db_id exists on Sony devices. Fallback is title and author match + # in_library field. If the UUID matches a book in the library, then + # do not consider that book for other matching. In all cases set + # the application_id to the db_id of the matching book. This value + # will be used by books_on_device to indicate matches. update_metadata = prefs['manage_device_metadata'] == 'on_connect' for booklist in booklists: for book in booklist: + book.in_library = None if getattr(book, 'uuid', None) in self.db_book_uuid_cache: if update_metadata: book.smart_update(self.db_book_uuid_cache[book.uuid], @@ -1418,39 +1414,56 @@ class DeviceMixin(object): # {{{ book.application_id = \ self.db_book_uuid_cache[book.uuid].application_id continue - - book_title = book.title.lower() if book.title else '' - book_title = re.sub('(?u)\W|[_]', '', book_title) - book.in_library = None + # No UUID exact match. Try metadata matching. + book_title = clean_string(book.title) d = self.db_book_title_cache.get(book_title, None) if d is not None: + # At this point we know that the title matches. The book + # will match if any of the db_id, author, or author_sort + # also match. if getattr(book, 'application_id', None) in d['db_ids']: book.in_library = True + # app_id already matches a db_id. No need to set it. if update_metadata: book.smart_update(d['db_ids'][book.application_id], replace_metadata=True) continue - if book.db_id in d['db_ids']: + # Sonys know their db_id independent of the application_id + # in the metadata cache. Check that as well. + if getattr(book, 'db_id', None) in d['db_ids']: book.in_library = True + book.application_id = \ + d['db_ids'][book.db_id].application_id if update_metadata: book.smart_update(d['db_ids'][book.db_id], replace_metadata=True) continue + # We now know that the application_id is not right. Set it + # to None to prevent book_on_device from accidentally + # matching on it. It will be set to a correct value below if + # the book is matched with one in the library + book.application_id = None if book.authors: # Compare against both author and author sort, because # either can appear as the author - book_authors = authors_to_string(book.authors).lower() - book_authors = re.sub('(?u)\W|[_]', '', book_authors) + book_authors = clean_string(authors_to_string(book.authors)) if book_authors in d['authors']: book.in_library = True + book.application_id = \ + d['authors'][book_authors].application_id if update_metadata: book.smart_update(d['authors'][book_authors], replace_metadata=True) elif book_authors in d['author_sort']: book.in_library = True + book.application_id = \ + d['author_sort'][book_authors].application_id if update_metadata: book.smart_update(d['author_sort'][book_authors], replace_metadata=True) + else: + # Book definitely not matched. Clear its application ID + book.application_id = None # Set author_sort if it isn't already asort = getattr(book, 'author_sort', None) if not asort and book.authors: diff --git a/src/calibre/gui2/device_drivers/configwidget.ui b/src/calibre/gui2/device_drivers/configwidget.ui index 497ba43259..1e8ee75852 100644 --- a/src/calibre/gui2/device_drivers/configwidget.ui +++ b/src/calibre/gui2/device_drivers/configwidget.ui @@ -41,7 +41,7 @@ - :/images/arrow-up.svg:/images/arrow-up.svg + :/images/arrow-up.png:/images/arrow-up.png @@ -65,7 +65,7 @@ - :/images/arrow-down.svg:/images/arrow-down.svg + :/images/arrow-down.png:/images/arrow-down.png diff --git a/src/calibre/gui2/dialogs/add_from_isbn.ui b/src/calibre/gui2/dialogs/add_from_isbn.ui index e4882f7d18..ef4a4ebb8f 100644 --- a/src/calibre/gui2/dialogs/add_from_isbn.ui +++ b/src/calibre/gui2/dialogs/add_from_isbn.ui @@ -15,7 +15,7 @@ - :/images/add_book.svg:/images/add_book.svg + :/images/add_book.png:/images/add_book.png diff --git a/src/calibre/gui2/dialogs/book_info.ui b/src/calibre/gui2/dialogs/book_info.ui index 39f9abf3c5..18c4f8a7c8 100644 --- a/src/calibre/gui2/dialogs/book_info.ui +++ b/src/calibre/gui2/dialogs/book_info.ui @@ -70,7 +70,7 @@ - :/images/previous.svg:/images/previous.svg + :/images/previous.png:/images/previous.png @@ -81,7 +81,7 @@ - :/images/next.svg:/images/next.svg + :/images/next.png:/images/next.png diff --git a/src/calibre/gui2/dialogs/catalog.py b/src/calibre/gui2/dialogs/catalog.py index e1adbac0b3..f8e0f83746 100644 --- a/src/calibre/gui2/dialogs/catalog.py +++ b/src/calibre/gui2/dialogs/catalog.py @@ -52,7 +52,7 @@ class Catalog(QDialog, Ui_Dialog): fromlist=[1]) pw = catalog_widget.PluginWidget() pw.initialize(name) - pw.ICON = I('forward.svg') + pw.ICON = I('forward.png') self.widgets.append(pw) [self.fmts.append([file_type.upper(), pw.sync_enabled,pw]) for file_type in plugin.file_types] except ImportError: @@ -83,7 +83,7 @@ class Catalog(QDialog, Ui_Dialog): catalog_widget = __import__(name, fromlist=[1]) pw = catalog_widget.PluginWidget() pw.initialize(name) - pw.ICON = I('forward.svg') + pw.ICON = I('forward.png') self.widgets.append(pw) [self.fmts.append([file_type.upper(), pw.sync_enabled,pw]) for file_type in plugin.file_types] except ImportError: diff --git a/src/calibre/gui2/dialogs/choose_format.ui b/src/calibre/gui2/dialogs/choose_format.ui index 50dd4b4fc1..639d8db401 100644 --- a/src/calibre/gui2/dialogs/choose_format.ui +++ b/src/calibre/gui2/dialogs/choose_format.ui @@ -13,7 +13,7 @@ Choose Format - :/images/mimetypes/unknown.svg + :/images/mimetypes/unknown.png diff --git a/src/calibre/gui2/dialogs/choose_library.ui b/src/calibre/gui2/dialogs/choose_library.ui index ca2cfd5d96..6cf1b4386c 100644 --- a/src/calibre/gui2/dialogs/choose_library.ui +++ b/src/calibre/gui2/dialogs/choose_library.ui @@ -118,7 +118,7 @@ - :/images/document_open.svg:/images/document_open.svg + :/images/document_open.png:/images/document_open.png diff --git a/src/calibre/gui2/dialogs/comicconf.ui b/src/calibre/gui2/dialogs/comicconf.ui index 03911b2171..b5eab32547 100644 --- a/src/calibre/gui2/dialogs/comicconf.ui +++ b/src/calibre/gui2/dialogs/comicconf.ui @@ -15,7 +15,7 @@ - :/images/convert.svg:/images/convert.svg + :/images/convert.png:/images/convert.png diff --git a/src/calibre/gui2/dialogs/config/__init__.py b/src/calibre/gui2/dialogs/config/__init__.py deleted file mode 100644 index 1f04c50e19..0000000000 --- a/src/calibre/gui2/dialogs/config/__init__.py +++ /dev/null @@ -1,1024 +0,0 @@ -__license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal ' - -import os, re, time, textwrap, copy, sys - -from PyQt4.Qt import QDialog, QListWidgetItem, QIcon, \ - QVBoxLayout, QLabel, QPlainTextEdit, \ - QStringListModel, QAbstractItemModel, QFont, \ - SIGNAL, QThread, Qt, QSize, QVariant, QUrl, \ - QModelIndex, QAbstractTableModel, \ - QDialogButtonBox, QTabWidget, QBrush, QLineEdit, \ - QProgressDialog - -from calibre.constants import iswindows, isosx -from calibre.gui2.dialogs.config.config_ui import Ui_Dialog -from calibre.gui2.dialogs.config.create_custom_column import CreateCustomColumn -from calibre.gui2.dialogs.config.toolbar import ToolbarLayout -from calibre.gui2 import error_dialog, config, gprefs, \ - open_url, open_local_file, \ - ALL_COLUMNS, NONE, info_dialog, choose_files, \ - warning_dialog, ResizableDialog, question_dialog -from calibre.utils.config import prefs, read_raw_tweaks, write_tweaks -from calibre.ebooks import BOOK_EXTENSIONS -from calibre.ebooks.oeb.iterator import is_supported -from calibre.library.server import server_config -from calibre.customize.ui import initialized_plugins, is_disabled, enable_plugin, \ - disable_plugin, customize_plugin, \ - plugin_customization, add_plugin, \ - remove_plugin, all_input_formats, \ - input_format_plugins, \ - output_format_plugins, available_output_formats -from calibre.utils.smtp import config as smtp_prefs -from calibre.gui2.convert import config_widget_for_input_plugin -from calibre.gui2.convert.look_and_feel import LookAndFeelWidget -from calibre.gui2.convert.page_setup import PageSetupWidget -from calibre.gui2.convert.structure_detection import StructureDetectionWidget -from calibre.ebooks.conversion.plumber import Plumber -from calibre.utils.logging import Log -from calibre.gui2.convert.toc import TOCWidget -from calibre.utils.search_query_parser import saved_searches - - -class ConfigTabs(QTabWidget): - - def __init__(self, parent): - QTabWidget.__init__(self, parent) - log = Log() - log.outputs = [] - - self.plumber = Plumber('dummy.epub', 'dummy.epub', log, dummy=True, - merge_plugin_recs=False) - - def widget_factory(cls): - return cls(self, self.plumber.get_option_by_name, - self.plumber.get_option_help, None, None) - - lf = widget_factory(LookAndFeelWidget) - ps = widget_factory(PageSetupWidget) - sd = widget_factory(StructureDetectionWidget) - toc = widget_factory(TOCWidget) - - self.widgets = [lf, ps, sd, toc] - - for plugin in input_format_plugins(): - pw = config_widget_for_input_plugin(plugin) - if pw is not None: - pw.ICON = I('forward.svg') - self.widgets.append(widget_factory(pw)) - - for plugin in output_format_plugins(): - name = plugin.name.lower().replace(' ', '_') - try: - output_widget = __import__('calibre.gui2.convert.'+name, - fromlist=[1]) - pw = output_widget.PluginWidget - pw.ICON = I('forward.svg') - self.widgets.append(widget_factory(pw)) - except ImportError: - continue - - for i, widget in enumerate(self.widgets): - self.addTab(widget, widget.TITLE.replace('\n', ' ').replace('&', - '&&')) - self.setTabToolTip(i, widget.HELP if widget.HELP else widget.TITLE) - self.setUsesScrollButtons(True) - - def commit(self): - for widget in self.widgets: - if not widget.pre_commit_check(): - return False - widget.commit(save_defaults=True) - return True - -class PluginModel(QAbstractItemModel): - - def __init__(self, *args): - QAbstractItemModel.__init__(self, *args) - self.icon = QVariant(QIcon(I('plugins.svg'))) - p = QIcon(self.icon).pixmap(32, 32, QIcon.Disabled, QIcon.On) - self.disabled_icon = QVariant(QIcon(p)) - self._p = p - self.populate() - - def populate(self): - self._data = {} - for plugin in initialized_plugins(): - if plugin.type not in self._data: - self._data[plugin.type] = [plugin] - else: - self._data[plugin.type].append(plugin) - self.categories = sorted(self._data.keys()) - - for plugins in self._data.values(): - plugins.sort(cmp=lambda x, y: cmp(x.name.lower(), y.name.lower())) - - def index(self, row, column, parent): - if not self.hasIndex(row, column, parent): - return QModelIndex() - - if parent.isValid(): - return self.createIndex(row, column, 1+parent.row()) - else: - return self.createIndex(row, column, 0) - - def parent(self, index): - if not index.isValid() or index.internalId() == 0: - return QModelIndex() - return self.createIndex(index.internalId()-1, 0, 0) - - def rowCount(self, parent): - if not parent.isValid(): - return len(self.categories) - if parent.internalId() == 0: - category = self.categories[parent.row()] - return len(self._data[category]) - return 0 - - def columnCount(self, parent): - return 1 - - def index_to_plugin(self, index): - category = self.categories[index.parent().row()] - return self._data[category][index.row()] - - def plugin_to_index(self, plugin): - for i, category in enumerate(self.categories): - parent = self.index(i, 0, QModelIndex()) - for j, p in enumerate(self._data[category]): - if plugin == p: - return self.index(j, 0, parent) - return QModelIndex() - - def refresh_plugin(self, plugin, rescan=False): - if rescan: - self.populate() - idx = self.plugin_to_index(plugin) - self.emit(SIGNAL('dataChanged(QModelIndex,QModelIndex)'), idx, idx) - - def flags(self, index): - if not index.isValid(): - return 0 - if index.internalId() == 0: - return Qt.ItemIsEnabled - flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled - return flags - - def data(self, index, role): - if not index.isValid(): - return NONE - if index.internalId() == 0: - if role == Qt.DisplayRole: - category = self.categories[index.row()] - return QVariant(_("%(plugin_type)s %(plugins)s")%\ - dict(plugin_type=category, plugins=_('plugins'))) - else: - plugin = self.index_to_plugin(index) - if role == Qt.DisplayRole: - ver = '.'.join(map(str, plugin.version)) - desc = '\n'.join(textwrap.wrap(plugin.description, 50)) - ans='%s (%s) %s %s\n%s'%(plugin.name, ver, _('by'), plugin.author, desc) - c = plugin_customization(plugin) - if c: - ans += _('\nCustomization: ')+c - return QVariant(ans) - if role == Qt.DecorationRole: - return self.disabled_icon if is_disabled(plugin) else self.icon - if role == Qt.ForegroundRole and is_disabled(plugin): - return QVariant(QBrush(Qt.gray)) - if role == Qt.UserRole: - return plugin - return NONE - - - -class CategoryModel(QStringListModel): - - CATEGORIES = [ - ('general', _('General'), 'dialog_information.svg'), - ('interface', _('Interface'), 'lookfeel.svg'), - ('conversion', _('Conversion'), 'convert.svg'), - ('email', _('Email\nDelivery'), 'mail.svg'), - ('add/save', _('Add/Save'), 'save.svg'), - ('advanced', _('Advanced'), 'view.svg'), - ('server', _('Content\nServer'), 'network-server.svg'), - ('plugins', _('Plugins'), 'plugins.svg'), - ] - - def __init__(self, *args): - QStringListModel.__init__(self, *args) - self.setStringList([x[1] for x in self.CATEGORIES]) - - def data(self, index, role): - if role == Qt.DecorationRole: - return QVariant(QIcon(I(self.CATEGORIES[index.row()][2]))) - return QStringListModel.data(self, index, role) - - def index_for_name(self, name): - for i, x in enumerate(self.CATEGORIES): - if x[0] == name: - return self.index(i) - return self.index(0) - -class EmailAccounts(QAbstractTableModel): - - def __init__(self, accounts): - QAbstractTableModel.__init__(self) - self.accounts = accounts - self.account_order = sorted(self.accounts.keys()) - self.headers = map(QVariant, [_('Email'), _('Formats'), _('Auto send')]) - self.default_font = QFont() - self.default_font.setBold(True) - self.default_font = QVariant(self.default_font) - self.tooltips =[NONE] + map(QVariant, - [_('Formats to email. The first matching format will be sent.'), - '

'+_('If checked, downloaded news will be automatically ' - 'mailed
to this email address ' - '(provided it is in one of the listed formats).')]) - - def rowCount(self, *args): - return len(self.account_order) - - def columnCount(self, *args): - return 3 - - def headerData(self, section, orientation, role): - if role == Qt.DisplayRole and orientation == Qt.Horizontal: - return self.headers[section] - return NONE - - def data(self, index, role): - row, col = index.row(), index.column() - if row < 0 or row >= self.rowCount(): - return NONE - account = self.account_order[row] - if role == Qt.UserRole: - return (account, self.accounts[account]) - if role == Qt.ToolTipRole: - return self.tooltips[col] - if role in [Qt.DisplayRole, Qt.EditRole]: - if col == 0: - return QVariant(account) - if col == 1: - return QVariant(self.accounts[account][0]) - if role == Qt.FontRole and self.accounts[account][2]: - return self.default_font - if role == Qt.CheckStateRole and col == 2: - return QVariant(Qt.Checked if self.accounts[account][1] else Qt.Unchecked) - return NONE - - def flags(self, index): - if index.column() == 2: - return QAbstractTableModel.flags(self, index)|Qt.ItemIsUserCheckable - else: - return QAbstractTableModel.flags(self, index)|Qt.ItemIsEditable - - def setData(self, index, value, role): - if not index.isValid(): - return False - row, col = index.row(), index.column() - account = self.account_order[row] - if col == 2: - self.accounts[account][1] ^= True - elif col == 1: - self.accounts[account][0] = unicode(value.toString()).upper() - else: - na = unicode(value.toString()) - from email.utils import parseaddr - addr = parseaddr(na)[-1] - if not addr: - return False - self.accounts[na] = self.accounts.pop(account) - self.account_order[row] = na - if '@kindle.com' in addr: - self.accounts[na][0] = 'AZW, MOBI, TPZ, PRC, AZW1' - - self.emit(SIGNAL('dataChanged(QModelIndex,QModelIndex)'), - self.index(index.row(), 0), self.index(index.row(), 2)) - return True - - def make_default(self, index): - if index.isValid(): - row = index.row() - for x in self.accounts.values(): - x[2] = False - self.accounts[self.account_order[row]][2] = True - self.reset() - - def add(self): - x = _('new email address') - y = x - c = 0 - while y in self.accounts: - c += 1 - y = x + str(c) - auto_send = len(self.accounts) < 1 - self.accounts[y] = ['MOBI, EPUB', auto_send, - len(self.account_order) == 0] - self.account_order = sorted(self.accounts.keys()) - self.reset() - return self.index(self.account_order.index(y), 0) - - def remove(self, index): - if index.isValid(): - row = index.row() - account = self.account_order[row] - self.accounts.pop(account) - self.account_order = sorted(self.accounts.keys()) - has_default = False - for account in self.account_order: - if self.accounts[account][2]: - has_default = True - break - if not has_default and self.account_order: - self.accounts[self.account_order[0]][2] = True - - self.reset() - - -class ConfigDialog(ResizableDialog, Ui_Dialog): - - def category_current_changed(self, n, p): - self.stackedWidget.setCurrentIndex(n.row()) - - def __init__(self, parent, library_view, server=None, - initial_category='general'): - ResizableDialog.__init__(self, parent) - self._category_model = CategoryModel() - - self.category_view.currentChanged = self.category_current_changed - self.category_view.setModel(self._category_model) - self.parent = parent - self.library_view = library_view - self.model = library_view.model() - self.db = self.model.db - self.server = server - self.connect(self.compact_button, SIGNAL('clicked(bool)'), self.compact) - - input_map = prefs['input_format_order'] - all_formats = set() - for fmt in all_input_formats().union(set(['ZIP', 'RAR'])): - all_formats.add(fmt.upper()) - for format in input_map + list(all_formats.difference(input_map)): - item = QListWidgetItem(format, self.input_order) - item.setData(Qt.UserRole, QVariant(format)) - item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable) - - self.connect(self.input_up, SIGNAL('clicked()'), self.up_input) - self.connect(self.input_down, SIGNAL('clicked()'), self.down_input) - - rn = config['use_roman_numerals_for_series_number'] - self.timeout.setValue(prefs['network_timeout']) - self.roman_numerals.setChecked(rn) - self.new_version_notification.setChecked(config['new_version_notification']) - - # Set up columns - colmap = list(self.model.column_map) - state = self.library_view.get_state() - hidden_cols = state['hidden_columns'] - positions = state['column_positions'] - colmap.sort(cmp=lambda x,y: cmp(positions[x], positions[y])) - self.custcols = copy.deepcopy(self.db.field_metadata.get_custom_field_metadata()) - for col in colmap: - item = QListWidgetItem(self.model.headers[col], self.columns) - item.setData(Qt.UserRole, QVariant(col)) - flags = Qt.ItemIsEnabled|Qt.ItemIsSelectable - if col != 'ondevice': - flags |= Qt.ItemIsUserCheckable - item.setFlags(flags) - if col != 'ondevice': - item.setCheckState(Qt.Unchecked if col in hidden_cols else - Qt.Checked) - self.column_up.clicked.connect(self.up_column) - self.column_down.clicked.connect(self.down_column) - self.del_custcol_button.clicked.connect(self.del_custcol) - self.add_custcol_button.clicked.connect(self.add_custcol) - self.edit_custcol_button.clicked.connect(self.edit_custcol) - - output_formats = sorted(available_output_formats()) - output_formats.remove('oeb') - for f in output_formats: - self.output_format.addItem(f.upper()) - default_index = \ - self.output_format.findText(prefs['output_format'].upper()) - self.output_format.setCurrentIndex(default_index if default_index != -1 else 0) - - - self.cover_browse.setValue(config['cover_flow_queue_length']) - self.systray_notifications.setChecked(not config['disable_tray_notification']) - from calibre.utils.localization import available_translations, \ - get_language, get_lang - lang = get_lang() - if lang is None or lang not in available_translations(): - lang = 'en' - self.language.addItem(get_language(lang), QVariant(lang)) - items = [(l, get_language(l)) for l in available_translations() \ - if l != lang] - if lang != 'en': - items.append(('en', get_language('en'))) - items.sort(cmp=lambda x, y: cmp(x[1], y[1])) - for item in items: - self.language.addItem(item[1], QVariant(item[0])) - - exts = set([]) - for ext in BOOK_EXTENSIONS: - ext = ext.lower() - ext = re.sub(r'(x{0,1})htm(l{0,1})', 'html', ext) - if ext == 'lrf' or is_supported('book.'+ext): - exts.add(ext) - - for ext in sorted(exts): - self.viewer.addItem(ext.upper()) - self.viewer.item(self.viewer.count()-1).setFlags(Qt.ItemIsEnabled|Qt.ItemIsUserCheckable) - self.viewer.item(self.viewer.count()-1).setCheckState(Qt.Checked if ext.upper() in config['internally_viewed_formats'] else Qt.Unchecked) - self.viewer.sortItems() - self.start.setEnabled(not getattr(self.server, 'is_running', False)) - self.test.setEnabled(not self.start.isEnabled()) - self.stop.setDisabled(self.start.isEnabled()) - self.connect(self.start, SIGNAL('clicked()'), self.start_server) - self.connect(self.view_logs, SIGNAL('clicked()'), self.view_server_logs) - self.connect(self.stop, SIGNAL('clicked()'), self.stop_server) - self.connect(self.test, SIGNAL('clicked()'), self.test_server) - self.connect(self.show_server_password, SIGNAL('stateChanged(int)'), - lambda s: self.password.setEchoMode(self.password.Normal if s == Qt.Checked else self.password.Password)) - self.password.setEchoMode(self.password.Password) - opts = server_config().parse() - self.max_cover_size.setText(opts.max_cover) - self.port.setValue(opts.port) - self.username.setText(opts.username) - self.password.setText(opts.password if opts.password else '') - self.opt_max_opds_items.setValue(opts.max_opds_items) - self.opt_max_opds_ungrouped_items.setValue(opts.max_opds_ungrouped_items) - self.auto_launch.setChecked(config['autolaunch_server']) - self.systray_icon.setChecked(config['systray_icon']) - self.sync_news.setChecked(config['upload_news_to_device']) - self.delete_news.setChecked(config['delete_news_from_library_on_upload']) - p = {'normal':0, 'high':1, 'low':2}[prefs['worker_process_priority']] - self.priority.setCurrentIndex(p) - self.priority.setVisible(iswindows) - self.priority_label.setVisible(iswindows) - self._plugin_model = PluginModel() - self.plugin_view.setModel(self._plugin_model) - self.plugin_view.setStyleSheet( - "QTreeView::item { padding-bottom: 10px;}") - self.connect(self.toggle_plugin, SIGNAL('clicked()'), lambda : self.modify_plugin(op='toggle')) - self.connect(self.customize_plugin, SIGNAL('clicked()'), lambda : self.modify_plugin(op='customize')) - self.connect(self.remove_plugin, SIGNAL('clicked()'), lambda : self.modify_plugin(op='remove')) - self.connect(self.button_plugin_browse, SIGNAL('clicked()'), self.find_plugin) - self.connect(self.button_plugin_add, SIGNAL('clicked()'), self.add_plugin) - self.connect(self.button_osx_symlinks, SIGNAL('clicked()'), - self.create_symlinks) - self.button_osx_symlinks.setVisible(isosx) - self.separate_cover_flow.setChecked(config['separate_cover_flow']) - self.setup_email_page() - self.delete_news.setEnabled(bool(self.sync_news.isChecked())) - self.connect(self.sync_news, SIGNAL('toggled(bool)'), - self.delete_news.setEnabled) - self.setup_conversion_options() - self.opt_worker_limit.setValue(config['worker_limit']) - self.connect(self.button_open_config_dir, SIGNAL('clicked()'), - self.open_config_dir) - self.opt_get_social_metadata.setChecked(config['get_social_metadata']) - self.opt_overwrite_author_title_metadata.setChecked(config['overwrite_author_title_metadata']) - self.opt_enforce_cpu_limit.setChecked(config['enforce_cpu_limit']) - self.device_detection_button.clicked.connect(self.debug_device_detection) - self.port.editingFinished.connect(self.check_port_value) - self.search_as_you_type.setChecked(config['search_as_you_type']) - self.show_avg_rating.setChecked(config['show_avg_rating']) - self.show_splash_screen.setChecked(gprefs.get('show_splash_screen', - True)) - li = None - for i, z in enumerate([('wide', _('Wide')), - ('narrow', _('Narrow'))]): - x, y = z - self.opt_gui_layout.addItem(y, QVariant(x)) - if x == config['gui_layout']: - li = i - self.opt_gui_layout.setCurrentIndex(li) - restrictions = sorted(saved_searches().names(), - cmp=lambda x,y: cmp(x.lower(), y.lower())) - restrictions.insert(0, '') - for x in ('gui', 'cs'): - w = getattr(self, 'opt_%s_restriction'%x) - w.addItems(restrictions) - idx = w.findText(self.db.prefs.get(x+'_restriction', '')) - w.setCurrentIndex(0 if idx < 0 else idx) - self.opt_disable_animations.setChecked(config['disable_animations']) - idx = 0 - for i, x in enumerate([(_('Small'), 'small'), (_('Medium'), 'medium'), - (_('Large'), 'large')]): - if x[1] == gprefs.get('toolbar_icon_size', 'medium'): - idx = i - self.opt_toolbar_icon_size.addItem(x[0], x[1]) - self.opt_toolbar_icon_size.setCurrentIndex(idx) - idx = 0 - for i, x in enumerate([(_('Automatic'), 'auto'), (_('Always'), 'always'), - (_('Never'), 'never')]): - if x[1] == gprefs.get('toolbar_text', 'auto'): - idx = i - self.opt_toolbar_text.addItem(x[0], x[1]) - self.opt_toolbar_text.setCurrentIndex(idx) - self.reset_confirmation_button.clicked.connect(self.reset_confirmation) - - deft, curt = read_raw_tweaks() - self.current_tweaks.setPlainText(curt.decode('utf-8')) - self.default_tweaks.setPlainText(deft.decode('utf-8')) - self.restore_tweaks_to_default_button.clicked.connect(self.restore_tweaks_to_default) - self.toolbar_cm_widget = ToolbarLayout(parent, parent) - self.toolbar_cm_tab.addTab(self.toolbar_cm_widget, - _('Toolbars/Context menus')) - - self.category_view.setCurrentIndex(self.category_view.model().index_for_name(initial_category)) - - def restore_tweaks_to_default(self, *args): - deft, curt = read_raw_tweaks() - self.current_tweaks.setPlainText(deft.decode('utf-8')) - - - def reset_confirmation(self): - from calibre.gui2 import dynamic - for key in dynamic.keys(): - if key.endswith('_again') and dynamic[key] is False: - dynamic[key] = True - info_dialog(self, _('Done'), - _('Confirmation dialogs have all been reset'), show=True) - - def check_port_value(self, *args): - port = self.port.value() - if port < 1025: - warning_dialog(self, _('System port selected'), '

'+ - _('The value %d you have chosen for the content ' - 'server port is a system port. Your operating ' - 'system may not allow the server to run on this ' - 'port. To be safe choose a port number larger than ' - '1024.')%port, show=True) - - def debug_device_detection(self): - from calibre.gui2.dialogs.config.device_debug import DebugDevice - d = DebugDevice(self) - d.exec_() - - def open_config_dir(self): - from calibre.utils.config import config_dir - open_local_file(config_dir) - - def create_symlinks(self): - from calibre.utils.osx_symlinks import create_symlinks - loc, paths = create_symlinks() - if loc is None: - error_dialog(self, _('Error'), - _('Failed to install command line tools.'), - det_msg=paths, show=True) - else: - info_dialog(self, _('Command line tools installed'), - '

'+_('Command line tools installed in')+' '+loc+ - '
'+ _('If you move calibre.app, you have to re-install ' - 'the command line tools.'), - det_msg='\n'.join(paths), show=True) - - def setup_conversion_options(self): - self.conversion_options = ConfigTabs(self) - self.stackedWidget.insertWidget(2, self.conversion_options) - - def setup_email_page(self): - def x(): - if self._email_accounts.account_order: - return self._email_accounts.account_order[0] - self.send_email_widget.initialize(x) - opts = self.send_email_widget.smtp_opts - self._email_accounts = EmailAccounts(opts.accounts) - self.email_view.setModel(self._email_accounts) - - self.connect(self.email_add, SIGNAL('clicked(bool)'), - self.add_email_account) - self.connect(self.email_make_default, SIGNAL('clicked(bool)'), - lambda c: self._email_accounts.make_default(self.email_view.currentIndex())) - self.email_view.resizeColumnsToContents() - self.connect(self.email_remove, SIGNAL('clicked()'), - self.remove_email_account) - - def add_email_account(self, checked): - index = self._email_accounts.add() - self.email_view.setCurrentIndex(index) - self.email_view.resizeColumnsToContents() - self.email_view.edit(index) - - def remove_email_account(self, *args): - idx = self.email_view.currentIndex() - self._email_accounts.remove(idx) - - def set_email_settings(self): - to_set = bool(self._email_accounts.accounts) - if not self.send_email_widget.set_email_settings(to_set): - return False - conf = smtp_prefs() - conf.set('accounts', self._email_accounts.accounts) - return True - - - def add_plugin(self): - path = unicode(self.plugin_path.text()) - if path and os.access(path, os.R_OK) and path.lower().endswith('.zip'): - add_plugin(path) - self._plugin_model.populate() - self._plugin_model.reset() - else: - error_dialog(self, _('No valid plugin path'), - _('%s is not a valid plugin path')%path).exec_() - - def find_plugin(self): - path = choose_files(self, 'choose plugin dialog', _('Choose plugin'), - filters=[('Plugins', ['zip'])], all_files=False, - select_only_single_file=True) - if path: - self.plugin_path.setText(path[0]) - - def modify_plugin(self, op=''): - index = self.plugin_view.currentIndex() - if index.isValid(): - plugin = self._plugin_model.index_to_plugin(index) - if op == 'toggle': - if not plugin.can_be_disabled: - error_dialog(self,_('Plugin cannot be disabled'), - _('The plugin: %s cannot be disabled')%plugin.name).exec_() - return - if is_disabled(plugin): - enable_plugin(plugin) - else: - disable_plugin(plugin) - self._plugin_model.refresh_plugin(plugin) - if op == 'customize': - if not plugin.is_customizable(): - info_dialog(self, _('Plugin not customizable'), - _('Plugin: %s does not need customization')%plugin.name).exec_() - return - config_dialog = QDialog(self) - button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) - v = QVBoxLayout(config_dialog) - - config_dialog.connect(button_box, SIGNAL('accepted()'), config_dialog.accept) - config_dialog.connect(button_box, SIGNAL('rejected()'), config_dialog.reject) - config_dialog.setWindowTitle(_('Customize') + ' ' + plugin.name) - - if hasattr(plugin, 'config_widget'): - config_widget = plugin.config_widget() - v.addWidget(config_widget) - v.addWidget(button_box) - config_dialog.exec_() - - if config_dialog.result() == QDialog.Accepted: - plugin.save_settings(config_widget) - self._plugin_model.refresh_plugin(plugin) - else: - help_text = plugin.customization_help(gui=True) - help_text = QLabel(help_text, config_dialog) - help_text.setWordWrap(True) - help_text.setTextInteractionFlags(Qt.LinksAccessibleByMouse - | Qt.LinksAccessibleByKeyboard) - help_text.setOpenExternalLinks(True) - v.addWidget(help_text) - sc = plugin_customization(plugin) - if not sc: - sc = '' - sc = sc.strip() - sc = QLineEdit(sc, config_dialog) - v.addWidget(sc) - v.addWidget(button_box) - config_dialog.exec_() - - if config_dialog.result() == QDialog.Accepted: - sc = unicode(sc.text()).strip() - customize_plugin(plugin, sc) - - self._plugin_model.refresh_plugin(plugin) - elif op == 'remove': - if remove_plugin(plugin): - self._plugin_model.populate() - self._plugin_model.reset() - else: - error_dialog(self, _('Cannot remove builtin plugin'), - plugin.name + _(' cannot be removed. It is a ' - 'builtin plugin. Try disabling it instead.')).exec_() - - def up_input(self): - idx = self.input_order.currentRow() - if idx > 0: - self.input_order.insertItem(idx-1, self.input_order.takeItem(idx)) - self.input_order.setCurrentRow(idx-1) - - def set_tweaks(self): - raw = unicode(self.current_tweaks.toPlainText()).encode('utf-8') - try: - exec raw - except: - import traceback - error_dialog(self, _('Invalid tweaks'), - _('The tweaks you entered are invalid, try resetting the' - ' tweaks to default and changing them one by one until' - ' you find the invalid setting.'), - det_msg=traceback.format_exc(), show=True) - return False - write_tweaks(raw) - return True - - def down_input(self): - idx = self.input_order.currentRow() - if idx < self.input_order.count()-1: - self.input_order.insertItem(idx+1, self.input_order.takeItem(idx)) - self.input_order.setCurrentRow(idx+1) - - # Column settings {{{ - def up_column(self): - idx = self.columns.currentRow() - if idx > 0: - self.columns.insertItem(idx-1, self.columns.takeItem(idx)) - self.columns.setCurrentRow(idx-1) - - def down_column(self): - idx = self.columns.currentRow() - if idx < self.columns.count()-1: - self.columns.insertItem(idx+1, self.columns.takeItem(idx)) - self.columns.setCurrentRow(idx+1) - - def del_custcol(self): - idx = self.columns.currentRow() - if idx < 0: - return error_dialog(self, '', _('You must select a column to delete it'), - show=True) - col = unicode(self.columns.item(idx).data(Qt.UserRole).toString()) - if col not in self.custcols: - return error_dialog(self, '', - _('The selected column is not a custom column'), show=True) - if not question_dialog(self, _('Are you sure?'), - _('Do you really want to delete column %s and all its data?') % - self.custcols[col]['name'], show_copy_button=False): - return - self.columns.item(idx).setCheckState(False) - self.columns.takeItem(idx) - self.custcols[col]['*deleteme'] = True - return - - def add_custcol(self): - CreateCustomColumn(self, False, self.model.orig_headers, ALL_COLUMNS) - - def edit_custcol(self): - CreateCustomColumn(self, True, self.model.orig_headers, ALL_COLUMNS) - - def apply_custom_column_changes(self): - config_cols = [unicode(self.columns.item(i).data(Qt.UserRole).toString())\ - for i in range(self.columns.count())] - if not config_cols: - config_cols = ['title'] - removed_cols = set(self.model.column_map) - set(config_cols) - hidden_cols = set([unicode(self.columns.item(i).data(Qt.UserRole).toString())\ - for i in range(self.columns.count()) \ - if self.columns.item(i).checkState()==Qt.Unchecked]) - hidden_cols = hidden_cols.union(removed_cols) # Hide removed cols - hidden_cols = list(hidden_cols.intersection(set(self.model.column_map))) - if 'ondevice' in hidden_cols: - hidden_cols.remove('ondevice') - def col_pos(x, y): - xidx = config_cols.index(x) if x in config_cols else sys.maxint - yidx = config_cols.index(y) if y in config_cols else sys.maxint - return cmp(xidx, yidx) - positions = {} - for i, col in enumerate((sorted(self.model.column_map, cmp=col_pos))): - positions[col] = i - state = {'hidden_columns': hidden_cols, 'column_positions':positions} - self.library_view.apply_state(state) - self.library_view.save_state() - - must_restart = False - for c in self.custcols: - if self.custcols[c]['colnum'] is None: - self.db.create_custom_column( - label=self.custcols[c]['label'], - name=self.custcols[c]['name'], - datatype=self.custcols[c]['datatype'], - is_multiple=self.custcols[c]['is_multiple'], - display = self.custcols[c]['display']) - must_restart = True - elif '*deleteme' in self.custcols[c]: - self.db.delete_custom_column(label=self.custcols[c]['label']) - must_restart = True - elif '*edited' in self.custcols[c]: - cc = self.custcols[c] - self.db.set_custom_column_metadata(cc['colnum'], name=cc['name'], - label=cc['label'], - display = self.custcols[c]['display']) - if '*must_restart' in self.custcols[c]: - must_restart = True - return must_restart - # }}} - - def view_server_logs(self): - from calibre.library.server import log_access_file, log_error_file - d = QDialog(self) - d.resize(QSize(800, 600)) - layout = QVBoxLayout() - d.setLayout(layout) - layout.addWidget(QLabel(_('Error log:'))) - el = QPlainTextEdit(d) - layout.addWidget(el) - try: - el.setPlainText(open(log_error_file, 'rb').read().decode('utf8', 'replace')) - except IOError: - el.setPlainText('No error log found') - layout.addWidget(QLabel(_('Access log:'))) - al = QPlainTextEdit(d) - layout.addWidget(al) - try: - al.setPlainText(open(log_access_file, 'rb').read().decode('utf8', 'replace')) - except IOError: - al.setPlainText('No access log found') - bx = QDialogButtonBox(QDialogButtonBox.Ok) - layout.addWidget(bx) - self.connect(bx, SIGNAL('accepted()'), d.accept) - d.show() - - def set_server_options(self): - c = server_config() - c.set('port', self.port.value()) - c.set('username', unicode(self.username.text()).strip()) - p = unicode(self.password.text()).strip() - if not p: - p = None - c.set('password', p) - - def start_server(self): - self.set_server_options() - from calibre.library.server.main import start_threaded_server - self.server = start_threaded_server(self.db, server_config().parse()) - while not self.server.is_running and self.server.exception is None: - time.sleep(1) - if self.server.exception is not None: - error_dialog(self, _('Failed to start content server'), - unicode(self.server.exception)).exec_() - return - self.start.setEnabled(False) - self.test.setEnabled(True) - self.stop.setEnabled(True) - - def stop_server(self): - from calibre.library.server.main import stop_threaded_server - stop_threaded_server(self.server) - self.server = None - self.start.setEnabled(True) - self.test.setEnabled(False) - self.stop.setEnabled(False) - - def test_server(self): - open_url(QUrl('http://127.0.0.1:'+str(self.port.value()))) - - def compact(self, toggled): - d = CheckIntegrity(self.db, self) - d.exec_() - - def accept(self): - mcs = unicode(self.max_cover_size.text()).strip() - if not re.match(r'\d+x\d+', mcs): - error_dialog(self, _('Invalid size'), - _('The size %s is invalid. must be of the form widthxheight')%mcs).exec_() - return - if not self.set_email_settings(): - return - if not self.conversion_options.commit(): - return - if not self.add_save.save_settings(): - return - if not self.set_tweaks(): - return - wl = self.opt_worker_limit.value() - if wl%2 != 0: - wl += 1 - self.toolbar_cm_widget.commit() - config['worker_limit'] = wl - - config['use_roman_numerals_for_series_number'] = bool(self.roman_numerals.isChecked()) - config['new_version_notification'] = bool(self.new_version_notification.isChecked()) - prefs['network_timeout'] = int(self.timeout.value()) - input_cols = [unicode(self.input_order.item(i).data(Qt.UserRole).toString()) for i in range(self.input_order.count())] - prefs['input_format_order'] = input_cols - - must_restart = self.apply_custom_column_changes() - - config['separate_cover_flow'] = bool(self.separate_cover_flow.isChecked()) - config['disable_tray_notification'] = not self.systray_notifications.isChecked() - p = {0:'normal', 1:'high', 2:'low'}[self.priority.currentIndex()] - prefs['worker_process_priority'] = p - prefs['output_format'] = unicode(self.output_format.currentText()).upper() - config['cover_flow_queue_length'] = self.cover_browse.value() - prefs['language'] = str(self.language.itemData(self.language.currentIndex()).toString()) - config['systray_icon'] = self.systray_icon.checkState() == Qt.Checked - config['autolaunch_server'] = self.auto_launch.isChecked() - sc = server_config() - sc.set('username', unicode(self.username.text()).strip()) - sc.set('password', unicode(self.password.text()).strip()) - sc.set('port', self.port.value()) - sc.set('max_cover', mcs) - sc.set('max_opds_items', self.opt_max_opds_items.value()) - sc.set('max_opds_ungrouped_items', - self.opt_max_opds_ungrouped_items.value()) - config['delete_news_from_library_on_upload'] = self.delete_news.isChecked() - config['upload_news_to_device'] = self.sync_news.isChecked() - config['search_as_you_type'] = self.search_as_you_type.isChecked() - config['show_avg_rating'] = self.show_avg_rating.isChecked() - config['get_social_metadata'] = self.opt_get_social_metadata.isChecked() - config['overwrite_author_title_metadata'] = self.opt_overwrite_author_title_metadata.isChecked() - config['enforce_cpu_limit'] = bool(self.opt_enforce_cpu_limit.isChecked()) - config['disable_animations'] = bool(self.opt_disable_animations.isChecked()) - gprefs['show_splash_screen'] = bool(self.show_splash_screen.isChecked()) - for x in ('toolbar_icon_size', 'toolbar_text'): - w = getattr(self, 'opt_'+x) - data = w.itemData(w.currentIndex()).toString() - gprefs[x] = unicode(data) - fmts = [] - for i in range(self.viewer.count()): - if self.viewer.item(i).checkState() == Qt.Checked: - fmts.append(str(self.viewer.item(i).text())) - config['internally_viewed_formats'] = fmts - val = self.opt_gui_layout.itemData(self.opt_gui_layout.currentIndex()).toString() - config['gui_layout'] = unicode(val) - for x in ('gui', 'cs'): - w = getattr(self, 'opt_%s_restriction'%x) - self.db.prefs.set(x+'_restriction', unicode(w.currentText())) - - if must_restart: - warning_dialog(self, _('Must restart'), - _('The changes you made require that Calibre be ' - 'restarted. Please restart as soon as practical.'), - show=True, show_copy_button=False) - self.parent.must_restart_before_config = True - QDialog.accept(self) - -class VacThread(QThread): - - def __init__(self, parent, db): - QThread.__init__(self, parent) - self.db = db - self._parent = parent - - def run(self): - err = bad = None - try: - bad = self.db.check_integrity(self.callback) - except: - import traceback - err = traceback.format_exc() - self.emit(SIGNAL('check_done(PyQt_PyObject, PyQt_PyObject)'), bad, err) - - def callback(self, progress, msg): - self.emit(SIGNAL('callback(PyQt_PyObject,PyQt_PyObject)'), progress, - msg) - -class CheckIntegrity(QProgressDialog): - - def __init__(self, db, parent=None): - QProgressDialog.__init__(self, parent) - self.db = db - self.setCancelButton(None) - self.setMinimum(0) - self.setMaximum(100) - self.setWindowTitle(_('Checking database integrity')) - self.setAutoReset(False) - self.setValue(0) - - self.vthread = VacThread(self, db) - self.connect(self.vthread, SIGNAL('check_done(PyQt_PyObject,PyQt_PyObject)'), - self.check_done, - Qt.QueuedConnection) - self.connect(self.vthread, - SIGNAL('callback(PyQt_PyObject,PyQt_PyObject)'), - self.callback, Qt.QueuedConnection) - self.vthread.start() - - def callback(self, progress, msg): - self.setLabelText(msg) - self.setValue(int(100*progress)) - - def check_done(self, bad, err): - if err: - error_dialog(self, _('Error'), - _('Failed to check database integrity'), - det_msg=err, show=True) - elif bad: - titles = [self.db.title(x, index_is_id=True) for x in bad] - det_msg = '\n'.join(titles) - warning_dialog(self, _('Some inconsistencies found'), - _('The following books had formats listed in the ' - 'database that are not actually available. ' - 'The entries for the formats have been removed. ' - 'You should check them manually. This can ' - 'happen if you manipulate the files in the ' - 'library folder directly.'), det_msg=det_msg, show=True) - self.reset() - - - -if __name__ == '__main__': - from calibre.library.database2 import LibraryDatabase2 - from PyQt4.Qt import QApplication - app = QApplication([]) - d=ConfigDialog(None, LibraryDatabase2('/tmp')) - d.show() - app.exec_() diff --git a/src/calibre/gui2/dialogs/config/add_save.py b/src/calibre/gui2/dialogs/config/add_save.py deleted file mode 100644 index 8eb6cf7bd0..0000000000 --- a/src/calibre/gui2/dialogs/config/add_save.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai -from __future__ import with_statement - -__license__ = 'GPL v3' -__copyright__ = '2009, Kovid Goyal ' -__docformat__ = 'restructuredtext en' - -import textwrap - -from PyQt4.Qt import QTabWidget - -from calibre.gui2.dialogs.config.add_save_ui import Ui_TabWidget -from calibre.library.save_to_disk import config -from calibre.utils.config import prefs -from calibre.gui2.widgets import FilenamePattern - -class AddSave(QTabWidget, Ui_TabWidget): - - def __init__(self, parent=None): - QTabWidget.__init__(self, parent) - self.setupUi(self) - while self.count() > 3: - self.removeTab(3) - c = config() - opts = c.parse() - for x in ('asciiize', 'update_metadata', 'save_cover', 'write_opf', - 'replace_whitespace', 'to_lowercase'): - g = getattr(self, 'opt_'+x) - g.setChecked(getattr(opts, x)) - help = '\n'.join(textwrap.wrap(c.get_option(x).help, 75)) - g.setToolTip(help) - g.setWhatsThis(help) - - for x in ('formats', 'timefmt'): - g = getattr(self, 'opt_'+x) - g.setText(getattr(opts, x)) - help = '\n'.join(textwrap.wrap(c.get_option(x).help, 75)) - g.setToolTip(help) - g.setWhatsThis(help) - - - self.opt_read_metadata_from_filename.setChecked(not prefs['read_file_metadata']) - self.filename_pattern = FilenamePattern(self) - self.metadata_box.layout().insertWidget(0, self.filename_pattern) - self.opt_swap_author_names.setChecked(prefs['swap_author_names']) - self.opt_add_formats_to_existing.setChecked(prefs['add_formats_to_existing']) - if prefs['manage_device_metadata'] == 'manual': - self.manage_device_metadata.setCurrentIndex(0) - elif prefs['manage_device_metadata'] == 'on_send': - self.manage_device_metadata.setCurrentIndex(1) - else: - self.manage_device_metadata.setCurrentIndex(2) - help = '\n'.join(textwrap.wrap(c.get_option('template').help, 75)) - self.save_template.initialize('save_to_disk', opts.template, help) - self.send_template.initialize('send_to_device', opts.send_template, help) - - def validate(self): - return self.save_template.validate() and self.send_template.validate() - - def save_settings(self): - if not self.validate(): - return False - c = config() - for x in ('asciiize', 'update_metadata', 'save_cover', 'write_opf', - 'replace_whitespace', 'to_lowercase'): - c.set(x, getattr(self, 'opt_'+x).isChecked()) - for x in ('formats', 'timefmt'): - val = unicode(getattr(self, 'opt_'+x).text()).strip() - if x == 'formats' and not val: - val = 'all' - c.set(x, val) - self.save_template.save_settings(c, 'template') - self.send_template.save_settings(c, 'send_template') - prefs['read_file_metadata'] = not bool(self.opt_read_metadata_from_filename.isChecked()) - pattern = self.filename_pattern.commit() - prefs['filename_pattern'] = pattern - prefs['swap_author_names'] = bool(self.opt_swap_author_names.isChecked()) - prefs['add_formats_to_existing'] = bool(self.opt_add_formats_to_existing.isChecked()) - if self.manage_device_metadata.currentIndex() == 0: - prefs['manage_device_metadata'] = 'manual' - elif self.manage_device_metadata.currentIndex() == 1: - prefs['manage_device_metadata'] = 'on_send' - else: - prefs['manage_device_metadata'] = 'on_connect' - return True - -if __name__ == '__main__': - from PyQt4.Qt import QApplication - app=QApplication([]) - a = AddSave() - a.show() - app.exec_() - a.save_settings() - diff --git a/src/calibre/gui2/dialogs/config/add_save.ui b/src/calibre/gui2/dialogs/config/add_save.ui deleted file mode 100644 index c8ee0419a9..0000000000 --- a/src/calibre/gui2/dialogs/config/add_save.ui +++ /dev/null @@ -1,280 +0,0 @@ - - - TabWidget - - - - 0 - 0 - 671 - 516 - - - - TabWidget - - - 0 - - - - &Adding books - - - - - - Here you can control how calibre will read metadata from the files you add to it. calibre can either read metadata from the contents of the file, or from the filename. - - - true - - - - - - - Read metadata only from &file name - - - - - - - Swap the firstname and lastname of the author. This affects only metadata read from file names. - - - &Swap author firstname and lastname - - - - - - - If an existing book with a similar title and author is found that does not have the format being added, the format is added -to the existing book, instead of creating a new entry. If the existing book already has the format, then it is silently ignored. - -Title match ignores leading indefinite articles ("the", "a", "an"), punctuation, case, etc. Author match is exact. - - - If books with similar titles and authors found, &merge the new files automatically - - - - - - - &Configure metadata from file name - - - - - - Qt::Vertical - - - - 20 - 363 - - - - - - - - - - - - &Saving books - - - - - - Here you can control how calibre will save your books when you click the Save to Disk button: - - - true - - - - - - - Save &cover separately - - - - - - - Update &metadata in saved copies - - - - - - - Save metadata in &OPF file - - - - - - - Convert non-English characters to &English equivalents - - - - - - - Format &dates as: - - - opt_timefmt - - - - - - - - - - File &formats to save: - - - opt_formats - - - - - - - - - - Replace space with &underscores - - - - - - - Change paths to &lowercase - - - - - - - - - - - Sending to &device - - - - - - - 0 - 0 - - - - Metadata &management: - - - manage_device_metadata - - - - - - - - 0 - 0 - - - - - Manual management - - - - - Only on send - - - - - Automatic management - - - - - - - - Qt::Horizontal - - - - 313 - 20 - - - - - - - - <li><b>Manual Management</b>: Calibre updates the metadata and adds collections only when a book is sent. With this option, calibre will never remove a collection.</li> -<li><b>Only on send</b>: Calibre updates metadata and adds/removes collections for a book only when it is sent to the device. </li> -<li><b>Automatic management</b>: Calibre automatically keeps metadata on the device in sync with the calibre library, on every connect</li></ul> - - - true - - - - - - - - - - - - - - Here you can control how calibre will save your books when you click the Send to Device button. This setting can be overriden for individual devices by customizing the device interface plugins in Preferences->Plugins - - - true - - - - - - - - - - - - SaveTemplate - QWidget -

calibre/gui2/dialogs/config/save_template.h
- 1 - - - - - diff --git a/src/calibre/gui2/dialogs/config/config.ui b/src/calibre/gui2/dialogs/config/config.ui deleted file mode 100644 index 988960615d..0000000000 --- a/src/calibre/gui2/dialogs/config/config.ui +++ /dev/null @@ -1,1381 +0,0 @@ - - - Kovid Goyal - Dialog - - - - 0 - 0 - 1001 - 730 - - - - Preferences - - - - :/images/config.svg:/images/config.svg - - - - - - - - - 0 - 0 - - - - - 75 - true - - - - QAbstractItemView::NoEditTriggers - - - true - - - false - - - - 48 - 48 - - - - QAbstractItemView::ScrollPerItem - - - QAbstractItemView::ScrollPerPixel - - - QListView::TopToBottom - - - 20 - - - QListView::ListMode - - - - - - - - 1 - 0 - - - - QFrame::Plain - - - 0 - - - true - - - - - 0 - 0 - 725 - 683 - - - - - 0 - - - - - - 100 - 0 - - - - 0 - - - 0 - - - - - - - Show notification when &new version is available - - - - - - - Download &social metadata (tags/ratings/etc.) by default - - - - - - - &Overwrite author and title by default when fetching metadata - - - - - - - - - Default network &timeout: - - - timeout - - - - - - - Set the default timeout for network fetches (i.e. anytime we go out to the internet to get information) - - - seconds - - - 2 - - - 120 - - - 5 - - - - - - - - - - Choose &language (requires restart): - - - language - - - - - - - - Normal - - - - - High - - - - - Low - - - - - - - - Job &priority: - - - priority - - - - - - - Preferred &output format: - - - output_format - - - - - - - - - - - - Reset all disabled &confirmation dialogs - - - - - - - Preferred &input format order: - - - - - - - - true - - - QAbstractItemView::SelectRows - - - - - - - - - ... - - - - :/images/arrow-up.svg:/images/arrow-up.svg - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - :/images/arrow-down.svg:/images/arrow-down.svg - - - - - - - - - - - - - - - - - - 0 - - - - &Miscellaneous - - - - - - User Interface &layout (needs restart): - - - opt_gui_layout - - - - - - - - 250 - 16777215 - - - - - - - - &Number of covers to show in browse mode (needs restart): - - - cover_browse - - - - - - - - - - Restriction to apply when the current library is opened: - - - opt_gui_restriction - - - - - - - - 250 - 16777215 - - - - Apply this restriction on calibre startup if the current library is being used. Also applied when switching to this library. Note that this setting is per library. - - - QComboBox::AdjustToMinimumContentsLengthWithIcon - - - 15 - - - - - - - Disable all animations. Useful if you have a slow/old computer. - - - Disable &animations - - - - - - - &Toolbar - - - - - - - - - &Icon size: - - - opt_toolbar_icon_size - - - - - - - - - - Show &text under icons: - - - opt_toolbar_text - - - - - - - - - - &Delete news from library when it is automatically sent to reader - - - - - - - - - Select visible &columns in library view - - - - - - - - true - - - QAbstractItemView::SelectRows - - - - - - - - - ... - - - - :/images/arrow-up.svg:/images/arrow-up.svg - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Remove a user-defined column - - - ... - - - - :/images/minus.svg:/images/minus.svg - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Add a user-defined column - - - ... - - - - :/images/plus.svg:/images/plus.svg - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Edit settings of a user-defined column - - - ... - - - - :/images/edit_input.svg:/images/edit_input.svg - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - :/images/arrow-down.svg:/images/arrow-down.svg - - - - - - - - - - - - - - Use internal &viewer for: - - - - - - true - - - QAbstractItemView::NoSelection - - - - - - - - - - - - Search as you type - - - true - - - - - - - Use &Roman numerals for series - - - true - - - - - - - Enable system &tray icon (needs restart) - - - - - - - Show &average ratings in the tags browser - - - true - - - - - - - Automatically send downloaded &news to ebook reader - - - - - - - Show &splash screen at startup - - - - - - - Show cover &browser in a separate window (needs restart) - - - - - - - Show &notifications in system tray - - - - - - - - - - - - - - - - - QAbstractItemView::SingleSelection - - - QAbstractItemView::SelectRows - - - - - - - - - Add an email address to which to send books - - - &Add email - - - - :/images/plus.svg:/images/plus.svg - - - - 24 - 24 - - - - Qt::ToolButtonTextUnderIcon - - - - - - - Make &default - - - - - - - &Remove email - - - - :/images/minus.svg:/images/minus.svg - - - - 24 - 24 - - - - Qt::ToolButtonTextUnderIcon - - - - - - - - - - - calibre can send your books to you (or your reader) by email. Emails will be automatically sent for downloaded news to all email addresses that have Auto-send checked. - - - true - - - - - - - - - - - - - - - - - - - - - 0 - - - - &Miscellaneous - - - - - - &Maximum number of waiting worker processes (needs restart): - - - opt_worker_limit - - - - - - - 2 - - - 10000 - - - 2 - - - - - - - Limit the max. simultaneous jobs to the available CPU &cores - - - - - - - Qt::Vertical - - - - 20 - 79 - - - - - - - - Debug &device detection - - - - - - - Qt::Vertical - - - - 20 - 80 - - - - - - - - &Check database integrity - - - - - - - Qt::Vertical - - - - 20 - 79 - - - - - - - - Open calibre &configuration directory - - - - - - - Qt::Vertical - - - - 20 - 80 - - - - - - - - &Install command line tools - - - - - - - Qt::Vertical - - - - 20 - 79 - - - - - - - - - &Tweaks - - - - - - Values for the tweaks are shown below. Edit them to change the behavior of calibre - - - true - - - - - - - All available tweaks - - - - - - true - - - - - - - - - - &Current tweaks - - - - - - - - - - - - &Restore to defaults - - - - - - - - - - - - - - - calibre contains a network server that allows you to access your book collection using a browser from anywhere in the world. Any changes to the settings will only take effect after a server restart. - - - true - - - - - - - - - Server &port: - - - port - - - - - - - 65535 - - - 8080 - - - - - - - &Username: - - - username - - - - - - - - - - &Password: - - - password - - - - - - - If you leave the password blank, anyone will be able to access your book collection using the web interface. - - - - - - - The maximum size (widthxheight) for displayed covers. Larger covers are resized. - - - - - - - - - - Max. &cover size: - - - max_cover_size - - - - - - - &Show password - - - - - - - Max. &OPDS items per query: - - - opt_max_opds_items - - - - - - - 10 - - - 10000 - - - - - - - 25 - - - 1000000 - - - - - - - Max. OPDS &ungrouped items: - - - opt_max_opds_ungrouped_items - - - - - - - Restriction (saved search) to apply: - - - - - - - This restriction (based on a saved search) will restrict the books the content server makes available to those matching the search. This setting is per library (i.e. you can have a different restriction per library). - - - QComboBox::AdjustToMinimumContentsLengthWithIcon - - - 20 - - - - - - - - - - - &Start Server - - - - - - - St&op Server - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - &Test Server - - - - - - - - - Run server &automatically on startup - - - - - - - View &server logs - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - <p>Remember to leave calibre running as the server only runs as long as calibre is running. -<p>Stanza should see your calibre collection automatically. If not, try adding the URL http://myhostname:8080 as a new catalog in the Stanza reader on your iPhone. Here myhostname should be the fully qualified hostname or the IP address of the computer calibre is running on. - - - true - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - Here you can customize the behavior of Calibre by controlling what plugins it uses. - - - true - - - - - - - true - - - - 32 - 32 - - - - true - - - true - - - true - - - - - - - - - Enable/&Disable plugin - - - - - - - &Customize plugin - - - - - - - &Remove plugin - - - - - - - - - Add new plugin - - - - - - - - Plugin &file: - - - plugin_path - - - - - - - - - - ... - - - - :/images/document_open.svg:/images/document_open.svg - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - &Add - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - SendEmail - QWidget -
calibre/gui2/wizard/send_email.h
- 1 -
- - AddSave - QTabWidget -
calibre/gui2/dialogs/config/add_save.h
- 1 -
-
- - - - - - buttonBox - accepted() - Dialog - accept() - - - 239 - 558 - - - 157 - 274 - - - - - buttonBox - rejected() - Dialog - reject() - - - 307 - 558 - - - 286 - 274 - - - - -
diff --git a/src/calibre/gui2/dialogs/confirm_delete.py b/src/calibre/gui2/dialogs/confirm_delete.py index 1aabcb7b9e..4e0a259824 100644 --- a/src/calibre/gui2/dialogs/confirm_delete.py +++ b/src/calibre/gui2/dialogs/confirm_delete.py @@ -25,7 +25,7 @@ class Dialog(QDialog, Ui_Dialog): def toggle(self, *args): dynamic[_config_name(self.name)] = self.again.isChecked() -def confirm(msg, name, parent=None, pixmap='dialog_warning.svg'): +def confirm(msg, name, parent=None, pixmap='dialog_warning.png'): if not dynamic.get(_config_name(name), True): return True d = Dialog(msg, name, parent) diff --git a/src/calibre/gui2/dialogs/confirm_delete.ui b/src/calibre/gui2/dialogs/confirm_delete.ui index eee2c9fdfd..c45b180483 100644 --- a/src/calibre/gui2/dialogs/confirm_delete.ui +++ b/src/calibre/gui2/dialogs/confirm_delete.ui @@ -14,7 +14,7 @@ - :/images/dialog_warning.svg:/images/dialog_warning.svg + :/images/dialog_warning.png:/images/dialog_warning.png @@ -22,7 +22,7 @@ - :/images/dialog_warning.svg + :/images/dialog_warning.png diff --git a/src/calibre/gui2/dialogs/conversion_error.ui b/src/calibre/gui2/dialogs/conversion_error.ui index 6521cb8c59..c51c868d1b 100644 --- a/src/calibre/gui2/dialogs/conversion_error.ui +++ b/src/calibre/gui2/dialogs/conversion_error.ui @@ -23,7 +23,7 @@ - :/images/dialog_error.svg + :/images/dialog_error.png diff --git a/src/calibre/gui2/dialogs/fetch_metadata.ui b/src/calibre/gui2/dialogs/fetch_metadata.ui index dab12a1917..03a362096c 100644 --- a/src/calibre/gui2/dialogs/fetch_metadata.ui +++ b/src/calibre/gui2/dialogs/fetch_metadata.ui @@ -18,7 +18,7 @@ - :/images/metadata.svg:/images/metadata.svg + :/images/metadata.png:/images/metadata.png diff --git a/src/calibre/gui2/dialogs/job_view.ui b/src/calibre/gui2/dialogs/job_view.ui index a66fdd482d..8b54c23573 100644 --- a/src/calibre/gui2/dialogs/job_view.ui +++ b/src/calibre/gui2/dialogs/job_view.ui @@ -14,7 +14,7 @@ - :/images/view.svg:/images/view.svg + :/images/view.png:/images/view.png diff --git a/src/calibre/gui2/dialogs/jobs.ui b/src/calibre/gui2/dialogs/jobs.ui index 0fc946f996..5b311bf056 100644 --- a/src/calibre/gui2/dialogs/jobs.ui +++ b/src/calibre/gui2/dialogs/jobs.ui @@ -15,7 +15,7 @@ - :/images/jobs.svg:/images/jobs.svg + :/images/jobs.png:/images/jobs.png diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index 4287ca5c79..0eeee61c7e 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -15,7 +15,7 @@ - :/images/edit_input.svg:/images/edit_input.svg + :/images/edit_input.png:/images/edit_input.png @@ -177,7 +177,7 @@ - :/images/chapters.svg:/images/chapters.svg + :/images/chapters.png:/images/chapters.png diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 3e07422967..3d79b01c14 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -30,7 +30,7 @@ from calibre.ebooks.metadata import MetaInformation from calibre.utils.config import prefs, tweaks from calibre.utils.date import qt_to_dt, local_tz, utcfromtimestamp from calibre.customize.ui import run_plugins_on_import, get_isbndb_key -from calibre.gui2.dialogs.config.social import SocialMetadata +from calibre.gui2.preferences.social import SocialMetadata from calibre.gui2.custom_column_widgets import populate_metadata_page from calibre import strftime @@ -102,7 +102,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): view_format = pyqtSignal(object) def do_reset_cover(self, *args): - pix = QPixmap(I('default_cover.svg')) + pix = QPixmap(I('default_cover.png')) self.cover.setPixmap(pix) self.cover_changed = True self.cover_data = None @@ -144,15 +144,23 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.cover_data = cover def generate_cover(self, *args): - from calibre.utils.magick.draw import create_cover_page, TextLine + from calibre.ebooks import calibre_cover + from calibre.ebooks.metadata import fmt_sidx + from calibre.gui2 import config title = unicode(self.title.text()).strip() author = unicode(self.authors.text()).strip() if not title or not author: return error_dialog(self, _('Specify title and author'), _('You must specify a title and author before generating ' 'a cover'), show=True) - lines = [TextLine(title, 44), TextLine(author, 32)] - self.cover_data = create_cover_page(lines, I('library.png')) + series = unicode(self.series.text()).strip() + series_string = None + if series: + series_string = _('Book %s of %s')%( + fmt_sidx(self.series_index.value(), + use_roman=config['use_roman_numerals_for_series_number']), series) + self.cover_data = calibre_cover(title, author, + series_string=series_string) pix = QPixmap() pix.loadFromData(self.cover_data) self.cover.setPixmap(pix) @@ -432,7 +440,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): if cover: pm.loadFromData(cover) if pm.isNull(): - pm = QPixmap(I('default_cover.svg')) + pm = QPixmap(I('default_cover.png')) else: self.cover_data = cover self.cover.setPixmap(pm) diff --git a/src/calibre/gui2/dialogs/metadata_single.ui b/src/calibre/gui2/dialogs/metadata_single.ui index a943425a89..7184192eba 100644 --- a/src/calibre/gui2/dialogs/metadata_single.ui +++ b/src/calibre/gui2/dialogs/metadata_single.ui @@ -21,7 +21,7 @@ - :/images/edit_input.svg:/images/edit_input.svg + :/images/edit_input.png:/images/edit_input.png true @@ -110,7 +110,7 @@ - :/images/swap.svg:/images/swap.svg + :/images/swap.png:/images/swap.png @@ -165,7 +165,7 @@ - :/images/auto_author_sort.svg:/images/auto_author_sort.svg + :/images/auto_author_sort.png:/images/auto_author_sort.png @@ -248,7 +248,7 @@ - :/images/chapters.svg:/images/chapters.svg + :/images/chapters.png:/images/chapters.png @@ -301,7 +301,7 @@ - :/images/trash.svg:/images/trash.svg + :/images/trash.png:/images/trash.png @@ -478,7 +478,7 @@ - :/images/add_book.svg:/images/add_book.svg + :/images/add_book.png:/images/add_book.png @@ -498,7 +498,7 @@ - :/images/trash.svg:/images/trash.svg + :/images/trash.png:/images/trash.png @@ -518,7 +518,7 @@ - :/images/book.svg:/images/book.svg + :/images/book.png:/images/book.png @@ -538,7 +538,7 @@ - :/images/edit_input.svg:/images/edit_input.svg + :/images/edit_input.png:/images/edit_input.png @@ -619,7 +619,7 @@ - :/images/document_open.svg:/images/document_open.svg + :/images/document_open.png:/images/document_open.png @@ -633,7 +633,7 @@ - :/images/trash.svg:/images/trash.svg + :/images/trash.png:/images/trash.png @@ -646,7 +646,7 @@ - Download &cover + Download co&ver diff --git a/src/calibre/gui2/dialogs/password.ui b/src/calibre/gui2/dialogs/password.ui index 811e042153..f5ac6600e7 100644 --- a/src/calibre/gui2/dialogs/password.ui +++ b/src/calibre/gui2/dialogs/password.ui @@ -15,7 +15,7 @@ - :/images/mimetypes/unknown.svg:/images/mimetypes/unknown.svg + :/images/mimetypes/unknown.png:/images/mimetypes/unknown.png diff --git a/src/calibre/gui2/dialogs/progress.ui b/src/calibre/gui2/dialogs/progress.ui index 451b9dfb59..4fa859eaba 100644 --- a/src/calibre/gui2/dialogs/progress.ui +++ b/src/calibre/gui2/dialogs/progress.ui @@ -14,7 +14,7 @@ - :/images/jobs.svg:/images/jobs.svg + :/images/jobs.png:/images/jobs.png diff --git a/src/calibre/gui2/dialogs/saved_search_editor.ui b/src/calibre/gui2/dialogs/saved_search_editor.ui index 6d98d25667..3ba37bdf10 100644 --- a/src/calibre/gui2/dialogs/saved_search_editor.ui +++ b/src/calibre/gui2/dialogs/saved_search_editor.ui @@ -15,7 +15,7 @@ - :/images/chapters.svg:/images/chapters.svg + :/images/chapters.png:/images/chapters.png @@ -90,7 +90,7 @@ - :/images/minus.svg:/images/minus.svg + :/images/minus.png:/images/minus.png @@ -130,7 +130,7 @@ - :/images/plus.svg:/images/plus.svg + :/images/plus.png:/images/plus.png diff --git a/src/calibre/gui2/dialogs/scheduler.py b/src/calibre/gui2/dialogs/scheduler.py index 3dbf7ffffd..fd8184933f 100644 --- a/src/calibre/gui2/dialogs/scheduler.py +++ b/src/calibre/gui2/dialogs/scheduler.py @@ -216,11 +216,11 @@ class Scheduler(QObject): self.download_queue = set([]) self.news_menu = QMenu() - self.news_icon = QIcon(I('news.svg')) - self.scheduler_action = QAction(QIcon(I('scheduler.svg')), _('Schedule news download'), self) + self.news_icon = QIcon(I('news.png')) + self.scheduler_action = QAction(QIcon(I('scheduler.png')), _('Schedule news download'), self) self.news_menu.addAction(self.scheduler_action) self.connect(self.scheduler_action, SIGNAL('triggered(bool)'), self.show_dialog) - self.cac = QAction(QIcon(I('user_profile.svg')), _('Add a custom news source'), self) + self.cac = QAction(QIcon(I('user_profile.png')), _('Add a custom news source'), self) self.connect(self.cac, SIGNAL('triggered(bool)'), self.customize_feeds) self.news_menu.addAction(self.cac) self.news_menu.addSeparator() diff --git a/src/calibre/gui2/dialogs/scheduler.ui b/src/calibre/gui2/dialogs/scheduler.ui index bcfa82e56a..8e6ab37162 100644 --- a/src/calibre/gui2/dialogs/scheduler.ui +++ b/src/calibre/gui2/dialogs/scheduler.ui @@ -15,7 +15,7 @@ - :/images/scheduler.svg:/images/scheduler.svg + :/images/scheduler.png:/images/scheduler.png diff --git a/src/calibre/gui2/dialogs/search.ui b/src/calibre/gui2/dialogs/search.ui index dc66aae6a9..9e8817b1f4 100644 --- a/src/calibre/gui2/dialogs/search.ui +++ b/src/calibre/gui2/dialogs/search.ui @@ -14,7 +14,7 @@ - :/images/search.svg:/images/search.svg + :/images/search.png:/images/search.png diff --git a/src/calibre/gui2/dialogs/tag_categories.py b/src/calibre/gui2/dialogs/tag_categories.py index e3f1c17f3c..679a5c9da9 100644 --- a/src/calibre/gui2/dialogs/tag_categories.py +++ b/src/calibre/gui2/dialogs/tag_categories.py @@ -36,11 +36,11 @@ class TagCategories(QDialog, Ui_TagCategories): self.db = db self.applied_items = [] - cc_icon = QIcon(I('column.svg')) + cc_icon = QIcon(I('column.png')) self.category_labels = self.category_labels_orig[:] - category_icons = [None, QIcon(I('user_profile.svg')), QIcon(I('series.svg')), - QIcon(I('publisher.png')), QIcon(I('tags.svg'))] + category_icons = [None, QIcon(I('user_profile.png')), QIcon(I('series.png')), + QIcon(I('publisher.png')), QIcon(I('tags.png'))] category_values = [None, lambda: [n.replace('|', ',') for (id, n) in self.db.all_authors()], lambda: [n for (id, n) in self.db.all_series()], diff --git a/src/calibre/gui2/dialogs/tag_categories.ui b/src/calibre/gui2/dialogs/tag_categories.ui index d280d5061a..a9319cc5f5 100644 --- a/src/calibre/gui2/dialogs/tag_categories.ui +++ b/src/calibre/gui2/dialogs/tag_categories.ui @@ -15,7 +15,7 @@ - :/images/chapters.svg:/images/chapters.svg + :/images/chapters.png:/images/chapters.png @@ -91,7 +91,7 @@ - :/images/forward.svg:/images/forward.svg + :/images/forward.png:/images/forward.png @@ -176,7 +176,7 @@ - :/images/list_remove.svg:/images/list_remove.svg + :/images/list_remove.png:/images/list_remove.png @@ -267,7 +267,7 @@ - :/images/minus.svg:/images/minus.svg + :/images/minus.png:/images/minus.png @@ -307,7 +307,7 @@ - :/images/plus.svg:/images/plus.svg + :/images/plus.png:/images/plus.png diff --git a/src/calibre/gui2/dialogs/tag_editor.ui b/src/calibre/gui2/dialogs/tag_editor.ui index 1db1abb1d3..c418b3ac87 100644 --- a/src/calibre/gui2/dialogs/tag_editor.ui +++ b/src/calibre/gui2/dialogs/tag_editor.ui @@ -15,7 +15,7 @@ - :/images/chapters.svg:/images/chapters.svg + :/images/chapters.png:/images/chapters.png @@ -59,7 +59,7 @@ - :/images/trash.svg:/images/trash.svg + :/images/trash.png:/images/trash.png @@ -105,7 +105,7 @@ - :/images/forward.svg:/images/forward.svg + :/images/forward.png:/images/forward.png @@ -190,7 +190,7 @@ - :/images/list_remove.svg:/images/list_remove.svg + :/images/list_remove.png:/images/list_remove.png @@ -251,7 +251,7 @@ - :/images/plus.svg:/images/plus.svg + :/images/plus.png:/images/plus.png diff --git a/src/calibre/gui2/dialogs/tag_list_editor.ui b/src/calibre/gui2/dialogs/tag_list_editor.ui index 39076aa1f6..9c8231dd91 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.ui +++ b/src/calibre/gui2/dialogs/tag_list_editor.ui @@ -15,7 +15,7 @@ - :/images/chapters.svg:/images/chapters.svg + :/images/chapters.png:/images/chapters.png @@ -61,7 +61,7 @@ - :/images/trash.svg:/images/trash.svg + :/images/trash.png:/images/trash.png @@ -81,7 +81,7 @@ - :/images/edit_input.svg:/images/edit_input.svg + :/images/edit_input.png:/images/edit_input.png diff --git a/src/calibre/gui2/dialogs/test_email.ui b/src/calibre/gui2/dialogs/test_email.ui index 241468793f..bdfc53681f 100644 --- a/src/calibre/gui2/dialogs/test_email.ui +++ b/src/calibre/gui2/dialogs/test_email.ui @@ -15,7 +15,7 @@ - :/images/config.svg:/images/config.svg + :/images/config.png:/images/config.png diff --git a/src/calibre/gui2/dialogs/user_profiles.ui b/src/calibre/gui2/dialogs/user_profiles.ui index 48f92a108c..4eca4045b1 100644 --- a/src/calibre/gui2/dialogs/user_profiles.ui +++ b/src/calibre/gui2/dialogs/user_profiles.ui @@ -15,7 +15,7 @@ - :/images/user_profile.svg:/images/user_profile.svg + :/images/user_profile.png:/images/user_profile.png @@ -76,7 +76,7 @@ - :/images/plus.svg:/images/plus.svg + :/images/plus.png:/images/plus.png @@ -87,7 +87,7 @@ - :/images/list_remove.svg:/images/list_remove.svg + :/images/list_remove.png:/images/list_remove.png @@ -98,7 +98,7 @@ - :/images/forward.svg:/images/forward.svg + :/images/forward.png:/images/forward.png @@ -109,7 +109,7 @@ - :/images/news.svg:/images/news.svg + :/images/news.png:/images/news.png @@ -120,7 +120,7 @@ - :/images/chapters.svg:/images/chapters.svg + :/images/chapters.png:/images/chapters.png @@ -285,7 +285,7 @@ p, li { white-space: pre-wrap; } - :/images/arrow-up.svg:/images/arrow-up.svg + :/images/arrow-up.png:/images/arrow-up.png @@ -299,7 +299,7 @@ p, li { white-space: pre-wrap; } - :/images/list_remove.svg:/images/list_remove.svg + :/images/list_remove.png:/images/list_remove.png @@ -310,7 +310,7 @@ p, li { white-space: pre-wrap; } - :/images/arrow-down.svg:/images/arrow-down.svg + :/images/arrow-down.png:/images/arrow-down.png @@ -361,7 +361,7 @@ p, li { white-space: pre-wrap; } - :/images/plus.svg:/images/plus.svg + :/images/plus.png:/images/plus.png diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index c983e111d4..223efcf95b 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -32,6 +32,9 @@ class LibraryViewMixin(object): # {{{ def __init__(self, db): self.library_view.files_dropped.connect(self.iactions['Add Books'].files_dropped, type=Qt.QueuedConnection) + self.library_view.add_column_signal.connect(partial(self.iactions['Preferences'].do_config, + initial_plugin=('Interface', 'Custom Columns')), + type=Qt.QueuedConnection) for func, args in [ ('connect_to_search_box', (self.search, self.search_done)), @@ -95,7 +98,7 @@ class LibraryWidget(Splitter): # {{{ idx = 0 if orientation == Qt.Vertical else 1 size = 300 if orientation == Qt.Vertical else 550 Splitter.__init__(self, 'cover_browser_splitter', _('Cover Browser'), - I('cover_flow.svg'), + I('cover_flow.png'), orientation=orientation, parent=parent, connect_button=not config['separate_cover_flow'], side_index=idx, initial_side_size=size, initial_show=False, @@ -113,7 +116,7 @@ class Stack(QStackedWidget): # {{{ parent.cb_splitter = LibraryWidget(parent) self.tb_widget = TagBrowserWidget(parent) parent.tb_splitter = Splitter('tag_browser_splitter', - _('Tag Browser'), I('tags.svg'), + _('Tag Browser'), I('tags.png'), parent=parent, side_index=0, initial_side_size=200, shortcut=_('Shift+Alt+T')) parent.tb_splitter.addWidget(self.tb_widget) @@ -145,20 +148,23 @@ class StatusBar(QStatusBar): # {{{ self._font = QFont() self._font.setBold(True) self.setFont(self._font) + self.defmsg = QLabel(self.default_message) + self.defmsg.setFont(self._font) + self.addWidget(self.defmsg) def initialize(self, systray=None): self.systray = systray self.notifier = get_notifier(systray) - self.messageChanged.connect(self.message_changed, - type=Qt.QueuedConnection) - self.message_changed('') def device_connected(self, devname): self.device_string = _('Connected ') + devname + self.defmsg.setText(self.default_message + ' ..::.. ' + + self.device_string) self.clearMessage() def device_disconnected(self): self.device_string = '' + self.defmsg.setText(self.default_message) self.clearMessage() def new_version_available(self, ver, url): @@ -188,15 +194,6 @@ class StatusBar(QStatusBar): # {{{ def clear_message(self): self.clearMessage() - def message_changed(self, msg): - if not msg or msg.isEmpty() or msg.isNull() or \ - not unicode(msg).strip(): - extra = '' - if self.device_string: - extra = ' ..::.. ' + self.device_string - self.showMessage(self.default_message + extra) - - # }}} class LayoutMixin(object): # {{{ @@ -207,7 +204,7 @@ class LayoutMixin(object): # {{{ self.book_details = BookDetails(False, self) self.stack = Stack(self) self.bd_splitter = Splitter('book_details_splitter', - _('Book Details'), I('book.svg'), + _('Book Details'), I('book.png'), orientation=Qt.Vertical, parent=self, side_index=1, shortcut=_('Alt+D')) self.bd_splitter.addWidget(self.stack) @@ -217,7 +214,7 @@ class LayoutMixin(object): # {{{ # }}} else: # wide {{{ self.bd_splitter = Splitter('book_details_splitter', - _('Book Details'), I('book.svg'), initial_side_size=200, + _('Book Details'), I('book.png'), initial_side_size=200, orientation=Qt.Horizontal, parent=self, side_index=1, shortcut=_('Shift+Alt+D')) self.stack = Stack(self) @@ -258,7 +255,9 @@ class LayoutMixin(object): # {{{ getattr(self, x+'_view').save_state() for x in ('cb', 'tb', 'bd'): - getattr(self, x+'_splitter').save_state() + s = getattr(self, x+'_splitter') + s.update_desired_state() + s.save_state() def read_layout_settings(self): # View states are restored automatically when set_database is called diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index fd23234c8a..8a63b6fac5 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -33,10 +33,10 @@ class JobManager(QAbstractTableModel): def __init__(self): QAbstractTableModel.__init__(self) - self.wait_icon = QVariant(QIcon(I('jobs.svg'))) - self.running_icon = QVariant(QIcon(I('exec.svg'))) - self.error_icon = QVariant(QIcon(I('dialog_error.svg'))) - self.done_icon = QVariant(QIcon(I('ok.svg'))) + self.wait_icon = QVariant(QIcon(I('jobs.png'))) + self.running_icon = QVariant(QIcon(I('exec.png'))) + self.error_icon = QVariant(QIcon(I('dialog_error.png'))) + self.done_icon = QVariant(QIcon(I('ok.png'))) self.jobs = [] self.add_job = Dispatcher(self._add_job) diff --git a/src/calibre/gui2/layout.py b/src/calibre/gui2/layout.py index 4eccf597c2..58d5267c8e 100644 --- a/src/calibre/gui2/layout.py +++ b/src/calibre/gui2/layout.py @@ -50,7 +50,7 @@ class LocationManager(QObject): # {{{ a = m.addAction(icon, tooltip) a.triggered.connect(receiver) self._mem.append(a) - a = m.addAction(QIcon(I('eject.svg')), _('Eject this device')) + a = m.addAction(QIcon(I('eject.png')), _('Eject this device')) a.triggered.connect(self._eject_requested) ac.setMenu(m) self._mem.append(a) @@ -61,11 +61,11 @@ class LocationManager(QObject): # {{{ ac('library', _('Library'), 'lt.png', _('Show books in calibre library')) - ac('main', _('Reader'), 'reader.svg', + ac('main', _('Reader'), 'reader.png', _('Show books in the main memory of the device')) - ac('carda', _('Card A'), 'sd.svg', + ac('carda', _('Card A'), 'sd.png', _('Show books in storage card A')) - ac('cardb', _('Card B'), 'sd.svg', + ac('cardb', _('Card B'), 'sd.png', _('Show books in storage card B')) def _location_selected(self, location, *args): @@ -80,7 +80,7 @@ class LocationManager(QObject): # {{{ def update_devices(self, cp=(None, None), fs=[-1, -1, -1], icon=None): if icon is None: - icon = I('reader.svg') + icon = I('reader.png') self.location_main.setIcon(QIcon(icon)) had_device = self.has_device if cp is None: @@ -148,7 +148,7 @@ class SearchBar(QWidget): # {{{ x.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) parent.advanced_search_button = x = QToolButton(self) - x.setIcon(QIcon(I('search.svg'))) + x.setIcon(QIcon(I('search.png'))) l.addWidget(x) x.setToolTip(_("Advanced search")) @@ -163,7 +163,7 @@ class SearchBar(QWidget): # {{{ l.addWidget(x) x = parent.clear_button = QToolButton(self) - x.setIcon(QIcon(I('clear_left.svg'))) + x.setIcon(QIcon(I('clear_left.png'))) x.setObjectName("clear_button") l.addWidget(x) x.setToolTip(_("Reset Quick Search")) @@ -175,19 +175,19 @@ class SearchBar(QWidget): # {{{ l.addWidget(x) x = parent.copy_search_button = QToolButton(self) - x.setIcon(QIcon(I("search_copy_saved.svg"))) + x.setIcon(QIcon(I("search_copy_saved.png"))) x.setObjectName("copy_search_button") l.addWidget(x) x.setToolTip(_("Copy current search text (instead of search name)")) x = parent.save_search_button = QToolButton(self) - x.setIcon(QIcon(I("search_add_saved.svg"))) + x.setIcon(QIcon(I("search_add_saved.png"))) x.setObjectName("save_search_button") l.addWidget(x) x.setToolTip(_("Save current search under the name shown in the box")) x = parent.delete_search_button = QToolButton(self) - x.setIcon(QIcon(I("search_delete_saved.svg"))) + x.setIcon(QIcon(I("search_delete_saved.png"))) x.setObjectName("delete_search_button") l.addWidget(x) x.setToolTip(_("Delete current saved search")) @@ -215,6 +215,7 @@ class ToolBar(QToolBar): # {{{ self.location_manager.locations_changed.connect(self.build_bar) donate.setAutoRaise(True) donate.setCursor(Qt.PointingHandCursor) + self.added_actions = [] self.build_bar() self.preferred_width = self.sizeHint().width() @@ -237,7 +238,13 @@ class ToolBar(QToolBar): # {{{ actions = '-device' if showing_device else '' actions = gprefs['action-layout-toolbar'+actions] + for ac in self.added_actions: + m = ac.menu() + if m is not None: + m.setVisible(False) + self.clear() + self.added_actions = [] for what in actions: if what is None: @@ -245,6 +252,7 @@ class ToolBar(QToolBar): # {{{ elif what == 'Location Manager': for ac in self.location_manager.available_actions: self.addAction(ac) + self.added_actions.append(ac) self.setup_tool_button(ac, QToolButton.MenuButtonPopup) elif what == 'Donate': self.d_widget = QWidget() @@ -255,6 +263,7 @@ class ToolBar(QToolBar): # {{{ elif what in self.gui.iactions: action = self.gui.iactions[what] self.addAction(action.qaction) + self.added_actions.append(action.qaction) self.setup_tool_button(action.qaction, action.popup_type) def setup_tool_button(self, ac, menu_mode=None): diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index d98d9a240b..bf233b1175 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -282,7 +282,7 @@ class CcBoolDelegate(QStyledItemDelegate): # {{{ def createEditor(self, parent, option, index): editor = QComboBox(parent) items = [_('Y'), _('N'), ' '] - icons = [I('ok.svg'), I('list_remove.svg'), I('blank.svg')] + icons = [I('ok.png'), I('list_remove.png'), I('blank.png')] if tweaks['bool_custom_columns_are_tristate'] == 'no': items = items[:-1] icons = icons[:-1] diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 89008735fe..bb47508531 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -49,7 +49,7 @@ _default_image = None def default_image(): global _default_image if _default_image is None: - _default_image = QImage(I('default_cover.svg')) + _default_image = QImage(I('default_cover.png')) return _default_image class BooksModel(QAbstractTableModel): # {{{ @@ -89,9 +89,9 @@ class BooksModel(QAbstractTableModel): # {{{ self.alignment_map = {} self.buffer_size = buffer self.cover_cache = None - self.bool_yes_icon = QIcon(I('ok.svg')) - self.bool_no_icon = QIcon(I('list_remove.svg')) - self.bool_blank_icon = QIcon(I('blank.svg')) + self.bool_yes_icon = QIcon(I('ok.png')) + self.bool_no_icon = QIcon(I('list_remove.png')) + self.bool_blank_icon = QIcon(I('blank.png')) self.device_connected = False self.read_config() @@ -121,10 +121,11 @@ class BooksModel(QAbstractTableModel): # {{{ def set_device_connected(self, is_connected): self.device_connected = is_connected self.db.refresh_ondevice() + self.refresh() + self.research() if is_connected and self.sorted_on[0] == 'ondevice': self.resort() - def set_book_on_device_func(self, func): self.book_on_device = func @@ -236,8 +237,8 @@ class BooksModel(QAbstractTableModel): # {{{ def search(self, text, reset=True): try: self.db.search(text) - except ParseException: - self.searched.emit(False) + except ParseException as e: + self.searched.emit(e.msg) return self.last_search = text if reset: diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index 966180467c..d67d286aeb 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -9,7 +9,7 @@ import os from functools import partial from PyQt4.Qt import QTableView, Qt, QAbstractItemView, QMenu, pyqtSignal, \ - QModelIndex + QModelIndex, QIcon from calibre.gui2.library.delegates import RatingDelegate, PubDateDelegate, \ TextDelegate, DateDelegate, TagsDelegate, CcTextDelegate, \ @@ -23,6 +23,7 @@ from calibre.gui2.library import DEFAULT_SORT class BooksView(QTableView): # {{{ files_dropped = pyqtSignal(object) + add_column_signal = pyqtSignal() def __init__(self, parent, modelcls=BooksModel): QTableView.__init__(self, parent) @@ -54,6 +55,7 @@ class BooksView(QTableView): # {{{ self.selectionModel().currentRowChanged.connect(self._model.current_changed) # {{{ Column Header setup + self.can_add_columns = True self.was_restored = False self.column_header = self.horizontalHeader() self.column_header.setMovable(True) @@ -93,6 +95,8 @@ class BooksView(QTableView): # {{{ self.sortByColumn(idx, Qt.DescendingOrder) elif action == 'defaults': self.apply_state(self.get_default_state()) + elif action == 'addcustcol': + self.add_column_signal.emit() elif action.startswith('align_'): alignment = action.partition('_')[-1] self._model.change_alignment(column, alignment) @@ -166,6 +170,13 @@ class BooksView(QTableView): # {{{ partial(self.column_header_context_handler, action='defaults', column=col)) + if self.can_add_columns: + self.column_header_context_menu.addAction( + QIcon(I('column.png')), + _('Add your own columns'), + partial(self.column_header_context_handler, + action='addcustcol', column=col)) + self.column_header_context_menu.popup(self.column_header.mapToGlobal(pos)) # }}} @@ -494,6 +505,7 @@ class DeviceBooksView(BooksView): # {{{ def __init__(self, parent): BooksView.__init__(self, parent, DeviceBooksModel) + self.can_add_columns = False self.columns_resized = False self.resize_on_select = False self.rating_delegate = None diff --git a/src/calibre/gui2/lrf_renderer/config.ui b/src/calibre/gui2/lrf_renderer/config.ui index 448ee2f9a0..9145b4b29f 100644 --- a/src/calibre/gui2/lrf_renderer/config.ui +++ b/src/calibre/gui2/lrf_renderer/config.ui @@ -15,7 +15,7 @@ - :/images/config.svg:/images/config.svg + :/images/config.png:/images/config.png diff --git a/src/calibre/gui2/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py index 87ec55e114..8ddda175fa 100644 --- a/src/calibre/gui2/lrf_renderer/main.py +++ b/src/calibre/gui2/lrf_renderer/main.py @@ -310,7 +310,7 @@ def main(args=sys.argv, logger=None): pid = os.fork() if (islinux or isfreebsd) else -1 if pid <= 0: app = Application(args) - app.setWindowIcon(QIcon(I('viewer.svg'))) + app.setWindowIcon(QIcon(I('viewer.png'))) QCoreApplication.setOrganizationName(ORG_NAME) QCoreApplication.setApplicationName(APP_UID) opts = normalize_settings(parser, opts) diff --git a/src/calibre/gui2/lrf_renderer/main.ui b/src/calibre/gui2/lrf_renderer/main.ui index 2eeb400cc4..0e7b54edb8 100644 --- a/src/calibre/gui2/lrf_renderer/main.ui +++ b/src/calibre/gui2/lrf_renderer/main.ui @@ -20,7 +20,7 @@ - :/images/viewer.svg:/images/viewer.svg + :/images/viewer.png:/images/viewer.png @@ -174,7 +174,7 @@ - :/images/next.svg:/images/next.svg + :/images/next.png:/images/next.png Next Page @@ -183,7 +183,7 @@ - :/images/previous.svg:/images/previous.svg + :/images/previous.png:/images/previous.png Previous Page @@ -192,7 +192,7 @@ - :/images/back.svg:/images/back.svg + :/images/back.png:/images/back.png Back @@ -201,7 +201,7 @@ - :/images/forward.svg:/images/forward.svg + :/images/forward.png:/images/forward.png Forward @@ -215,7 +215,7 @@ - :/images/document_open.svg:/images/document_open.svg + :/images/document_open.png:/images/document_open.png Open ebook @@ -224,7 +224,7 @@ - :/images/config.svg:/images/config.svg + :/images/config.png:/images/config.png Configure diff --git a/src/calibre/gui2/main_window.py b/src/calibre/gui2/main_window.py index 2779a18733..a2221acd3a 100644 --- a/src/calibre/gui2/main_window.py +++ b/src/calibre/gui2/main_window.py @@ -58,8 +58,8 @@ class MainWindow(QMainWindow): @classmethod def get_menubar_actions(cls): - preferences_action = QAction(QIcon(I('config.svg')), _('&Preferences'), None) - quit_action = QAction(QIcon(I('window-close.svg')), _('&Quit'), None) + preferences_action = QAction(QIcon(I('config.png')), _('&Preferences'), None) + quit_action = QAction(QIcon(I('window-close.png')), _('&Quit'), None) preferences_action.setMenuRole(QAction.PreferencesRole) quit_action.setMenuRole(QAction.QuitRole) return preferences_action, quit_action diff --git a/src/calibre/gui2/preferences/__init__.py b/src/calibre/gui2/preferences/__init__.py index 3baba75609..7267716ea8 100644 --- a/src/calibre/gui2/preferences/__init__.py +++ b/src/calibre/gui2/preferences/__init__.py @@ -5,60 +5,131 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' +import textwrap + from PyQt4.Qt import QWidget, pyqtSignal, QCheckBox, QAbstractSpinBox, \ QLineEdit, QComboBox, QVariant from calibre.customize.ui import preferences_plugins +from calibre.utils.config import ConfigProxy + +class AbortCommit(Exception): + pass class ConfigWidgetInterface(object): + ''' + This class defines the interface that all widgets displayed in the + Preferences dialog must implement. See :class:`ConfigWidgetBase` for + a base class that implements this interface and defines various conveninece + methods as well. + ''' + + #: This signal must be emitted whenever the user changes a value in this + #: widget changed_signal = None + #: Set to True iff the :meth:`restore_to_defaults` method is implemented. + supports_restoring_to_defaults = True + + #: The tooltip for the Restore to defaults button + restore_defaults_desc = _('Restore settings to default values. ' + 'You have to click Apply to actually save the default settings.') + + #: If True the Preferences dialog will not allow the user to set any more + #: preferences. Only has effect if :meth:`commit` returns True. + restart_critical = False + def genesis(self, gui): + ''' + Called once before the widget is displayed, should perform any + necessary setup. + + :param gui: The main calibre graphical user interface + ''' + raise NotImplementedError() + + def initialize(self): + ''' + Should set all config values to their initial values (the values + stored in the config files). + ''' raise NotImplementedError() def restore_defaults(self): + ''' + Should set all config values to their defaults. + ''' pass def commit(self): + ''' + Save any changed settings. Return True if the changes require a + restart, False otherwise. Raise an :class:`AbortCommit` exception + to indicate that an error occurred. You are responsible for giving the + user feedback about what the error is and how to correct it. + ''' + return False + + def refresh_gui(self, gui): + ''' + Called once after this widget is committed. Responsible for causing the + gui to reread any changed settings. Note that by default the GUI + re-initializes various elements anyway, so most widgets won't need to + use this method. + ''' pass class Setting(object): def __init__(self, name, config_obj, widget, gui_name=None, - empty_string_is_None=True, choices=None): + empty_string_is_None=True, choices=None, restart_required=False): self.name, self.gui_name = name, gui_name self.empty_string_is_None = empty_string_is_None + self.restart_required = restart_required self.choices = choices if gui_name is None: self.gui_name = 'opt_'+name self.config_obj = config_obj self.gui_obj = getattr(widget, self.gui_name) + self.widget = widget if isinstance(self.gui_obj, QCheckBox): self.datatype = 'bool' - self.gui_obj.stateChanged.connect(lambda x: - widget.changed_signal.emit()) + self.gui_obj.stateChanged.connect(self.changed) elif isinstance(self.gui_obj, QAbstractSpinBox): self.datatype = 'number' - self.gui_obj.valueChanged.connect(lambda x: - widget.changed_signal.emit()) + self.gui_obj.valueChanged.connect(self.changed) elif isinstance(self.gui_obj, QLineEdit): self.datatype = 'string' - self.gui_obj.textChanged.connect(lambda x: - widget.changed_signal.emit()) + self.gui_obj.textChanged.connect(self.changed) elif isinstance(self.gui_obj, QComboBox): self.datatype = 'choice' - self.gui_obj.editTextChanged.connect(lambda x: - widget.changed_signal.emit()) - self.gui_obj.currentIndexChanged.connect(lambda x: - widget.changed_signal.emit()) + self.gui_obj.editTextChanged.connect(self.changed) + self.gui_obj.currentIndexChanged.connect(self.changed) else: raise ValueError('Unknown data type') + if isinstance(self.config_obj, ConfigProxy) and \ + not unicode(self.gui_obj.toolTip()): + h = self.config_obj.help(self.name) + if h: + self.gui_obj.setToolTip(h) + tt = unicode(self.gui_obj.toolTip()) + if tt: + if not unicode(self.gui_obj.whatsThis()): + self.gui_obj.setWhatsThis(tt) + if not unicode(self.gui_obj.statusTip()): + self.gui_obj.setStatusTip(tt) + tt = '\n'.join(textwrap.wrap(tt, 70)) + self.gui_obj.setToolTip(tt) + + def changed(self, *args): + self.widget.changed_signal.emit() + def initialize(self): self.gui_obj.blockSignals(True) - if self.datatype == 'choices': + if self.datatype == 'choice': self.gui_obj.clear() for x in self.choices: if isinstance(x, basestring): @@ -66,9 +137,15 @@ class Setting(object): self.gui_obj.addItem(x[0], QVariant(x[1])) self.set_gui_val(self.get_config_val(default=False)) self.gui_obj.blockSignals(False) + self.initial_value = self.get_gui_val() def commit(self): - self.set_config_val(self.get_gui_val()) + val = self.get_gui_val() + oldval = self.get_config_val() + changed = val != oldval + if changed: + self.set_config_val(self.get_gui_val()) + return changed and self.restart_required def restore_defaults(self): self.set_gui_val(self.get_config_val(default=True)) @@ -90,7 +167,7 @@ class Setting(object): self.gui_obj.setValue(val) elif self.datatype == 'string': self.gui_obj.setText(val if val else '') - elif self.datatype == 'choices': + elif self.datatype == 'choice': idx = self.gui_obj.findData(QVariant(val)) if idx == -1: idx = 0 @@ -100,21 +177,52 @@ class Setting(object): if self.datatype == 'bool': val = bool(self.gui_obj.isChecked()) elif self.datatype == 'number': - val = self.gui_obj.value(val) + val = self.gui_obj.value() elif self.datatype == 'string': - val = unicode(self.gui_name.text()).strip() + val = unicode(self.gui_obj.text()).strip() if self.empty_string_is_None and not val: val = None - elif self.datatype == 'choices': + elif self.datatype == 'choice': idx = self.gui_obj.currentIndex() if idx < 0: idx = 0 val = unicode(self.gui_obj.itemData(idx).toString()) return val +class CommaSeparatedList(Setting): + + def set_gui_val(self, val): + x = '' + if val: + x = u', '.join(val) + self.gui_obj.setText(x) + + def get_gui_val(self): + val = unicode(self.gui_obj.text()).strip() + ans = [] + if val: + ans = [x.strip() for x in val.split(',')] + ans = [x for x in ans if x] + return ans class ConfigWidgetBase(QWidget, ConfigWidgetInterface): + ''' + Base class that contains code to easily add standard config widgets like + checkboxes, combo boxes, text fields and so on. See the :meth:`register` + method. + + This class automatically handles change notification, resetting to default, + translation between gui objects and config objects, etc. for registered + settings. + + If your config widget inherits from this class but includes setting that + are not registered, you should override the :class:`ConfigWidgetInterface` methods + and call the base class methods inside the overrides. + ''' + changed_signal = pyqtSignal() + supports_restoring_to_defaults = True + restart_critical = False def __init__(self, parent=None): QWidget.__init__(self, parent) @@ -122,10 +230,27 @@ class ConfigWidgetBase(QWidget, ConfigWidgetInterface): self.setupUi(self) self.settings = {} - def register(self, name, config_obj, gui_name=None, choices=None, setting=Setting): + def register(self, name, config_obj, gui_name=None, choices=None, + restart_required=False, empty_string_is_None=True, setting=Setting): + ''' + Register a setting. + + :param name: The setting name + :param config: The config object that reads/writes the setting + :param gui_name: The name of the GUI object that presents an interface + to change the setting. By default it is assumed to be + ``'opt_' + name``. + :param choices: If this setting is a multiple choice (combobox) based + setting, the list of choices. The list is a list of two + element tuples of the form: ``[(gui name, value), ...]`` + :param setting: The class responsible for managing this setting. The + default class handles almost all cases, so this param + is rarely used. + ''' setting = setting(name, config_obj, self, gui_name=gui_name, - choices=choices) - self.register_setting(setting) + choices=choices, restart_required=restart_required, + empty_string_is_None=empty_string_is_None) + return self.register_setting(setting) def register_setting(self, setting): self.settings[setting.name] = setting @@ -135,16 +260,19 @@ class ConfigWidgetBase(QWidget, ConfigWidgetInterface): for setting in self.settings.values(): setting.initialize() - def commit(self): + def commit(self, *args): + restart_required = False for setting in self.settings.values(): - setting.commit() + rr = setting.commit() + if rr: + restart_required = True + return restart_required def restore_defaults(self, *args): for setting in self.settings.values(): setting.restore_defaults() - def get_plugin(category, name): for plugin in preferences_plugins(): if plugin.category == category and plugin.name == name: @@ -153,35 +281,74 @@ def get_plugin(category, name): 'No Preferences Plugin with category: %s and name: %s found' % (category, name)) -def test_widget(category, name, gui=None): # {{{ +# Testing {{{ + +def init_gui(): + from calibre.gui2.ui import Main + from calibre.gui2.main import option_parser + from calibre.library import db + parser = option_parser() + opts, args = parser.parse_args([]) + actions = tuple(Main.create_application_menubar()) + db = db() + gui = Main(opts) + gui.initialize(db.library_path, db, None, actions, show_gui=False) + return gui + +def test_widget(category, name, gui=None): from PyQt4.Qt import QDialog, QVBoxLayout, QDialogButtonBox + class Dialog(QDialog): + def set_widget(self, w): self.w = w + def accept(self): + try: + self.restart_required = self.w.commit() + except AbortCommit: + return + QDialog.accept(self) + pl = get_plugin(category, name) - d = QDialog() + d = Dialog() d.resize(750, 550) + d.setWindowTitle(category + " - " + name) bb = QDialogButtonBox(d) bb.setStandardButtons(bb.Apply|bb.Cancel|bb.RestoreDefaults) bb.accepted.connect(d.accept) bb.rejected.connect(d.reject) w = pl.create_widget(d) + d.set_widget(w) bb.button(bb.RestoreDefaults).clicked.connect(w.restore_defaults) + bb.button(bb.RestoreDefaults).setEnabled(w.supports_restoring_to_defaults) bb.button(bb.Apply).setEnabled(False) - w.changed_signal.connect(lambda : bb.button(bb.Apply).setEnable(True)) + bb.button(bb.Apply).clicked.connect(d.accept) + w.changed_signal.connect(lambda : bb.button(bb.Apply).setEnabled(True)) l = QVBoxLayout() d.setLayout(l) l.addWidget(w) l.addWidget(bb) + mygui = gui is None if gui is None: - from calibre.gui2.ui import Main - from calibre.gui2.main import option_parser - from calibre.library import db - parser = option_parser() - opts, args = parser.parse_args([]) - actions = tuple(Main.create_application_menubar()) - db = db() - gui = Main(opts) - gui.initialize(db.library_path, db, None, actions, show_gui=False) + gui = init_gui() + mygui = True w.genesis(gui) - if d.exec_() == QDialog.Accepted: - w.commit() + w.initialize() + d.exec_() + if getattr(d, 'restart_required', False): + from calibre.gui2 import warning_dialog + warning_dialog(gui, 'Restart required', 'Restart required', show=True) + if mygui: + gui.shutdown() + +def test_all(): + from PyQt4.Qt import QApplication + app = QApplication([]) + app + gui = init_gui() + for plugin in preferences_plugins(): + test_widget(plugin.category, plugin.name, gui=gui) + gui.shutdown() + +if __name__ == '__main__': + test_all() # }}} + diff --git a/src/calibre/gui2/preferences/adding.py b/src/calibre/gui2/preferences/adding.py new file mode 100644 index 0000000000..7a27ed8f2d --- /dev/null +++ b/src/calibre/gui2/preferences/adding.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + + + +from calibre.gui2.preferences import ConfigWidgetBase, test_widget +from calibre.gui2.preferences.adding_ui import Ui_Form +from calibre.utils.config import prefs +from calibre.gui2.widgets import FilenamePattern + +class ConfigWidget(ConfigWidgetBase, Ui_Form): + + def genesis(self, gui): + self.gui = gui + + r = self.register + + r('read_file_metadata', prefs) + r('swap_author_names', prefs) + r('add_formats_to_existing', prefs) + + self.filename_pattern = FilenamePattern(self) + self.metadata_box.layout().insertWidget(0, self.filename_pattern) + self.filename_pattern.changed_signal.connect(self.changed_signal.emit) + + + def initialize(self): + ConfigWidgetBase.initialize(self) + self.filename_pattern.blockSignals(True) + self.filename_pattern.initialize() + self.filename_pattern.blockSignals(False) + + def restore_defaults(self): + ConfigWidgetBase.restore_defaults(self) + self.filename_pattern.initialize(defaults=True) + + def commit(self): + pattern = self.filename_pattern.commit() + prefs['filename_pattern'] = pattern + return ConfigWidgetBase.commit(self) + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + test_widget('Import/Export', 'Adding') + diff --git a/src/calibre/gui2/preferences/adding.ui b/src/calibre/gui2/preferences/adding.ui new file mode 100644 index 0000000000..062c45e1ad --- /dev/null +++ b/src/calibre/gui2/preferences/adding.ui @@ -0,0 +1,83 @@ + + + Form + + + + 0 + 0 + 1010 + 339 + + + + Form + + + + + + Here you can control how calibre will read metadata from the files you add to it. calibre can either read metadata from the contents of the file, or from the filename. + + + true + + + + + + + Read metadata from &file contents rather than file name + + + + + + + If an existing book with a similar title and author is found that does not have the format being added, the format is added +to the existing book, instead of creating a new entry. If the existing book already has the format, then it is silently ignored. + +Title match ignores leading indefinite articles ("the", "a", "an"), punctuation, case, etc. Author match is exact. + + + If books with similar titles and authors found, &merge the new files automatically + + + + + + + &Configure metadata from file name + + + + + + Qt::Vertical + + + + 20 + 363 + + + + + + + + + + + Swap the firstname and lastname of the author. This affects only metadata read from file names. + + + &Swap author firstname and lastname + + + + + + + + diff --git a/src/calibre/gui2/preferences/behavior.py b/src/calibre/gui2/preferences/behavior.py new file mode 100644 index 0000000000..d6d6d7be23 --- /dev/null +++ b/src/calibre/gui2/preferences/behavior.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +import re + +from PyQt4.Qt import Qt, QVariant, QListWidgetItem + +from calibre.gui2.preferences import ConfigWidgetBase, test_widget, \ + CommaSeparatedList +from calibre.gui2.preferences.behavior_ui import Ui_Form +from calibre.gui2 import config, info_dialog, dynamic +from calibre.utils.config import prefs +from calibre.customize.ui import available_output_formats, all_input_formats +from calibre.utils.search_query_parser import saved_searches +from calibre.ebooks import BOOK_EXTENSIONS +from calibre.ebooks.oeb.iterator import is_supported +from calibre.constants import iswindows + +class ConfigWidget(ConfigWidgetBase, Ui_Form): + + def genesis(self, gui): + self.gui = gui + db = gui.library_view.model().db + + r = self.register + + r('worker_process_priority', prefs, choices= + [(_('Low'), 'low'), (_('Normal'), 'normal'), (_('High'), 'high')]) + + r('network_timeout', prefs) + + + r('overwrite_author_title_metadata', config) + r('get_social_metadata', config) + r('new_version_notification', config) + r('upload_news_to_device', config) + r('delete_news_from_library_on_upload', config) + + output_formats = list(sorted(available_output_formats())) + output_formats.remove('oeb') + choices = [(x.upper(), x) for x in output_formats] + r('output_format', prefs, choices=choices) + + restrictions = sorted(saved_searches().names(), + cmp=lambda x,y: cmp(x.lower(), y.lower())) + choices = [('', '')] + [(x, x) for x in restrictions] + r('gui_restriction', db.prefs, choices=choices) + r('new_book_tags', prefs, setting=CommaSeparatedList) + self.reset_confirmation_button.clicked.connect(self.reset_confirmation_dialogs) + + self.input_up_button.clicked.connect(self.up_input) + self.input_down_button.clicked.connect(self.down_input) + for signal in ('Activated', 'Changed', 'DoubleClicked', 'Clicked'): + signal = getattr(self.opt_internally_viewed_formats, 'item'+signal) + signal.connect(self.internally_viewed_formats_changed) + + self.settings['worker_process_priority'].gui_obj.setVisible(iswindows) + self.priority_label.setVisible(iswindows) + + + def initialize(self): + ConfigWidgetBase.initialize(self) + self.init_input_order() + self.init_internally_viewed_formats() + + def restore_defaults(self): + ConfigWidgetBase.restore_defaults(self) + self.init_input_order(defaults=True) + self.init_internally_viewed_formats(defaults=True) + self.changed_signal.emit() + + def commit(self): + input_map = prefs['input_format_order'] + input_cols = [unicode(self.opt_input_order.item(i).data(Qt.UserRole).toString()) for + i in range(self.opt_input_order.count())] + if input_map != input_cols: + prefs['input_format_order'] = input_cols + fmts = self.current_internally_viewed_formats + old = config['internally_viewed_formats'] + if fmts != old: + config['internally_viewed_formats'] = fmts + return ConfigWidgetBase.commit(self) + + # Internally viewed formats {{{ + def internally_viewed_formats_changed(self, *args): + fmts = self.current_internally_viewed_formats + old = config['internally_viewed_formats'] + if fmts != old: + self.changed_signal.emit() + + def init_internally_viewed_formats(self, defaults=False): + if defaults: + fmts = config.defaults['internally_viewed_formats'] + else: + fmts = config['internally_viewed_formats'] + viewer = self.opt_internally_viewed_formats + viewer.blockSignals(True) + exts = set([]) + for ext in BOOK_EXTENSIONS: + ext = ext.lower() + ext = re.sub(r'(x{0,1})htm(l{0,1})', 'html', ext) + if ext == 'lrf' or is_supported('book.'+ext): + exts.add(ext) + viewer.clear() + for ext in sorted(exts): + viewer.addItem(ext.upper()) + item = viewer.item(viewer.count()-1) + item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsUserCheckable) + item.setCheckState(Qt.Checked if + ext.upper() in fmts else Qt.Unchecked) + viewer.blockSignals(False) + + @property + def current_internally_viewed_formats(self): + fmts = [] + viewer = self.opt_internally_viewed_formats + for i in range(viewer.count()): + if viewer.item(i).checkState() == Qt.Checked: + fmts.append(unicode(viewer.item(i).text())) + return fmts + # }}} + + # Input format order {{{ + def init_input_order(self, defaults=False): + if defaults: + input_map = prefs.defaults['input_format_order'] + else: + input_map = prefs['input_format_order'] + all_formats = set() + self.opt_input_order.clear() + for fmt in all_input_formats().union(set(['ZIP', 'RAR'])): + all_formats.add(fmt.upper()) + for format in input_map + list(all_formats.difference(input_map)): + item = QListWidgetItem(format, self.opt_input_order) + item.setData(Qt.UserRole, QVariant(format)) + item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable) + + def up_input(self, *args): + idx = self.opt_input_order.currentRow() + if idx > 0: + self.opt_input_order.insertItem(idx-1, self.opt_input_order.takeItem(idx)) + self.opt_input_order.setCurrentRow(idx-1) + self.changed_signal.emit() + + def down_input(self, *args): + idx = self.opt_input_order.currentRow() + if idx < self.opt_input_order.count()-1: + self.opt_input_order.insertItem(idx+1, self.opt_input_order.takeItem(idx)) + self.opt_input_order.setCurrentRow(idx+1) + self.changed_signal.emit() + + # }}} + + def reset_confirmation_dialogs(self, *args): + for key in dynamic.keys(): + if key.endswith('_again') and dynamic[key] is False: + dynamic[key] = True + info_dialog(self, _('Done'), + _('Confirmation dialogs have all been reset'), show=True) + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + test_widget('Interface', 'Behavior') + diff --git a/src/calibre/gui2/preferences/behavior.ui b/src/calibre/gui2/preferences/behavior.ui index 09d83f29de..8332212235 100644 --- a/src/calibre/gui2/preferences/behavior.ui +++ b/src/calibre/gui2/preferences/behavior.ui @@ -29,21 +29,21 @@ - + Show notification when &new version is available - + Automatically send downloaded &news to ebook reader - + &Delete news from library when it is automatically sent to reader @@ -57,12 +57,12 @@ Default network &timeout: - timeout + opt_network_timeout - + Set the default timeout for network fetches (i.e. anytime we go out to the internet to get information) @@ -81,7 +81,7 @@ - + QComboBox::AdjustToMinimumContentsLengthWithIcon @@ -111,7 +111,7 @@ Job &priority: - priority + opt_worker_process_priority @@ -121,12 +121,12 @@ Preferred &output format: - output_format + opt_output_format - + QComboBox::AdjustToMinimumContentsLengthWithIcon @@ -164,6 +164,20 @@ + + + + A comma-separated list of tags that will be applied to books added to the library + + + + + + + Tags to apply when adding a book: + + + @@ -182,7 +196,7 @@ - + true @@ -194,13 +208,13 @@ - + ... - :/images/arrow-up.svg:/images/arrow-up.svg + :/images/arrow-up.png:/images/arrow-up.png @@ -218,13 +232,13 @@ - + ... - :/images/arrow-down.svg:/images/arrow-down.svg + :/images/arrow-down.png:/images/arrow-down.png @@ -242,7 +256,7 @@ - + true diff --git a/src/calibre/gui2/preferences/columns.py b/src/calibre/gui2/preferences/columns.py new file mode 100644 index 0000000000..c1b9230f42 --- /dev/null +++ b/src/calibre/gui2/preferences/columns.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +import copy, sys + +from PyQt4.Qt import Qt, QVariant, QListWidgetItem + +from calibre.gui2.preferences import ConfigWidgetBase, test_widget +from calibre.gui2.preferences.columns_ui import Ui_Form +from calibre.gui2.preferences.create_custom_column import CreateCustomColumn +from calibre.gui2 import error_dialog, question_dialog, ALL_COLUMNS + +class ConfigWidget(ConfigWidgetBase, Ui_Form): + + restart_critical = True + + def genesis(self, gui): + self.gui = gui + db = self.gui.library_view.model().db + self.custcols = copy.deepcopy(db.field_metadata.get_custom_field_metadata()) + + self.column_up.clicked.connect(self.up_column) + self.column_down.clicked.connect(self.down_column) + self.del_custcol_button.clicked.connect(self.del_custcol) + self.add_custcol_button.clicked.connect(self.add_custcol) + self.add_col_button.clicked.connect(self.add_custcol) + self.edit_custcol_button.clicked.connect(self.edit_custcol) + for signal in ('Activated', 'Changed', 'DoubleClicked', 'Clicked'): + signal = getattr(self.opt_columns, 'item'+signal) + signal.connect(self.columns_changed) + + def initialize(self): + ConfigWidgetBase.initialize(self) + self.init_columns() + + def restore_defaults(self): + ConfigWidgetBase.restore_defaults(self) + self.init_columns(defaults=True) + self.changed_signal.emit() + + def commit(self): + rr = ConfigWidgetBase.commit(self) + return self.apply_custom_column_changes() or rr + + def columns_changed(self, *args): + self.changed_signal.emit() + + def columns_state(self, defaults=False): + if defaults: + return self.gui.library_view.get_default_state() + return self.gui.library_view.get_state() + + def init_columns(self, defaults=False): + # Set up columns + self.opt_columns.blockSignals(True) + model = self.gui.library_view.model() + colmap = list(model.column_map) + state = self.columns_state(defaults) + hidden_cols = state['hidden_columns'] + positions = state['column_positions'] + colmap.sort(cmp=lambda x,y: cmp(positions[x], positions[y])) + self.opt_columns.clear() + for col in colmap: + item = QListWidgetItem(model.headers[col], self.opt_columns) + item.setData(Qt.UserRole, QVariant(col)) + flags = Qt.ItemIsEnabled|Qt.ItemIsSelectable + if col != 'ondevice': + flags |= Qt.ItemIsUserCheckable + item.setFlags(flags) + if col != 'ondevice': + item.setCheckState(Qt.Unchecked if col in hidden_cols else + Qt.Checked) + self.opt_columns.blockSignals(False) + + def up_column(self): + idx = self.opt_columns.currentRow() + if idx > 0: + self.opt_columns.insertItem(idx-1, self.opt_columns.takeItem(idx)) + self.opt_columns.setCurrentRow(idx-1) + self.changed_signal.emit() + + def down_column(self): + idx = self.opt_columns.currentRow() + if idx < self.opt_columns.count()-1: + self.opt_columns.insertItem(idx+1, self.opt_columns.takeItem(idx)) + self.opt_columns.setCurrentRow(idx+1) + self.changed_signal.emit() + + def del_custcol(self): + idx = self.opt_columns.currentRow() + if idx < 0: + return error_dialog(self, '', _('You must select a column to delete it'), + show=True) + col = unicode(self.opt_columns.item(idx).data(Qt.UserRole).toString()) + if col not in self.custcols: + return error_dialog(self, '', + _('The selected column is not a custom column'), show=True) + if not question_dialog(self, _('Are you sure?'), + _('Do you really want to delete column %s and all its data?') % + self.custcols[col]['name'], show_copy_button=False): + return + self.opt_columns.item(idx).setCheckState(False) + self.opt_columns.takeItem(idx) + if self.custcols[col]['colnum'] is None: + del self.custcols[col] # A newly-added column was deleted + else: + self.custcols[col]['*deleteme'] = True + self.changed_signal.emit() + + def add_custcol(self): + model = self.gui.library_view.model() + CreateCustomColumn(self, False, model.orig_headers, ALL_COLUMNS) + self.changed_signal.emit() + + def edit_custcol(self): + model = self.gui.library_view.model() + CreateCustomColumn(self, True, model.orig_headers, ALL_COLUMNS) + self.changed_signal.emit() + + def apply_custom_column_changes(self): + model = self.gui.library_view.model() + db = model.db + config_cols = [unicode(self.opt_columns.item(i).data(Qt.UserRole).toString())\ + for i in range(self.opt_columns.count())] + if not config_cols: + config_cols = ['title'] + removed_cols = set(model.column_map) - set(config_cols) + hidden_cols = set([unicode(self.opt_columns.item(i).data(Qt.UserRole).toString())\ + for i in range(self.opt_columns.count()) \ + if self.opt_columns.item(i).checkState()==Qt.Unchecked]) + hidden_cols = hidden_cols.union(removed_cols) # Hide removed cols + hidden_cols = list(hidden_cols.intersection(set(model.column_map))) + if 'ondevice' in hidden_cols: + hidden_cols.remove('ondevice') + def col_pos(x, y): + xidx = config_cols.index(x) if x in config_cols else sys.maxint + yidx = config_cols.index(y) if y in config_cols else sys.maxint + return cmp(xidx, yidx) + positions = {} + for i, col in enumerate((sorted(model.column_map, cmp=col_pos))): + positions[col] = i + state = {'hidden_columns': hidden_cols, 'column_positions':positions} + self.gui.library_view.apply_state(state) + self.gui.library_view.save_state() + + must_restart = False + for c in self.custcols: + if self.custcols[c]['colnum'] is None: + db.create_custom_column( + label=self.custcols[c]['label'], + name=self.custcols[c]['name'], + datatype=self.custcols[c]['datatype'], + is_multiple=self.custcols[c]['is_multiple'], + display = self.custcols[c]['display']) + must_restart = True + elif '*deleteme' in self.custcols[c]: + db.delete_custom_column(label=self.custcols[c]['label']) + must_restart = True + elif '*edited' in self.custcols[c]: + cc = self.custcols[c] + db.set_custom_column_metadata(cc['colnum'], name=cc['name'], + label=cc['label'], + display = self.custcols[c]['display']) + if '*must_restart' in self.custcols[c]: + must_restart = True + return must_restart + + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + test_widget('Interface', 'Custom Columns') + diff --git a/src/calibre/gui2/preferences/custom_columns.ui b/src/calibre/gui2/preferences/columns.ui similarity index 89% rename from src/calibre/gui2/preferences/custom_columns.ui rename to src/calibre/gui2/preferences/columns.ui index 3f26838a07..b5dc9b8c90 100644 --- a/src/calibre/gui2/preferences/custom_columns.ui +++ b/src/calibre/gui2/preferences/columns.ui @@ -25,7 +25,7 @@ - + true @@ -43,7 +43,7 @@ - :/images/arrow-up.svg:/images/arrow-up.svg + :/images/arrow-up.png:/images/arrow-up.png @@ -70,7 +70,7 @@ - :/images/minus.svg:/images/minus.svg + :/images/minus.png:/images/minus.png @@ -97,7 +97,7 @@ - :/images/plus.svg:/images/plus.svg + :/images/plus.png:/images/plus.png @@ -124,7 +124,7 @@ - :/images/edit_input.svg:/images/edit_input.svg + :/images/edit_input.png:/images/edit_input.png @@ -148,14 +148,14 @@ - :/images/arrow-down.svg:/images/arrow-down.svg + :/images/arrow-down.png:/images/arrow-down.png - + Add &custom column diff --git a/src/calibre/gui2/preferences/conversion.py b/src/calibre/gui2/preferences/conversion.py new file mode 100644 index 0000000000..0063d4a341 --- /dev/null +++ b/src/calibre/gui2/preferences/conversion.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +from PyQt4.Qt import QIcon, Qt, QStringListModel, QVariant + +from calibre.gui2.preferences import ConfigWidgetBase, test_widget, AbortCommit +from calibre.ebooks.conversion.plumber import Plumber +from calibre.utils.logging import Log +from calibre.gui2.preferences.conversion_ui import Ui_Form +from calibre.gui2.convert.look_and_feel import LookAndFeelWidget +from calibre.gui2.convert.page_setup import PageSetupWidget +from calibre.gui2.convert.structure_detection import StructureDetectionWidget +from calibre.gui2.convert.toc import TOCWidget +from calibre.customize.ui import input_format_plugins, output_format_plugins +from calibre.gui2.convert import config_widget_for_input_plugin + +class Model(QStringListModel): + + def __init__(self, widgets): + QStringListModel.__init__(self) + self.widgets = widgets + self.setStringList([w.TITLE for w in widgets]) + + def data(self, index, role): + if role == Qt.DecorationRole: + w = self.widgets[index.row()] + if w.ICON: + return QVariant(QIcon(w.ICON)) + return QStringListModel.data(self, index, role) + +class Base(ConfigWidgetBase, Ui_Form): + + restore_defaults_desc = _('Restore settings to default values. ' + 'Only settings for the currently selected section ' + 'are restored.') + + def genesis(self, gui): + log = Log() + log.outputs = [] + + self.plumber = Plumber('dummy.epub', 'dummy.epub', log, dummy=True, + merge_plugin_recs=False) + + def widget_factory(cls): + return cls(self, self.plumber.get_option_by_name, + self.plumber.get_option_help, None, None) + + self.load_conversion_widgets() + widgets = list(map(widget_factory, self.conversion_widgets)) + self.model = Model(widgets) + self.list.setModel(self.model) + + for w in widgets: + w.changed_signal.connect(self.changed_signal) + self.stack.addWidget(w) + + self.list.currentChanged = self.category_current_changed + self.list.setCurrentIndex(self.model.index(0)) + + def initialize(self): + ConfigWidgetBase.initialize(self) + + def restore_defaults(self): + ConfigWidgetBase.restore_defaults(self) + self.stack.currentWidget().restore_defaults(self.plumber.get_option_by_name) + self.changed_signal.emit() + + def commit(self): + for widget in self.model.widgets: + if not widget.pre_commit_check(): + raise AbortCommit('abort') + widget.commit(save_defaults=True) + return ConfigWidgetBase.commit(self) + + def category_current_changed(self, n, p): + self.stack.setCurrentIndex(n.row()) + +class CommonOptions(Base): + + def load_conversion_widgets(self): + self.conversion_widgets = [LookAndFeelWidget, PageSetupWidget, + StructureDetectionWidget, TOCWidget] + +class InputOptions(Base): + + def load_conversion_widgets(self): + self.conversion_widgets = [] + for plugin in input_format_plugins(): + pw = config_widget_for_input_plugin(plugin) + if pw is not None: + self.conversion_widgets.append(pw) + +class OutputOptions(Base): + + def load_conversion_widgets(self): + self.conversion_widgets = [] + for plugin in output_format_plugins(): + name = plugin.name.lower().replace(' ', '_') + try: + output_widget = __import__('calibre.gui2.convert.'+name, + fromlist=[1]) + pw = output_widget.PluginWidget + self.conversion_widgets.append(pw) + except ImportError: + continue + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + #test_widget('Conversion', 'Input Options') + test_widget('Conversion', 'Common Options') + #test_widget('Conversion', 'Output Options') + diff --git a/src/calibre/gui2/preferences/conversion.ui b/src/calibre/gui2/preferences/conversion.ui new file mode 100644 index 0000000000..d9f335d443 --- /dev/null +++ b/src/calibre/gui2/preferences/conversion.ui @@ -0,0 +1,82 @@ + + + Form + + + + 0 + 0 + 720 + 603 + + + + Form + + + + + + + 0 + 0 + + + + + 180 + 0 + + + + + 180 + 16777215 + + + + + 75 + true + + + + QAbstractItemView::NoEditTriggers + + + true + + + false + + + + 48 + 48 + + + + QAbstractItemView::ScrollPerItem + + + QAbstractItemView::ScrollPerPixel + + + QListView::TopToBottom + + + 10 + + + QListView::ListMode + + + + + + + + + + + diff --git a/src/calibre/gui2/dialogs/config/create_custom_column.py b/src/calibre/gui2/preferences/create_custom_column.py similarity index 93% rename from src/calibre/gui2/dialogs/config/create_custom_column.py rename to src/calibre/gui2/preferences/create_custom_column.py index c0f17b8cba..e8ab8707e2 100644 --- a/src/calibre/gui2/dialogs/config/create_custom_column.py +++ b/src/calibre/gui2/preferences/create_custom_column.py @@ -9,7 +9,7 @@ from functools import partial from PyQt4.QtCore import SIGNAL from PyQt4.Qt import QDialog, Qt, QListWidgetItem, QVariant -from calibre.gui2.dialogs.config.create_custom_column_ui import Ui_QCreateCustomColumn +from calibre.gui2.preferences.create_custom_column_ui import Ui_QCreateCustomColumn from calibre.gui2 import error_dialog class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): @@ -64,12 +64,12 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): self.datatype_changed() self.exec_() return - idx = parent.columns.currentRow() + idx = parent.opt_columns.currentRow() if idx < 0: self.simple_error(_('No column selected'), _('No column has been selected')) return - col = unicode(parent.columns.item(idx).data(Qt.UserRole).toString()) + col = unicode(parent.opt_columns.item(idx).data(Qt.UserRole).toString()) if col not in parent.custcols: self.simple_error('', _('Selected column is not a user-defined column')) return @@ -140,9 +140,10 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): else: date_format = {'date_format': None} - key = self.parent.db.field_metadata.custom_field_prefix+col + db = self.parent.gui.library_view.model().db + key = db.field_metadata.custom_field_prefix+col if not self.editing_col: - self.parent.db.field_metadata + db.field_metadata self.parent.custcols[key] = { 'label':col, 'name':col_heading, @@ -153,14 +154,13 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): 'colnum':None, 'is_multiple':is_multiple, } - item = QListWidgetItem(col_heading, self.parent.columns) + item = QListWidgetItem(col_heading, self.parent.opt_columns) item.setData(Qt.UserRole, QVariant(key)) item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsUserCheckable|Qt.ItemIsSelectable) item.setCheckState(Qt.Checked) else: - idx = self.parent.columns.currentRow() - item = self.parent.columns.item(idx) - item.setData(Qt.UserRole, QVariant(key)) + idx = self.parent.opt_columns.currentRow() + item = self.parent.opt_columns.item(idx) item.setText(col_heading) self.parent.custcols[self.orig_column_name]['label'] = col self.parent.custcols[self.orig_column_name]['name'] = col_heading diff --git a/src/calibre/gui2/dialogs/config/create_custom_column.ui b/src/calibre/gui2/preferences/create_custom_column.ui similarity index 100% rename from src/calibre/gui2/dialogs/config/create_custom_column.ui rename to src/calibre/gui2/preferences/create_custom_column.ui diff --git a/src/calibre/gui2/dialogs/config/device_debug.py b/src/calibre/gui2/preferences/device_debug.py similarity index 97% rename from src/calibre/gui2/dialogs/config/device_debug.py rename to src/calibre/gui2/preferences/device_debug.py index ae4a8e4f45..90927fe9b9 100644 --- a/src/calibre/gui2/dialogs/config/device_debug.py +++ b/src/calibre/gui2/preferences/device_debug.py @@ -22,7 +22,7 @@ class DebugDevice(QDialog): self.copy = QPushButton(_('Copy to &clipboard')) self.copy.setDefault(True) self.setWindowTitle(_('Debug device detection')) - self.setWindowIcon(QIcon(I('debug.svg'))) + self.setWindowIcon(QIcon(I('debug.png'))) self.copy.clicked.connect(self.copy_to_clipboard) self.ok = QPushButton('&OK') self.ok.setAutoDefault(False) diff --git a/src/calibre/gui2/preferences/email.ui b/src/calibre/gui2/preferences/email.ui new file mode 100644 index 0000000000..2ffeb756d9 --- /dev/null +++ b/src/calibre/gui2/preferences/email.ui @@ -0,0 +1,112 @@ + + + Form + + + + 0 + 0 + 701 + 494 + + + + Form + + + + + + calibre can send your books to you (or your reader) by email. Emails will be automatically sent for downloaded news to all email addresses that have Auto-send checked. + + + true + + + + + + + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + + + + + + + Add an email address to which to send books + + + &Add email + + + + :/images/plus.png:/images/plus.png + + + + 24 + 24 + + + + Qt::ToolButtonTextUnderIcon + + + + + + + Make &default + + + + + + + &Remove email + + + + :/images/minus.png:/images/minus.png + + + + 24 + 24 + + + + Qt::ToolButtonTextUnderIcon + + + + + + + + + + + + + + + SendEmail + QWidget +
calibre/gui2/wizard/send_email.h
+ 1 +
+
+ + + + +
diff --git a/src/calibre/gui2/preferences/emailp.py b/src/calibre/gui2/preferences/emailp.py new file mode 100644 index 0000000000..f0b079e209 --- /dev/null +++ b/src/calibre/gui2/preferences/emailp.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +from PyQt4.Qt import QAbstractTableModel, QVariant, QFont, Qt + + +from calibre.gui2.preferences import ConfigWidgetBase, test_widget, \ + AbortCommit +from calibre.gui2.preferences.email_ui import Ui_Form +from calibre.utils.config import ConfigProxy +from calibre.gui2 import NONE +from calibre.utils.smtp import config as smtp_prefs + +class EmailAccounts(QAbstractTableModel): # {{{ + + def __init__(self, accounts): + QAbstractTableModel.__init__(self) + self.accounts = accounts + self.account_order = sorted(self.accounts.keys()) + self.headers = map(QVariant, [_('Email'), _('Formats'), _('Auto send')]) + self.default_font = QFont() + self.default_font.setBold(True) + self.default_font = QVariant(self.default_font) + self.tooltips =[NONE] + map(QVariant, + [_('Formats to email. The first matching format will be sent.'), + '

'+_('If checked, downloaded news will be automatically ' + 'mailed
to this email address ' + '(provided it is in one of the listed formats).')]) + + def rowCount(self, *args): + return len(self.account_order) + + def columnCount(self, *args): + return 3 + + def headerData(self, section, orientation, role): + if role == Qt.DisplayRole and orientation == Qt.Horizontal: + return self.headers[section] + return NONE + + def data(self, index, role): + row, col = index.row(), index.column() + if row < 0 or row >= self.rowCount(): + return NONE + account = self.account_order[row] + if role == Qt.UserRole: + return (account, self.accounts[account]) + if role == Qt.ToolTipRole: + return self.tooltips[col] + if role in [Qt.DisplayRole, Qt.EditRole]: + if col == 0: + return QVariant(account) + if col == 1: + return QVariant(self.accounts[account][0]) + if role == Qt.FontRole and self.accounts[account][2]: + return self.default_font + if role == Qt.CheckStateRole and col == 2: + return QVariant(Qt.Checked if self.accounts[account][1] else Qt.Unchecked) + return NONE + + def flags(self, index): + if index.column() == 2: + return QAbstractTableModel.flags(self, index)|Qt.ItemIsUserCheckable + else: + return QAbstractTableModel.flags(self, index)|Qt.ItemIsEditable + + def setData(self, index, value, role): + if not index.isValid(): + return False + row, col = index.row(), index.column() + account = self.account_order[row] + if col == 2: + self.accounts[account][1] ^= True + elif col == 1: + self.accounts[account][0] = unicode(value.toString()).upper() + else: + na = unicode(value.toString()) + from email.utils import parseaddr + addr = parseaddr(na)[-1] + if not addr: + return False + self.accounts[na] = self.accounts.pop(account) + self.account_order[row] = na + if '@kindle.com' in addr: + self.accounts[na][0] = 'AZW, MOBI, TPZ, PRC, AZW1' + + self.dataChanged.emit( + self.index(index.row(), 0), self.index(index.row(), 2)) + return True + + def make_default(self, index): + if index.isValid(): + row = index.row() + for x in self.accounts.values(): + x[2] = False + self.accounts[self.account_order[row]][2] = True + self.reset() + + def add(self): + x = _('new email address') + y = x + c = 0 + while y in self.accounts: + c += 1 + y = x + str(c) + auto_send = len(self.accounts) < 1 + self.accounts[y] = ['MOBI, EPUB', auto_send, + len(self.account_order) == 0] + self.account_order = sorted(self.accounts.keys()) + self.reset() + return self.index(self.account_order.index(y), 0) + + def remove(self, index): + if index.isValid(): + row = index.row() + account = self.account_order[row] + self.accounts.pop(account) + self.account_order = sorted(self.accounts.keys()) + has_default = False + for account in self.account_order: + if self.accounts[account][2]: + has_default = True + break + if not has_default and self.account_order: + self.accounts[self.account_order[0]][2] = True + + self.reset() + +# }}} + +class ConfigWidget(ConfigWidgetBase, Ui_Form): + + supports_restoring_to_defaults = False + + def genesis(self, gui): + self.gui = gui + self.proxy = ConfigProxy(smtp_prefs()) + + self.send_email_widget.initialize(self.preferred_to_address) + self.send_email_widget.changed_signal.connect(self.changed_signal.emit) + opts = self.send_email_widget.smtp_opts + self._email_accounts = EmailAccounts(opts.accounts) + self._email_accounts.dataChanged.connect(lambda x,y: + self.changed_signal.emit()) + self.email_view.setModel(self._email_accounts) + + self.email_add.clicked.connect(self.add_email_account) + self.email_make_default.clicked.connect(self.make_default) + self.email_view.resizeColumnsToContents() + self.email_remove.clicked.connect(self.remove_email_account) + + def preferred_to_address(self): + if self._email_accounts.account_order: + return self._email_accounts.account_order[0] + + def initialize(self): + ConfigWidgetBase.initialize(self) + # Initializing all done in genesis + + def restore_defaults(self): + ConfigWidgetBase.restore_defaults(self) + # No defaults to restore to + + def commit(self): + to_set = bool(self._email_accounts.accounts) + if not self.send_email_widget.set_email_settings(to_set): + raise AbortCommit('abort') + self.proxy['accounts'] = self._email_accounts.accounts + return ConfigWidgetBase.commit(self) + + def make_default(self, *args): + self._email_accounts.make_default(self.email_view.currentIndex()) + self.changed_signal.emit() + + def add_email_account(self, *args): + index = self._email_accounts.add() + self.email_view.setCurrentIndex(index) + self.email_view.resizeColumnsToContents() + self.email_view.edit(index) + self.changed_signal.emit() + + def remove_email_account(self, *args): + idx = self.email_view.currentIndex() + self._email_accounts.remove(idx) + self.changed_signal.emit() + + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + test_widget('Sharing', 'Email') + diff --git a/src/calibre/gui2/dialogs/config/history.py b/src/calibre/gui2/preferences/history.py similarity index 70% rename from src/calibre/gui2/dialogs/config/history.py rename to src/calibre/gui2/preferences/history.py index 74b88a4380..c1c68642f6 100644 --- a/src/calibre/gui2/dialogs/config/history.py +++ b/src/calibre/gui2/preferences/history.py @@ -6,6 +6,8 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' +import textwrap + from PyQt4.Qt import QComboBox, QStringList, Qt from calibre.gui2 import config as gui_conf @@ -17,15 +19,22 @@ class HistoryBox(QComboBox): self.setEditable(True) def initialize(self, opt_name, default, help=None): - history = gui_conf[opt_name] - if default not in history: - history.append(default) - self.addItems(QStringList(history)) - self.setCurrentIndex(self.findText(default, Qt.MatchFixedString)) - if help is not None: + self.opt_name = opt_name + self.set_value(default) + if help: + self.setStatusTip(help) + help = '\n'.join(textwrap.wrap(help)) self.setToolTip(help) self.setWhatsThis(help) + def set_value(self, val): + history = gui_conf[self.opt_name] + if val not in history: + history.append(val) + self.clear() + self.addItems(QStringList(history)) + self.setCurrentIndex(self.findText(val, Qt.MatchFixedString)) + def save_history(self, opt_name): history = [unicode(self.itemText(i)) for i in range(self.count())] ct = self.text() diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index eb13dd5429..f30b2fddbb 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -20,10 +20,10 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): r = self.register - r('gui_layout', config, choices= + r('gui_layout', config, restart_required=True, choices= [(_('Wide'), 'wide'), (_('Narrow'), 'narrow')]) - r('cover_flow_queue_length', config) + r('cover_flow_queue_length', config, restart_required=True) lang = get_lang() if lang is None or lang not in available_translations(): @@ -32,19 +32,19 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): if l != lang] if lang != 'en': items.append(('en', get_language('en'))) - items.sort(cmp=lambda x, y: cmp(x[1], y[1])) + items.sort(cmp=lambda x, y: cmp(x[1].lower(), y[1].lower())) choices = [(y, x) for x, y in items] # Default language is the autodetected one - choices = [get_language(lang), lang] + choices - r('language', prefs, choices=choices) + choices = [(get_language(lang), lang)] + choices + r('language', prefs, choices=choices, restart_required=True) r('show_avg_rating', config) r('disable_animations', config) - r('systray_icon', config) + r('systray_icon', config, restart_required=True) r('show_splash_screen', gprefs) r('disable_tray_notification', config) r('use_roman_numerals_for_series_number', config) - r('separate_cover_flow', config) + r('separate_cover_flow', config, restart_required=True) r('search_as_you_type', config) choices = [(_('Small'), 'small'), (_('Medium'), 'medium'), @@ -55,6 +55,10 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): (_('Never'), 'never')] r('toolbar_text', gprefs, choices=choices) + def refresh_gui(self, gui): + gui.search.search_as_you_type(config['search_as_you_type']) + + if __name__ == '__main__': from PyQt4.Qt import QApplication app = QApplication([]) diff --git a/src/calibre/gui2/preferences/main.py b/src/calibre/gui2/preferences/main.py new file mode 100644 index 0000000000..6653fe2b67 --- /dev/null +++ b/src/calibre/gui2/preferences/main.py @@ -0,0 +1,340 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +import textwrap +from functools import partial + +from PyQt4.Qt import QMainWindow, Qt, QIcon, QStatusBar, QFont, QWidget, \ + QScrollArea, QStackedWidget, QVBoxLayout, QLabel, QFrame, QKeySequence, \ + QToolBar, QSize, pyqtSignal, QPixmap, QToolButton, QAction, \ + QDialogButtonBox, QHBoxLayout + +from calibre.constants import __appname__, __version__, islinux +from calibre.gui2 import gprefs, min_available_height, available_width, \ + warning_dialog +from calibre.gui2.preferences import init_gui, AbortCommit, get_plugin +from calibre.customize.ui import preferences_plugins +from calibre.utils.ordered_dict import OrderedDict + +ICON_SIZE = 32 + +class StatusBar(QStatusBar): # {{{ + + def __init__(self, parent=None): + QStatusBar.__init__(self, parent) + self.default_message = __appname__ + ' ' + _('version') + ' ' + \ + __version__ + ' ' + _('created by Kovid Goyal') + self.device_string = '' + self._font = QFont() + self._font.setBold(True) + self.setFont(self._font) + + self.w = QLabel(self.default_message) + self.w.setFont(self._font) + self.addWidget(self.w) + +# }}} + +class BarTitle(QWidget): # {{{ + + def __init__(self, parent=None): + QWidget.__init__(self, parent) + self._layout = QHBoxLayout() + self.setLayout(self._layout) + self._layout.addStretch(10) + self.icon = QLabel('') + self._layout.addWidget(self.icon) + self.title = QLabel('') + self.title.setStyleSheet('QLabel { font-weight: bold }') + self.title.setAlignment(Qt.AlignLeft | Qt.AlignCenter) + self._layout.addWidget(self.title) + self._layout.addStretch(10) + + def show_plugin(self, plugin): + self.pmap = QPixmap(plugin.icon).scaled(ICON_SIZE, ICON_SIZE, + Qt.KeepAspectRatio, Qt.SmoothTransformation) + self.icon.setPixmap(self.pmap) + self.title.setText(plugin.gui_name) + tt = plugin.description + self.setStatusTip(tt) + tt = textwrap.fill(tt) + self.setToolTip(tt) + self.setWhatsThis(tt) + +# }}} + +class Category(QWidget): # {{{ + + plugin_activated = pyqtSignal(object) + + def __init__(self, name, plugins, parent=None): + QWidget.__init__(self, parent) + self._layout = QVBoxLayout() + self.setLayout(self._layout) + self.label = QLabel(name) + self.sep = QFrame(self) + self.bf = QFont() + self.bf.setBold(True) + self.label.setFont(self.bf) + self.sep.setFrameShape(QFrame.HLine) + self._layout.addWidget(self.label) + self._layout.addWidget(self.sep) + + self.plugins = plugins + + self.bar = QToolBar(self) + self.bar.setIconSize(QSize(48, 48)) + self.bar.setMovable(False) + self.bar.setFloatable(False) + self.bar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) + self._layout.addWidget(self.bar) + self.actions = [] + for p in plugins: + target = partial(self.triggered, p) + ac = self.bar.addAction(QIcon(p.icon), p.gui_name, target) + ac.setToolTip(textwrap.fill(p.description)) + ac.setWhatsThis(textwrap.fill(p.description)) + ac.setStatusTip(p.description) + self.actions.append(ac) + w = self.bar.widgetForAction(ac) + w.setStyleSheet('QToolButton { margin-right: 20px; min-width: 100px }') + w.setCursor(Qt.PointingHandCursor) + w.setAutoRaise(True) + + def triggered(self, plugin, *args): + self.plugin_activated.emit(plugin) + +# }}} + +class Browser(QScrollArea): # {{{ + + show_plugin = pyqtSignal(object) + + def __init__(self, parent=None): + QScrollArea.__init__(self, parent) + self.setWidgetResizable(True) + + category_map = {} + for plugin in preferences_plugins(): + if plugin.category not in category_map: + category_map[plugin.category] = plugin.category_order + if category_map[plugin.category] < plugin.category_order: + category_map[plugin.category] = plugin.category_order + + categories = list(category_map.keys()) + categories.sort(cmp=lambda x, y: cmp(category_map[x], category_map[y])) + + self.category_map = OrderedDict() + for c in categories: + self.category_map[c] = [] + + for plugin in preferences_plugins(): + self.category_map[plugin.category].append(plugin) + + for plugins in self.category_map.values(): + plugins.sort(cmp=lambda x, y: cmp(x.name_order, y.name_order)) + + self.widgets = [] + self._layout = QVBoxLayout() + self.container = QWidget(self) + self.container.setLayout(self._layout) + self.setWidget(self.container) + + for name, plugins in self.category_map.items(): + w = Category(name, plugins, self) + self.widgets.append(w) + self._layout.addWidget(w) + w.plugin_activated.connect(self.show_plugin.emit) + + +# }}} + +class Preferences(QMainWindow): + + def __init__(self, gui, initial_plugin=None): + QMainWindow.__init__(self, gui) + self.gui = gui + self.must_restart = False + self.committed = False + + self.resize(900, 720) + nh, nw = min_available_height()-25, available_width()-10 + if nh < 0: + nh = 800 + if nw < 0: + nw = 600 + nh = min(self.height(), nh) + nw = min(self.width(), nw) + self.resize(nw, nh) + self.esc_action = QAction(self) + self.addAction(self.esc_action) + self.esc_action.setShortcut(QKeySequence(Qt.Key_Escape)) + self.esc_action.triggered.connect(self.esc) + + geom = gprefs.get('preferences_window_geometry', None) + if geom is not None: + self.restoreGeometry(geom) + + # Center + if islinux: + self.move(gui.rect().center() - self.rect().center()) + + self.setWindowModality(Qt.WindowModal) + self.setWindowTitle(__appname__ + ' - ' + _('Preferences')) + self.setWindowIcon(QIcon(I('config.png'))) + + self.status_bar = StatusBar(self) + self.setStatusBar(self.status_bar) + + self.stack = QStackedWidget(self) + self.cw = QWidget(self) + self.cw.setLayout(QVBoxLayout()) + self.cw.layout().addWidget(self.stack) + self.bb = QDialogButtonBox(QDialogButtonBox.Close) + self.cw.layout().addWidget(self.bb) + self.bb.rejected.connect(self.close, type=Qt.QueuedConnection) + self.setCentralWidget(self.cw) + self.browser = Browser(self) + self.browser.show_plugin.connect(self.show_plugin) + self.stack.addWidget(self.browser) + self.scroll_area = QScrollArea(self) + self.stack.addWidget(self.scroll_area) + self.scroll_area.setWidgetResizable(True) + + self.bar = QToolBar(self) + self.addToolBar(self.bar) + self.bar.setVisible(False) + self.bar.setIconSize(QSize(ICON_SIZE, ICON_SIZE)) + self.bar.setMovable(False) + self.bar.setFloatable(False) + self.bar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.apply_action = self.bar.addAction(QIcon(I('ok.png')), _('&Apply'), + self.commit) + self.cancel_action = self.bar.addAction(QIcon(I('window-close.png')), + _('&Cancel'), self.cancel) + self.bar_title = BarTitle(self.bar) + self.bar.addWidget(self.bar_title) + self.restore_action = self.bar.addAction(QIcon(I('clear_left.png')), + _('Restore &defaults'), self.restore_defaults) + for ac, tt in [('apply', _('Save changes')), + ('cancel', _('Cancel and return to overview'))]: + ac = getattr(self, ac+'_action') + ac.setToolTip(tt) + ac.setWhatsThis(tt) + ac.setStatusTip(tt) + + for ch in self.bar.children(): + if isinstance(ch, QToolButton): + ch.setCursor(Qt.PointingHandCursor) + ch.setAutoRaise(True) + + self.stack.setCurrentIndex(0) + + if initial_plugin is not None: + category, name = initial_plugin + plugin = get_plugin(category, name) + if plugin is not None: + self.show_plugin(plugin) + + + def show_plugin(self, plugin): + self.showing_widget = plugin.create_widget(self.scroll_area) + self.showing_widget.genesis(self.gui) + self.showing_widget.initialize() + self.scroll_area.setWidget(self.showing_widget) + self.stack.setCurrentIndex(1) + self.showing_widget.show() + self.setWindowTitle(__appname__ + ' - ' + _('Preferences') + ' - ' + + plugin.gui_name) + self.apply_action.setEnabled(False) + self.showing_widget.changed_signal.connect(lambda : + self.apply_action.setEnabled(True)) + self.restore_action.setEnabled(self.showing_widget.supports_restoring_to_defaults) + tt = self.showing_widget.restore_defaults_desc + if not self.restore_action.isEnabled(): + tt = _('Restoring to defaults not supported for') + ' ' + \ + plugin.gui_name + self.restore_action.setToolTip(textwrap.fill(tt)) + self.restore_action.setWhatsThis(textwrap.fill(tt)) + self.restore_action.setStatusTip(tt) + self.bar_title.show_plugin(plugin) + self.setWindowIcon(QIcon(plugin.icon)) + self.bar.setVisible(True) + self.bb.setVisible(False) + + + def hide_plugin(self): + self.showing_widget = QWidget(self.scroll_area) + self.scroll_area.setWidget(self.showing_widget) + self.setWindowTitle(__appname__ + ' - ' + _('Preferences')) + self.bar.setVisible(False) + self.stack.setCurrentIndex(0) + self.setWindowIcon(QIcon(I('config.png'))) + self.bb.setVisible(True) + + def esc(self, *args): + if self.stack.currentIndex() == 1: + self.hide_plugin() + elif self.stack.currentIndex() == 0: + self.close() + + def commit(self, *args): + try: + must_restart = self.showing_widget.commit() + except AbortCommit: + return + rc = self.showing_widget.restart_critical + self.committed = True + if must_restart: + self.must_restart = True + msg = _('Some of the changes you made require a restart.' + ' Please restart calibre as soon as possible.') + if rc: + msg = _('The changes you have made require calibre be ' + 'restarted immediately. You will not be allowed ' + 'set any more preferences, until you restart.') + + + warning_dialog(self, _('Restart needed'), msg, show=True, + show_copy_button=False) + self.showing_widget.refresh_gui(self.gui) + self.hide_plugin() + if must_restart and rc: + self.close() + + + def cancel(self, *args): + self.hide_plugin() + + def restore_defaults(self, *args): + self.showing_widget.restore_defaults() + + def closeEvent(self, *args): + gprefs.set('preferences_window_geometry', + bytearray(self.saveGeometry())) + if self.committed: + self.gui.must_restart_before_config = self.must_restart + self.gui.tags_view.set_new_model() # in case columns changed + self.gui.tags_view.recount() + self.gui.create_device_menu() + self.gui.set_device_menu_items_state(bool(self.gui.device_connected)) + self.gui.tool_bar.build_bar() + self.gui.build_context_menus() + self.gui.tool_bar.apply_settings() + + return QMainWindow.closeEvent(self, *args) + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + app + gui = init_gui() + + p = Preferences(gui) + p.show() + app.exec_() + gui.shutdown() diff --git a/src/calibre/gui2/preferences/misc.py b/src/calibre/gui2/preferences/misc.py new file mode 100644 index 0000000000..eae79fdfc0 --- /dev/null +++ b/src/calibre/gui2/preferences/misc.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +from PyQt4.Qt import QProgressDialog, QThread, Qt, pyqtSignal + +from calibre.gui2.preferences import ConfigWidgetBase, test_widget +from calibre.gui2.preferences.misc_ui import Ui_Form +from calibre.gui2 import error_dialog, config, warning_dialog, \ + open_local_file, info_dialog +from calibre.constants import isosx + +# Check Integrity {{{ + +class VacThread(QThread): + + check_done = pyqtSignal(object, object) + callback = pyqtSignal(object, object) + + def __init__(self, parent, db): + QThread.__init__(self, parent) + self.db = db + self._parent = parent + + def run(self): + err = bad = None + try: + bad = self.db.check_integrity(self.callbackf) + except: + import traceback + err = traceback.format_exc() + self.check_done.emit(bad, err) + + def callbackf(self, progress, msg): + self.callback.emit(progress, msg) + + +class CheckIntegrity(QProgressDialog): + + def __init__(self, db, parent=None): + QProgressDialog.__init__(self, parent) + self.db = db + self.setCancelButton(None) + self.setMinimum(0) + self.setMaximum(100) + self.setWindowTitle(_('Checking database integrity')) + self.setAutoReset(False) + self.setValue(0) + + self.vthread = VacThread(self, db) + self.vthread.check_done.connect(self.check_done, + type=Qt.QueuedConnection) + self.vthread.callback.connect(self.callback, type=Qt.QueuedConnection) + self.vthread.start() + + def callback(self, progress, msg): + self.setLabelText(msg) + self.setValue(int(100*progress)) + + def check_done(self, bad, err): + if err: + error_dialog(self, _('Error'), + _('Failed to check database integrity'), + det_msg=err, show=True) + elif bad: + titles = [self.db.title(x, index_is_id=True) for x in bad] + det_msg = '\n'.join(titles) + warning_dialog(self, _('Some inconsistencies found'), + _('The following books had formats listed in the ' + 'database that are not actually available. ' + 'The entries for the formats have been removed. ' + 'You should check them manually. This can ' + 'happen if you manipulate the files in the ' + 'library folder directly.'), det_msg=det_msg, show=True) + self.reset() + +# }}} + +class ConfigWidget(ConfigWidgetBase, Ui_Form): + + def genesis(self, gui): + self.gui = gui + r = self.register + r('worker_limit', config, restart_required=True) + r('enforce_cpu_limit', config, restart_required=True) + self.device_detection_button.clicked.connect(self.debug_device_detection) + self.compact_button.clicked.connect(self.compact) + self.button_open_config_dir.clicked.connect(self.open_config_dir) + self.button_osx_symlinks.clicked.connect(self.create_symlinks) + self.button_osx_symlinks.setVisible(isosx) + + def debug_device_detection(self, *args): + from calibre.gui2.preferences.device_debug import DebugDevice + d = DebugDevice(self) + d.exec_() + + def compact(self, *args): + d = CheckIntegrity(self.gui.library_view.model().db, self) + d.exec_() + + def open_config_dir(self, *args): + from calibre.utils.config import config_dir + open_local_file(config_dir) + + def create_symlinks(self): + from calibre.utils.osx_symlinks import create_symlinks + loc, paths = create_symlinks() + if loc is None: + error_dialog(self, _('Error'), + _('Failed to install command line tools.'), + det_msg=paths, show=True) + else: + info_dialog(self, _('Command line tools installed'), + '

'+_('Command line tools installed in')+' '+loc+ + '
'+ _('If you move calibre.app, you have to re-install ' + 'the command line tools.'), + det_msg='\n'.join(paths), show=True) + + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + test_widget('Advanced', 'Misc') + diff --git a/src/calibre/gui2/preferences/misc.ui b/src/calibre/gui2/preferences/misc.ui new file mode 100644 index 0000000000..f8582a3675 --- /dev/null +++ b/src/calibre/gui2/preferences/misc.ui @@ -0,0 +1,144 @@ + + + Form + + + + 0 + 0 + 502 + 314 + + + + Form + + + + + + &Maximum number of waiting worker processes (needs restart): + + + opt_worker_limit + + + + + + + 2 + + + 10000 + + + 2 + + + + + + + Limit the max. simultaneous jobs to the available CPU &cores + + + + + + + Qt::Vertical + + + + 20 + 18 + + + + + + + + Debug &device detection + + + + + + + Qt::Vertical + + + + 20 + 19 + + + + + + + + &Check database integrity + + + + + + + Qt::Vertical + + + + 20 + 18 + + + + + + + + Open calibre &configuration directory + + + + + + + Qt::Vertical + + + + 20 + 19 + + + + + + + + &Install command line tools + + + + + + + Qt::Vertical + + + + 20 + 18 + + + + + + + + + diff --git a/src/calibre/gui2/preferences/plugins.py b/src/calibre/gui2/preferences/plugins.py new file mode 100644 index 0000000000..a26553db1c --- /dev/null +++ b/src/calibre/gui2/preferences/plugins.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +import textwrap, os + +from PyQt4.Qt import Qt, QModelIndex, QAbstractItemModel, QVariant, QIcon, \ + QBrush, QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QLineEdit + +from calibre.gui2.preferences import ConfigWidgetBase, test_widget +from calibre.gui2.preferences.plugins_ui import Ui_Form +from calibre.customize.ui import initialized_plugins, is_disabled, enable_plugin, \ + disable_plugin, customize_plugin, \ + plugin_customization, add_plugin, \ + remove_plugin +from calibre.gui2 import NONE, error_dialog, info_dialog, choose_files + +class PluginModel(QAbstractItemModel): # {{{ + + def __init__(self, *args): + QAbstractItemModel.__init__(self, *args) + self.icon = QVariant(QIcon(I('plugins.png'))) + p = QIcon(self.icon).pixmap(32, 32, QIcon.Disabled, QIcon.On) + self.disabled_icon = QVariant(QIcon(p)) + self._p = p + self.populate() + + def populate(self): + self._data = {} + for plugin in initialized_plugins(): + if plugin.type not in self._data: + self._data[plugin.type] = [plugin] + else: + self._data[plugin.type].append(plugin) + self.categories = sorted(self._data.keys()) + + for plugins in self._data.values(): + plugins.sort(cmp=lambda x, y: cmp(x.name.lower(), y.name.lower())) + + def index(self, row, column, parent): + if not self.hasIndex(row, column, parent): + return QModelIndex() + + if parent.isValid(): + return self.createIndex(row, column, 1+parent.row()) + else: + return self.createIndex(row, column, 0) + + def parent(self, index): + if not index.isValid() or index.internalId() == 0: + return QModelIndex() + return self.createIndex(index.internalId()-1, 0, 0) + + def rowCount(self, parent): + if not parent.isValid(): + return len(self.categories) + if parent.internalId() == 0: + category = self.categories[parent.row()] + return len(self._data[category]) + return 0 + + def columnCount(self, parent): + return 1 + + def index_to_plugin(self, index): + category = self.categories[index.parent().row()] + return self._data[category][index.row()] + + def plugin_to_index(self, plugin): + for i, category in enumerate(self.categories): + parent = self.index(i, 0, QModelIndex()) + for j, p in enumerate(self._data[category]): + if plugin == p: + return self.index(j, 0, parent) + return QModelIndex() + + def refresh_plugin(self, plugin, rescan=False): + if rescan: + self.populate() + idx = self.plugin_to_index(plugin) + self.dataChanged.emit(idx, idx) + + def flags(self, index): + if not index.isValid(): + return 0 + if index.internalId() == 0: + return Qt.ItemIsEnabled + flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled + return flags + + def data(self, index, role): + if not index.isValid(): + return NONE + if index.internalId() == 0: + if role == Qt.DisplayRole: + category = self.categories[index.row()] + return QVariant(_("%(plugin_type)s %(plugins)s")%\ + dict(plugin_type=category, plugins=_('plugins'))) + else: + plugin = self.index_to_plugin(index) + if role == Qt.DisplayRole: + ver = '.'.join(map(str, plugin.version)) + desc = '\n'.join(textwrap.wrap(plugin.description, 50)) + ans='%s (%s) %s %s\n%s'%(plugin.name, ver, _('by'), plugin.author, desc) + c = plugin_customization(plugin) + if c: + ans += _('\nCustomization: ')+c + return QVariant(ans) + if role == Qt.DecorationRole: + return self.disabled_icon if is_disabled(plugin) else self.icon + if role == Qt.ForegroundRole and is_disabled(plugin): + return QVariant(QBrush(Qt.gray)) + if role == Qt.UserRole: + return plugin + return NONE + +# }}} + +class ConfigWidget(ConfigWidgetBase, Ui_Form): + + supports_restoring_to_defaults = False + + def genesis(self, gui): + self.gui = gui + self._plugin_model = PluginModel() + self.plugin_view.setModel(self._plugin_model) + self.plugin_view.setStyleSheet( + "QTreeView::item { padding-bottom: 10px;}") + self.toggle_plugin_button.clicked.connect(self.toggle_plugin) + self.customize_plugin_button.clicked.connect(self.customize_plugin) + self.remove_plugin_button.clicked.connect(self.remove_plugin) + self.button_plugin_browse.clicked.connect(self.find_plugin) + self.button_plugin_add.clicked.connect(self.add_plugin) + + def toggle_plugin(self, *args): + self.modify_plugin(op='toggle') + + def customize_plugin(self, *args): + self.modify_plugin(op='customize') + + def remove_plugin(self, *args): + self.modify_plugin(op='remove') + + def add_plugin(self): + path = unicode(self.plugin_path.text()) + if path and os.access(path, os.R_OK) and path.lower().endswith('.zip'): + add_plugin(path) + self._plugin_model.populate() + self._plugin_model.reset() + self.changed_signal.emit() + else: + error_dialog(self, _('No valid plugin path'), + _('%s is not a valid plugin path')%path).exec_() + + def find_plugin(self): + path = choose_files(self, 'choose plugin dialog', _('Choose plugin'), + filters=[('Plugins', ['zip'])], all_files=False, + select_only_single_file=True) + if path: + self.plugin_path.setText(path[0]) + + def modify_plugin(self, op=''): + index = self.plugin_view.currentIndex() + if index.isValid(): + plugin = self._plugin_model.index_to_plugin(index) + if op == 'toggle': + if not plugin.can_be_disabled: + error_dialog(self,_('Plugin cannot be disabled'), + _('The plugin: %s cannot be disabled')%plugin.name).exec_() + return + if is_disabled(plugin): + enable_plugin(plugin) + else: + disable_plugin(plugin) + self._plugin_model.refresh_plugin(plugin) + self.changed_signal.emit() + if op == 'customize': + if not plugin.is_customizable(): + info_dialog(self, _('Plugin not customizable'), + _('Plugin: %s does not need customization')%plugin.name).exec_() + return + self.changed_signal.emit() + + config_dialog = QDialog(self) + button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + v = QVBoxLayout(config_dialog) + + button_box.accepted.connect(config_dialog.accept) + button_box.rejected.connect(config_dialog.reject) + config_dialog.setWindowTitle(_('Customize') + ' ' + plugin.name) + + if hasattr(plugin, 'config_widget'): + config_widget = plugin.config_widget() + v.addWidget(config_widget) + v.addWidget(button_box) + config_dialog.exec_() + + if config_dialog.result() == QDialog.Accepted: + plugin.save_settings(config_widget) + self._plugin_model.refresh_plugin(plugin) + else: + help_text = plugin.customization_help(gui=True) + help_text = QLabel(help_text, config_dialog) + help_text.setWordWrap(True) + help_text.setTextInteractionFlags(Qt.LinksAccessibleByMouse + | Qt.LinksAccessibleByKeyboard) + help_text.setOpenExternalLinks(True) + v.addWidget(help_text) + sc = plugin_customization(plugin) + if not sc: + sc = '' + sc = sc.strip() + sc = QLineEdit(sc, config_dialog) + v.addWidget(sc) + v.addWidget(button_box) + config_dialog.exec_() + + if config_dialog.result() == QDialog.Accepted: + sc = unicode(sc.text()).strip() + customize_plugin(plugin, sc) + + self._plugin_model.refresh_plugin(plugin) + elif op == 'remove': + if remove_plugin(plugin): + self._plugin_model.populate() + self._plugin_model.reset() + self.changed_signal.emit() + else: + error_dialog(self, _('Cannot remove builtin plugin'), + plugin.name + _(' cannot be removed. It is a ' + 'builtin plugin. Try disabling it instead.')).exec_() + + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + test_widget('Advanced', 'Plugins') + diff --git a/src/calibre/gui2/preferences/plugins.ui b/src/calibre/gui2/preferences/plugins.ui new file mode 100644 index 0000000000..8979867bbc --- /dev/null +++ b/src/calibre/gui2/preferences/plugins.ui @@ -0,0 +1,141 @@ + + + Form + + + + 0 + 0 + 723 + 540 + + + + Form + + + + + + Here you can customize the behavior of Calibre by controlling what plugins it uses. + + + true + + + + + + + true + + + + 32 + 32 + + + + true + + + true + + + true + + + + + + + + + Enable/&Disable plugin + + + + + + + &Customize plugin + + + + + + + &Remove plugin + + + + + + + + + Add new plugin + + + + + + + + Plugin &file: + + + plugin_path + + + + + + + + + + ... + + + + :/images/document_open.png:/images/document_open.png + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + &Add + + + + + + + + + + + + + + + diff --git a/src/calibre/gui2/dialogs/config/save_template.py b/src/calibre/gui2/preferences/save_template.py similarity index 80% rename from src/calibre/gui2/dialogs/config/save_template.py rename to src/calibre/gui2/preferences/save_template.py index 71eb15f4aa..d325ac42ff 100644 --- a/src/calibre/gui2/dialogs/config/save_template.py +++ b/src/calibre/gui2/preferences/save_template.py @@ -6,15 +6,17 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from PyQt4.Qt import QWidget +from PyQt4.Qt import QWidget, pyqtSignal from calibre.gui2 import error_dialog -from calibre.gui2.dialogs.config.save_template_ui import Ui_Form +from calibre.gui2.preferences.save_template_ui import Ui_Form from calibre.library.save_to_disk import FORMAT_ARG_DESCS, \ preprocess_template class SaveTemplate(QWidget, Ui_Form): + changed_signal = pyqtSignal() + def __init__(self, *args): QWidget.__init__(self, *args) Ui_Form.__init__(self) @@ -31,8 +33,13 @@ class SaveTemplate(QWidget, Ui_Form): self.opt_template.initialize(name+'_template_history', default, help) + self.opt_template.editTextChanged.connect(self.changed) + self.opt_template.currentIndexChanged.connect(self.changed) self.option_name = name + def changed(self, *args): + self.changed_signal.emit() + def validate(self): tmpl = preprocess_template(self.opt_template.text()) fa = {} @@ -47,6 +54,9 @@ class SaveTemplate(QWidget, Ui_Form): return False return True + def set_value(self, val): + self.opt_template.set_value(val) + def save_settings(self, config, name): val = unicode(self.opt_template.text()) config.set(name, val) diff --git a/src/calibre/gui2/dialogs/config/save_template.ui b/src/calibre/gui2/preferences/save_template.ui similarity index 96% rename from src/calibre/gui2/dialogs/config/save_template.ui rename to src/calibre/gui2/preferences/save_template.ui index 02506891bb..0d7422abcf 100644 --- a/src/calibre/gui2/dialogs/config/save_template.ui +++ b/src/calibre/gui2/preferences/save_template.ui @@ -52,7 +52,7 @@ HistoryBox QComboBox -

calibre/gui2/dialogs/config/history.h
+
calibre/gui2/preferences/history.h
diff --git a/src/calibre/gui2/preferences/saving.py b/src/calibre/gui2/preferences/saving.py new file mode 100644 index 0000000000..e4b6a33917 --- /dev/null +++ b/src/calibre/gui2/preferences/saving.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + + + +from calibre.gui2.preferences import ConfigWidgetBase, test_widget, \ + AbortCommit +from calibre.gui2.preferences.saving_ui import Ui_Form +from calibre.utils.config import ConfigProxy +from calibre.library.save_to_disk import config + +class ConfigWidget(ConfigWidgetBase, Ui_Form): + + def genesis(self, gui): + self.gui = gui + self.proxy = ConfigProxy(config()) + + r = self.register + + for x in ('asciiize', 'update_metadata', 'save_cover', 'write_opf', + 'replace_whitespace', 'to_lowercase', 'formats', 'timefmt'): + r(x, self.proxy) + + self.save_template.changed_signal.connect(self.changed_signal.emit) + + + def initialize(self): + ConfigWidgetBase.initialize(self) + self.save_template.blockSignals(True) + self.save_template.initialize('save_to_disk', self.proxy['template'], + self.proxy.help('template')) + self.save_template.blockSignals(False) + + def restore_defaults(self): + ConfigWidgetBase.restore_defaults(self) + self.save_template.set_value(self.proxy.defaults['template']) + + def commit(self): + if not self.save_template.validate(): + raise AbortCommit('abort') + self.save_template.save_settings(self.proxy, 'template') + return ConfigWidgetBase.commit(self) + + def refresh_gui(self, gui): + gui.iactions['Save To Disk'].reread_prefs() + + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + test_widget('Import/Export', 'Saving') + diff --git a/src/calibre/gui2/preferences/saving.ui b/src/calibre/gui2/preferences/saving.ui new file mode 100644 index 0000000000..e4f5aaeb47 --- /dev/null +++ b/src/calibre/gui2/preferences/saving.ui @@ -0,0 +1,110 @@ + + + Form + + + + 0 + 0 + 707 + 340 + + + + Form + + + + + + Here you can control how calibre will save your books when you click the Save to Disk button: + + + true + + + + + + + Save &cover separately + + + + + + + Replace space with &underscores + + + + + + + Update &metadata in saved copies + + + + + + + Change paths to &lowercase + + + + + + + Format &dates as: + + + opt_timefmt + + + + + + + + + + File &formats to save: + + + opt_formats + + + + + + + + + + + + + Convert non-English characters to &English equivalents + + + + + + + Save metadata in &OPF file + + + + + + + + SaveTemplate + QWidget +
calibre/gui2/preferences/save_template.h
+ 1 +
+
+ + +
diff --git a/src/calibre/gui2/preferences/sending.py b/src/calibre/gui2/preferences/sending.py new file mode 100644 index 0000000000..748c6b2a2d --- /dev/null +++ b/src/calibre/gui2/preferences/sending.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + + + +from calibre.gui2.preferences import ConfigWidgetBase, test_widget, \ + AbortCommit +from calibre.gui2.preferences.sending_ui import Ui_Form +from calibre.utils.config import ConfigProxy +from calibre.library.save_to_disk import config +from calibre.utils.config import prefs + +class ConfigWidget(ConfigWidgetBase, Ui_Form): + + def genesis(self, gui): + self.gui = gui + self.proxy = ConfigProxy(config()) + + r = self.register + + choices = [(_('Manual management'), 'manual'), + (_('Only on send'), 'on_send'), + (_('Automatic management'), 'on_connect')] + r('manage_device_metadata', prefs, choices=choices) + + self.send_template.changed_signal.connect(self.changed_signal.emit) + + + def initialize(self): + ConfigWidgetBase.initialize(self) + self.send_template.blockSignals(True) + self.send_template.initialize('send_to_device', self.proxy['send_template'], + self.proxy.help('send_template')) + self.send_template.blockSignals(False) + + def restore_defaults(self): + ConfigWidgetBase.restore_defaults(self) + self.send_template.set_value(self.proxy.defaults['send_template']) + + def commit(self): + if not self.send_template.validate(): + raise AbortCommit('abort') + self.send_template.save_settings(self.proxy, 'send_template') + return ConfigWidgetBase.commit(self) + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + test_widget('Import/Export', 'Sending') + diff --git a/src/calibre/gui2/preferences/sending.ui b/src/calibre/gui2/preferences/sending.ui new file mode 100644 index 0000000000..e064646afd --- /dev/null +++ b/src/calibre/gui2/preferences/sending.ui @@ -0,0 +1,108 @@ + + + Form + + + + 0 + 0 + 807 + 331 + + + + Form + + + + + + + 0 + 0 + + + + Metadata &management: + + + opt_manage_device_metadata + + + + + + + + 0 + 0 + + + + + Manual management + + + + + Only on send + + + + + Automatic management + + + + + + + + Qt::Horizontal + + + + 457 + 20 + + + + + + + + <li><b>Manual management</b>: Calibre updates the metadata and adds collections only when a book is sent. With this option, calibre will never remove a collection.</li> +<li><b>Only on send</b>: Calibre updates metadata and adds/removes collections for a book only when it is sent to the device. </li> +<li><b>Automatic management</b>: Calibre automatically keeps metadata on the device in sync with the calibre library, on every connect</li></ul> + + + true + + + + + + + Here you can control how calibre will save your books when you click the Send to Device button. This setting can be overriden for individual devices by customizing the device interface plugins in Preferences->Advanced->Plugins + + + true + + + + + + + + + + + SaveTemplate + QWidget +
calibre/gui2/preferences/save_template.h
+ 1 +
+
+ + +
diff --git a/src/calibre/gui2/preferences/server.py b/src/calibre/gui2/preferences/server.py new file mode 100644 index 0000000000..4db1244d75 --- /dev/null +++ b/src/calibre/gui2/preferences/server.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +import time + +from PyQt4.Qt import Qt, QUrl, QDialog, QSize, QVBoxLayout, QLabel, \ + QPlainTextEdit, QDialogButtonBox + +from calibre.gui2.preferences import ConfigWidgetBase, test_widget +from calibre.gui2.preferences.server_ui import Ui_Form +from calibre.utils.search_query_parser import saved_searches +from calibre.library.server import server_config +from calibre.utils.config import ConfigProxy +from calibre.gui2 import error_dialog, config, open_url, warning_dialog, \ + Dispatcher + +class ConfigWidget(ConfigWidgetBase, Ui_Form): + + def genesis(self, gui): + self.gui = gui + self.proxy = ConfigProxy(server_config()) + db = self.db = gui.library_view.model().db + self.server = self.gui.content_server + + r = self.register + + r('port', self.proxy) + r('username', self.proxy) + r('password', self.proxy) + r('max_cover', self.proxy) + r('max_opds_items', self.proxy) + r('max_opds_ungrouped_items', self.proxy) + + self.show_server_password.stateChanged[int].connect( + lambda s: self.opt_password.setEchoMode( + self.opt_password.Normal if s == Qt.Checked + else self.opt_password.Password)) + self.opt_password.setEchoMode(self.opt_password.Password) + + restrictions = sorted(saved_searches().names(), + cmp=lambda x,y: cmp(x.lower(), y.lower())) + choices = [('', '')] + [(x, x) for x in restrictions] + r('cs_restriction', db.prefs, choices=choices) + + self.start_button.setEnabled(not getattr(self.server, 'is_running', False)) + self.test_button.setEnabled(not self.start_button.isEnabled()) + self.stop_button.setDisabled(self.start_button.isEnabled()) + self.start_button.clicked.connect(self.start_server) + self.stop_button.clicked.connect(self.stop_server) + self.test_button.clicked.connect(self.test_server) + self.view_logs.clicked.connect(self.view_server_logs) + + r('autolaunch_server', config) + + def set_server_options(self): + c = self.proxy + c.set('port', self.opt_port.value()) + c.set('username', unicode(self.opt_username.text()).strip()) + p = unicode(self.opt_password.text()).strip() + if not p: + p = None + c.set('password', p) + + def start_server(self): + self.set_server_options() + from calibre.library.server.main import start_threaded_server + self.server = start_threaded_server(self.db, server_config().parse()) + while not self.server.is_running and self.server.exception is None: + time.sleep(1) + if self.server.exception is not None: + error_dialog(self, _('Failed to start content server'), + unicode(self.server.exception)).exec_() + return + self.start_button.setEnabled(False) + self.test_button.setEnabled(True) + self.stop_button.setEnabled(True) + + def stop_server(self): + from calibre.library.server.main import stop_threaded_server + stop_threaded_server(self.server) + self.server = None + self.start_button.setEnabled(True) + self.test_button.setEnabled(False) + self.stop_button.setEnabled(False) + + def test_server(self): + open_url(QUrl('http://127.0.0.1:'+str(self.opt_port.value()))) + + def view_server_logs(self): + from calibre.library.server import log_access_file, log_error_file + d = QDialog(self) + d.resize(QSize(800, 600)) + layout = QVBoxLayout() + d.setLayout(layout) + layout.addWidget(QLabel(_('Error log:'))) + el = QPlainTextEdit(d) + layout.addWidget(el) + try: + el.setPlainText(open(log_error_file, 'rb').read().decode('utf8', 'replace')) + except IOError: + el.setPlainText('No error log found') + layout.addWidget(QLabel(_('Access log:'))) + al = QPlainTextEdit(d) + layout.addWidget(al) + try: + al.setPlainText(open(log_access_file, 'rb').read().decode('utf8', 'replace')) + except IOError: + al.setPlainText('No access log found') + bx = QDialogButtonBox(QDialogButtonBox.Ok) + layout.addWidget(bx) + bx.accepted.connect(d.accept) + d.show() + + def commit(self): + ConfigWidgetBase.commit(self) + warning_dialog(self, _('Restart needed'), + _('You need to restart the server for changes to' + ' take effect'), show=True) + return False + + def refresh_gui(self, gui): + gui.content_server = self.server + if gui.content_server is not None: + gui.content_server.state_callback = \ + Dispatcher(gui.iactions['Connect Share'].content_server_state_changed) + gui.content_server.state_callback(gui.content_server.is_running) + + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + test_widget('Sharing', 'Server') + diff --git a/src/calibre/gui2/preferences/server.ui b/src/calibre/gui2/preferences/server.ui new file mode 100644 index 0000000000..d043f6f52c --- /dev/null +++ b/src/calibre/gui2/preferences/server.ui @@ -0,0 +1,261 @@ + + + Form + + + + 0 + 0 + 641 + 563 + + + + Form + + + + + + + + Server &port: + + + opt_port + + + + + + + 65535 + + + 8080 + + + + + + + &Username: + + + opt_username + + + + + + + + + + &Password: + + + opt_password + + + + + + + If you leave the password blank, anyone will be able to access your book collection using the web interface. + + + + + + + The maximum size (widthxheight) for displayed covers. Larger covers are resized. + + + + + + + + + + Max. &cover size: + + + opt_max_cover + + + + + + + &Show password + + + + + + + Max. &OPDS items per query: + + + opt_max_opds_items + + + + + + + 10 + + + 10000 + + + + + + + 25 + + + 1000000 + + + + + + + Max. OPDS &ungrouped items: + + + opt_max_opds_ungrouped_items + + + + + + + Restriction (saved search) to apply: + + + + + + + This restriction (based on a saved search) will restrict the books the content server makes available to those matching the search. This setting is per library (i.e. you can have a different restriction per library). + + + QComboBox::AdjustToMinimumContentsLengthWithIcon + + + 20 + + + + + + + + + + + &Start Server + + + + + + + St&op Server + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + &Test Server + + + + + + + + + calibre contains a network server that allows you to access your book collection using a browser from anywhere in the world. Any changes to the settings will only take effect after a server restart. + + + true + + + + + + + Run server &automatically on startup + + + + + + + View &server logs + + + + + + + Qt::Vertical + + + + 20 + 36 + + + + + + + + <p>Remember to leave calibre running as the server only runs as long as calibre is running. +<p>Stanza should see your calibre collection automatically. If not, try adding the URL http://myhostname:8080 as a new catalog in the Stanza reader on your iPhone. Here myhostname should be the fully qualified hostname or the IP address of the computer calibre is running on. + + + true + + + + + + + Qt::Vertical + + + + 20 + 37 + + + + + + + + + diff --git a/src/calibre/gui2/dialogs/config/social.py b/src/calibre/gui2/preferences/social.py similarity index 100% rename from src/calibre/gui2/dialogs/config/social.py rename to src/calibre/gui2/preferences/social.py diff --git a/src/calibre/gui2/dialogs/config/toolbar.py b/src/calibre/gui2/preferences/toolbar.py similarity index 93% rename from src/calibre/gui2/dialogs/config/toolbar.py rename to src/calibre/gui2/preferences/toolbar.py index 5d5b0e1bfc..c13d956aea 100644 --- a/src/calibre/gui2/dialogs/config/toolbar.py +++ b/src/calibre/gui2/preferences/toolbar.py @@ -7,11 +7,12 @@ __docformat__ = 'restructuredtext en' from functools import partial -from PyQt4.Qt import QWidget, QAbstractListModel, Qt, QIcon, \ +from PyQt4.Qt import QAbstractListModel, Qt, QIcon, \ QVariant, QItemSelectionModel -from calibre.gui2.dialogs.config.toolbar_ui import Ui_Form +from calibre.gui2.preferences.toolbar_ui import Ui_Form from calibre.gui2 import gprefs, NONE, warning_dialog +from calibre.gui2.preferences import ConfigWidgetBase, test_widget class FakeAction(object): @@ -27,7 +28,7 @@ class BaseModel(QAbstractListModel): def name_to_action(self, name, gui): if name == 'Donate': - return FakeAction(name, 'donate.svg', + return FakeAction(name, 'donate.png', dont_add_to=frozenset(['context-menu', 'context-menu-device'])) if name == 'Location Manager': @@ -53,7 +54,7 @@ class BaseModel(QAbstractListModel): if role == Qt.DecorationRole: ic = action[1] if ic is None: - ic = 'blank.svg' + ic = 'blank.png' return QVariant(QIcon(I(ic))) if role == Qt.ToolTipRole and action[2] is not None: return QVariant(action[2]) @@ -195,7 +196,7 @@ class CurrentModel(BaseModel): self.reset() -class ToolbarLayout(QWidget, Ui_Form): +class ConfigWidget(ConfigWidgetBase, Ui_Form): LOCATIONS = [ ('toolbar', _('The main toolbar')), @@ -206,10 +207,7 @@ class ToolbarLayout(QWidget, Ui_Form): 'the device')) ] - def __init__(self, gui, parent=None): - QWidget.__init__(self, parent) - self.setupUi(self) - + def genesis(self, gui): self.models = {} for key, text in self.LOCATIONS: self.what.addItem(text, key) @@ -222,7 +220,6 @@ class ToolbarLayout(QWidget, Ui_Form): self.add_action_button.clicked.connect(self.add_action) self.remove_action_button.clicked.connect(self.remove_action) - self.restore_defaults_button.clicked.connect(self.restore_defaults) self.action_up_button.clicked.connect(partial(self.move, -1)) self.action_down_button.clicked.connect(partial(self.move, 1)) @@ -248,6 +245,7 @@ class ToolbarLayout(QWidget, Ui_Form): ca = self.current_actions idx = ca.model().index(ca.model().rowCount(None)-1) ca.scrollTo(idx) + self.changed_signal.emit() def remove_action(self, *args): x = self.current_actions.selectionModel().selectedIndexes() @@ -262,6 +260,8 @@ class ToolbarLayout(QWidget, Ui_Form): _('Cannot remove the actions %s from this location') % ','.join([a.action_spec[0] for a in not_removed]), show=True) + else: + self.changed_signal.emit() def move(self, delta, *args): ci = self.current_actions.currentIndex() @@ -272,24 +272,22 @@ class ToolbarLayout(QWidget, Ui_Form): self.current_actions.setCurrentIndex(ni) self.current_actions.selectionModel().select(ni, QItemSelectionModel.ClearAndSelect) + self.changed_signal.emit() def commit(self): for am, cm in self.models.values(): cm.commit() + return False - def restore_defaults(self, *args): + def restore_defaults(self): for am, cm in self.models.values(): cm.restore_defaults() am.restore_defaults() + self.changed_signal.emit() if __name__ == '__main__': from PyQt4.Qt import QApplication - from calibre.gui2.ui import Main - app=QApplication([]) - m = Main(None) - a = ToolbarLayout(m) - a.show() - app.exec_() - a.commit() + app = QApplication([]) + test_widget('Interface', 'Toolbar') diff --git a/src/calibre/gui2/dialogs/config/toolbar.ui b/src/calibre/gui2/preferences/toolbar.ui similarity index 86% rename from src/calibre/gui2/dialogs/config/toolbar.ui rename to src/calibre/gui2/preferences/toolbar.ui index 091f21c4ae..0e601f74a2 100644 --- a/src/calibre/gui2/dialogs/config/toolbar.ui +++ b/src/calibre/gui2/preferences/toolbar.ui @@ -95,8 +95,8 @@ ... - - :/images/arrow-up.svg:/images/arrow-up.svg + + :/images/arrow-up.png:/images/arrow-up.png @@ -128,8 +128,8 @@ ... - - :/images/arrow-down.svg:/images/arrow-down.svg + + :/images/arrow-down.png:/images/arrow-down.png @@ -158,8 +158,8 @@ ... - - :/images/forward.svg:/images/forward.svg + + :/images/forward.png:/images/forward.png @@ -194,8 +194,8 @@ ... - - :/images/back.svg:/images/back.svg + + :/images/back.png:/images/back.png @@ -207,17 +207,10 @@
- - - - Restore to &default - - -
- + diff --git a/src/calibre/gui2/preferences/tweaks.py b/src/calibre/gui2/preferences/tweaks.py new file mode 100644 index 0000000000..2bd765986d --- /dev/null +++ b/src/calibre/gui2/preferences/tweaks.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +from calibre.gui2.preferences import ConfigWidgetBase, test_widget, AbortCommit +from calibre.gui2.preferences.tweaks_ui import Ui_Form +from calibre.gui2 import error_dialog +from calibre.utils.config import read_raw_tweaks, write_tweaks + + +class ConfigWidget(ConfigWidgetBase, Ui_Form): + + def genesis(self, gui): + self.gui = gui + self.current_tweaks.textChanged.connect(self.changed) + + def changed(self, *args): + self.changed_signal.emit() + + def initialize(self): + deft, curt = read_raw_tweaks() + self.current_tweaks.blockSignals(True) + self.current_tweaks.setPlainText(curt.decode('utf-8')) + self.current_tweaks.blockSignals(False) + + self.default_tweaks.setPlainText(deft.decode('utf-8')) + + def restore_defaults(self): + ConfigWidgetBase.restore_defaults(self) + deft, curt = read_raw_tweaks() + self.current_tweaks.setPlainText(deft.decode('utf-8')) + + + def commit(self): + raw = unicode(self.current_tweaks.toPlainText()).encode('utf-8') + try: + exec raw + except: + import traceback + error_dialog(self, _('Invalid tweaks'), + _('The tweaks you entered are invalid, try resetting the' + ' tweaks to default and changing them one by one until' + ' you find the invalid setting.'), + det_msg=traceback.format_exc(), show=True) + raise AbortCommit('abort') + write_tweaks(raw) + ConfigWidgetBase.commit(self) + return True + + +if __name__ == '__main__': + from PyQt4.Qt import QApplication + app = QApplication([]) + test_widget('Advanced', 'Tweaks') + diff --git a/src/calibre/gui2/preferences/tweaks.ui b/src/calibre/gui2/preferences/tweaks.ui new file mode 100644 index 0000000000..8546873552 --- /dev/null +++ b/src/calibre/gui2/preferences/tweaks.ui @@ -0,0 +1,59 @@ + + + Form + + + + 0 + 0 + 660 + 351 + + + + Form + + + + + + Values for the tweaks are shown below. Edit them to change the behavior of calibre. Your changes will only take effect after a restart of calibre. + + + true + + + + + + + All available tweaks + + + + + + true + + + + + + + + + + &Current tweaks + + + + + + + + + + + + + diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 8986346dbc..d8f59b8db7 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -90,6 +90,7 @@ class SearchBox2(QComboBox): self.setSizeAdjustPolicy(self.AdjustToMinimumContentsLengthWithIcon) self.setMinimumContentsLength(25) self._in_a_search = False + self.tool_tip_text = self.toolTip() def initialize(self, opt_name, colorize=False, help_text=_('Search')): self.as_you_type = config['search_as_you_type'] @@ -100,6 +101,7 @@ class SearchBox2(QComboBox): self.clear_to_help() def normalize_state(self): + self.setToolTip(self.tool_tip_text) if self.help_state: self.setEditText('') self.line_edit.setStyleSheet( @@ -112,6 +114,7 @@ class SearchBox2(QComboBox): self.normal_background) def clear_to_help(self): + self.setToolTip(self.tool_tip_text) if self.help_state: return self.help_state = True @@ -131,6 +134,9 @@ class SearchBox2(QComboBox): self.clear_to_help() def search_done(self, ok): + if isinstance(ok, basestring): + self.setToolTip(ok) + ok = False if not unicode(self.currentText()).strip(): return self.clear_to_help() self._in_a_search = ok diff --git a/src/calibre/gui2/shortcuts.ui b/src/calibre/gui2/shortcuts.ui index 4afe564640..b26976c8e2 100644 --- a/src/calibre/gui2/shortcuts.ui +++ b/src/calibre/gui2/shortcuts.ui @@ -69,7 +69,7 @@ - :/images/clear_left.svg:/images/clear_left.svg + :/images/clear_left.png:/images/clear_left.png @@ -110,7 +110,7 @@ - :/images/clear_left.svg:/images/clear_left.svg + :/images/clear_left.png:/images/clear_left.png diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 7d2333f58b..a64eb2eb9a 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -372,19 +372,19 @@ class TagsModel(QAbstractItemModel): # {{{ # before a QPaintDevice'. The ':' in front avoids polluting either the # user-defined categories (':' at end) or columns namespaces (no ':'). self.category_icon_map = TagsIcons({ - 'authors' : QIcon(I('user_profile.svg')), - 'series' : QIcon(I('series.svg')), - 'formats' : QIcon(I('book.svg')), + 'authors' : QIcon(I('user_profile.png')), + 'series' : QIcon(I('series.png')), + 'formats' : QIcon(I('book.png')), 'publisher' : QIcon(I('publisher.png')), 'rating' : QIcon(I('star.png')), - 'news' : QIcon(I('news.svg')), - 'tags' : QIcon(I('tags.svg')), - ':custom' : QIcon(I('column.svg')), - ':user' : QIcon(I('drawer.svg')), - 'search' : QIcon(I('search.svg'))}) + 'news' : QIcon(I('news.png')), + 'tags' : QIcon(I('tags.png')), + ':custom' : QIcon(I('column.png')), + ':user' : QIcon(I('drawer.png')), + 'search' : QIcon(I('search.png'))}) self.categories_with_ratings = ['authors', 'series', 'publisher', 'tags'] - self.icon_state_map = [None, QIcon(I('plus.svg')), QIcon(I('minus.svg'))] + self.icon_state_map = [None, QIcon(I('plus.png')), QIcon(I('minus.png'))] self.db = db self.tags_view = parent self.hidden_categories = hidden_categories @@ -424,10 +424,8 @@ class TagsModel(QAbstractItemModel): # {{{ self.categories = [] # Reconstruct the user categories, putting them into metadata + self.db.field_metadata.remove_dynamic_categories() tb_cats = self.db.field_metadata - for k in tb_cats.keys(): - if tb_cats[k]['kind'] in ['user', 'search']: - del tb_cats[k] for user_cat in sorted(self.db.prefs.get('user_categories', {}).keys()): cat_name = user_cat+':' # add the ':' to avoid name collision tb_cats.add_user_category(label=cat_name, name=user_cat) diff --git a/src/calibre/gui2/throbber.py b/src/calibre/gui2/throbber.py index e27438b60d..9d8c508f60 100644 --- a/src/calibre/gui2/throbber.py +++ b/src/calibre/gui2/throbber.py @@ -64,7 +64,7 @@ if __name__ == '__main__': w = QWidget() w.setLayout(QHBoxLayout()) b = ThrobbingButton() - b.setIcon(QIcon(I('donate.svg'))) + b.setIcon(QIcon(I('donate.png'))) w.layout().addWidget(b) w.show() b.set_normal_icon_size(64, 64) diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index caef82ab81..7a516bb4ff 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -238,7 +238,7 @@ def fetch_scheduled_recipe(arg): return 'gui_convert', args, _('Fetch news from ')+arg['title'], fmt.upper(), [pt] -def generate_catalog(parent, dbspec, ids, device): +def generate_catalog(parent, dbspec, ids, device_manager): from calibre.gui2.dialogs.catalog import Catalog # Build the Catalog dialog in gui2.dialogs.catalog @@ -252,9 +252,18 @@ def generate_catalog(parent, dbspec, ids, device): # Profile the connected device # Parallel initialization in calibre.library.cli:command_catalog() - connected_device = { 'storage':None,'serial':None,'save_template':None,'name':None} + connected_device = { + 'is_device_connected': device_manager.is_device_connected, + 'kind': device_manager.connected_device_kind, + 'name': None, + 'save_template': None, + 'serial': None, + 'storage': None + } - if device: + if device_manager.is_device_connected: + device = device_manager.device + connected_device['name'] = device.gui_name try: storage = [] if device._main_prefix: @@ -263,11 +272,10 @@ def generate_catalog(parent, dbspec, ids, device): storage.append(os.path.join(device._card_a_prefix, device.EBOOK_DIR_CARD_A)) if device._card_b_prefix: storage.append(os.path.join(device._card_b_prefix, device.EBOOK_DIR_CARD_B)) - connected_device = { 'storage': storage, - 'serial': device.detected_device.serial if \ - hasattr(device.detected_device,'serial') else None, - 'save_template': device.save_template(), - 'name': device.gui_name} + connected_device['storage'] = storage + connected_device['serial'] = device.detected_device.serial if \ + hasattr(device.detected_device,'serial') else None + connected_device['save_template'] = device.save_template() except: pass diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index c42cf7d6c3..f40eed1fcd 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -164,13 +164,13 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{ self.system_tray_icon.show() self.system_tray_menu = QMenu(self) self.restore_action = self.system_tray_menu.addAction( - QIcon(I('page.svg')), _('&Restore')) + QIcon(I('page.png')), _('&Restore')) self.donate_action = self.system_tray_menu.addAction( - QIcon(I('donate.svg')), _('&Donate to support calibre')) + QIcon(I('donate.png')), _('&Donate to support calibre')) self.donate_button.setDefaultAction(self.donate_action) self.donate_button.setStatusTip(self.donate_button.toolTip()) self.eject_action = self.system_tray_menu.addAction( - QIcon(I('eject.svg')), _('&Eject connected device')) + QIcon(I('eject.png')), _('&Eject connected device')) self.eject_action.setEnabled(False) self.addAction(self.quit_action) self.system_tray_menu.addAction(self.quit_action) @@ -233,7 +233,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{ ######################### Search Restriction ########################## SearchRestrictionMixin.__init__(self) - self.apply_named_search_restriction(db.prefs.get('gui_restriction', '')) + self.apply_named_search_restriction(db.prefs['gui_restriction']) ########################### Cover Flow ################################ @@ -378,7 +378,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{ self.set_window_title() self.apply_named_search_restriction('') # reset restriction to null self.saved_searches_changed() # reload the search restrictions combo box - self.apply_named_search_restriction(db.prefs.get('gui_restriction', '')) + self.apply_named_search_restriction(db.prefs['gui_restriction']) def set_window_title(self): self.setWindowTitle(__appname__ + u' - ||%s||'%self.iactions['Choose Library'].library_name()) @@ -514,7 +514,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{ d = QMessageBox(QMessageBox.Warning, _('WARNING: Active jobs'), msg, QMessageBox.Yes|QMessageBox.No, self) - d.setIconPixmap(QPixmap(I('dialog_warning.svg'))) + d.setIconPixmap(QPixmap(I('dialog_warning.png'))) d.setDefaultButton(QMessageBox.No) if d.exec_() != QMessageBox.Yes: return False @@ -522,6 +522,16 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{ def shutdown(self, write_settings=True): + try: + db = self.library_view.model().db + cf = db.clean + except: + pass + else: + cf() + # Save the current field_metadata for applications like calibre2opds + # Goes here, because if cf is valid, db is valid. + db.prefs['field_metadata'] = db.field_metadata.all_metadata() for action in self.iactions.values(): if not action.shutting_down(): return diff --git a/src/calibre/gui2/viewer/config.ui b/src/calibre/gui2/viewer/config.ui index d6e71c77d2..09c38fc908 100644 --- a/src/calibre/gui2/viewer/config.ui +++ b/src/calibre/gui2/viewer/config.ui @@ -15,7 +15,7 @@ - :/images/config.svg:/images/config.svg + :/images/config.png:/images/config.png diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index 75f95b1a90..60ee362882 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -444,12 +444,12 @@ class DocumentView(QWebView): self.connect(self.document, SIGNAL('animated_scroll_done()'), self.animated_scroll_done, Qt.QueuedConnection) copy_action = self.pageAction(self.document.Copy) - copy_action.setIcon(QIcon(I('convert.svg'))) + copy_action.setIcon(QIcon(I('convert.png'))) d = self.document self.unimplemented_actions = list(map(self.pageAction, [d.DownloadImageToDisk, d.OpenLinkInNewWindow, d.DownloadLinkToDisk, d.OpenImageInNewWindow, d.OpenLink])) - self.dictionary_action = QAction(QIcon(I('dictionary.svg')), + self.dictionary_action = QAction(QIcon(I('dictionary.png')), _('&Lookup in dictionary'), self) self.dictionary_action.setShortcut(Qt.CTRL+Qt.Key_L) self.dictionary_action.triggered.connect(self.lookup) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 32bfdd22ce..79f4c29998 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -173,6 +173,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.pending_anchor = None self.pending_reference = None self.pending_bookmark = None + self.existing_bookmarks= [] self.selected_text = None self.read_settings() self.dictionary_box.hide() @@ -266,7 +267,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.action_full_screen.setCheckable(True) self.print_menu = QMenu() - self.print_menu.addAction(QIcon(I('print-preview.svg')), _('Print Preview')) + self.print_menu.addAction(QIcon(I('print-preview.png')), _('Print Preview')) self.action_print.setMenu(self.print_menu) self.tool_bar.widgetForAction(self.action_print).setPopupMode(QToolButton.MenuButtonPopup) self.connect(self.action_print, SIGNAL("triggered(bool)"), partial(self.print_book, preview=False)) @@ -415,15 +416,6 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.action_font_size_smaller.setEnabled(self.view.multiplier() > 0.2) self.set_page_number(frac) - def bookmark(self, *args): - title, ok = QInputDialog.getText(self, _('Add bookmark'), _('Enter title for bookmark:')) - title = unicode(title).strip() - if ok and title: - pos = self.view.bookmark() - bookmark = '%d#%s'%(self.current_index, pos) - self.iterator.add_bookmark((title, bookmark)) - self.set_bookmarks(self.iterator.bookmarks) - def find(self, text, repeat=False, backwards=False): if not text: @@ -539,15 +531,34 @@ class EbookViewer(MainWindow, Ui_EbookViewer): getattr(self, o).setEnabled(False) self.setCursor(Qt.BusyCursor) + def bookmark(self, *args): + num = 1 + bm = None + while True: + bm = _('Bookmark #%d')%num + if bm not in self.existing_bookmarks: + break + num += 1 + title, ok = QInputDialog.getText(self, _('Add bookmark'), + _('Enter title for bookmark:'), text=bm) + title = unicode(title).strip() + if ok and title: + pos = self.view.bookmark() + bookmark = '%d#%s'%(self.current_index, pos) + self.iterator.add_bookmark((title, bookmark)) + self.set_bookmarks(self.iterator.bookmarks) + def set_bookmarks(self, bookmarks): self.bookmarks_menu.clear() self.bookmarks_menu.addAction(_("Manage Bookmarks"), self.manage_bookmarks) self.bookmarks_menu.addSeparator() current_page = None + self.existing_bookmarks = [] for bm in bookmarks: if bm[0] == 'calibre_current_page_bookmark': current_page = bm else: + self.existing_bookmarks.append(bm[0]) self.bookmarks_menu.addAction(bm[0], partial(self.goto_bookmark, bm)) return current_page @@ -694,7 +705,7 @@ def main(args=sys.argv): pid = os.fork() if False and (islinux or isfreebsd) else -1 if pid <= 0: app = Application(args) - app.setWindowIcon(QIcon(I('viewer.svg'))) + app.setWindowIcon(QIcon(I('viewer.png'))) QApplication.setOrganizationName(ORG_NAME) QApplication.setApplicationName(APP_UID) main = EbookViewer(args[1] if len(args) > 1 else None, diff --git a/src/calibre/gui2/viewer/main.ui b/src/calibre/gui2/viewer/main.ui index 78d0d3b2da..e3b8fb8a61 100644 --- a/src/calibre/gui2/viewer/main.ui +++ b/src/calibre/gui2/viewer/main.ui @@ -15,7 +15,7 @@ - :/images/viewer.svg:/images/viewer.svg + :/images/viewer.png:/images/viewer.png @@ -84,7 +84,7 @@ - :/images/window-close.svg:/images/window-close.svg + :/images/window-close.png:/images/window-close.png @@ -147,7 +147,7 @@ - :/images/back.svg:/images/back.svg + :/images/back.png:/images/back.png Back @@ -156,7 +156,7 @@ - :/images/forward.svg:/images/forward.svg + :/images/forward.png:/images/forward.png Forward @@ -165,7 +165,7 @@ - :/images/next.svg:/images/next.svg + :/images/next.png:/images/next.png Next page @@ -174,7 +174,7 @@ - :/images/previous.svg:/images/previous.svg + :/images/previous.png:/images/previous.png Previous page @@ -183,7 +183,7 @@ - :/images/font_size_larger.svg:/images/font_size_larger.svg + :/images/font_size_larger.png:/images/font_size_larger.png Font size larger @@ -192,7 +192,7 @@ - :/images/font_size_smaller.svg:/images/font_size_smaller.svg + :/images/font_size_smaller.png:/images/font_size_smaller.png Font size smaller @@ -201,7 +201,7 @@ - :/images/chapters.svg:/images/chapters.svg + :/images/chapters.png:/images/chapters.png Table of Contents @@ -210,7 +210,7 @@ - :/images/dialog_information.svg:/images/dialog_information.svg + :/images/dialog_information.png:/images/dialog_information.png Metadata @@ -219,7 +219,7 @@ - :/images/document_open.svg:/images/document_open.svg + :/images/document_open.png:/images/document_open.png Open ebook @@ -228,7 +228,7 @@ - :/images/arrow-down.svg:/images/arrow-down.svg + :/images/arrow-down.png:/images/arrow-down.png Find next @@ -243,7 +243,7 @@ - :/images/edit_copy.svg:/images/edit_copy.svg + :/images/edit_copy.png:/images/edit_copy.png Copy to clipboard @@ -252,7 +252,7 @@ - :/images/config.svg:/images/config.svg + :/images/config.png:/images/config.png Preferences @@ -261,7 +261,7 @@ - :/images/lookfeel.svg:/images/lookfeel.svg + :/images/lookfeel.png:/images/lookfeel.png Reference Mode @@ -270,7 +270,7 @@ - :/images/bookmarks.svg:/images/bookmarks.svg + :/images/bookmarks.png:/images/bookmarks.png Bookmark @@ -279,7 +279,7 @@ - :/images/page.svg:/images/page.svg + :/images/page.png:/images/page.png Toggle full screen @@ -288,7 +288,7 @@ - :/images/print.svg:/images/print.svg + :/images/print.png:/images/print.png Print @@ -297,7 +297,7 @@ - :/images/arrow-up.svg:/images/arrow-up.svg + :/images/arrow-up.png:/images/arrow-up.png Find previous diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index ae7f8d259e..60224aefc7 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -61,13 +61,24 @@ class ProgressIndicator(QWidget): class FilenamePattern(QWidget, Ui_Form): + changed_signal = pyqtSignal() + def __init__(self, parent): QWidget.__init__(self, parent) self.setupUi(self) self.connect(self.test_button, SIGNAL('clicked()'), self.do_test) self.connect(self.re, SIGNAL('returnPressed()'), self.do_test) - self.re.setText(prefs['filename_pattern']) + self.initialize() + self.re.textChanged.connect(lambda x: self.changed_signal.emit()) + + def initialize(self, defaults=False): + if defaults: + val = prefs.defaults['filename_pattern'] + else: + val = prefs['filename_pattern'] + self.re.setText(val) + def do_test(self): try: @@ -1021,6 +1032,9 @@ class Splitter(QSplitter): # Public API {{{ + def update_desired_state(self): + self.desired_show = not self.is_side_index_hidden + def save_state(self): if self.count() > 1: gprefs[self.save_name+'_state'] = self.get_state() diff --git a/src/calibre/gui2/wizard/__init__.py b/src/calibre/gui2/wizard/__init__.py index 394b919016..f3234d48d5 100644 --- a/src/calibre/gui2/wizard/__init__.py +++ b/src/calibre/gui2/wizard/__init__.py @@ -668,8 +668,8 @@ class Wizard(QWizard): self.setPixmap(self.LogoPixmap, p.scaledToHeight(80, Qt.SmoothTransformation)) self.setPixmap(self.WatermarkPixmap, - QPixmap(I('welcome_wizard.svg'))) - self.setPixmap(self.BackgroundPixmap, QPixmap(I('wizard.svg'))) + QPixmap(I('welcome_wizard.png'))) + self.setPixmap(self.BackgroundPixmap, QPixmap(I('wizard.png'))) self.device_page = DevicePage() self.library_page = LibraryPage() self.connect(self.library_page, SIGNAL('retranslate()'), diff --git a/src/calibre/gui2/wizard/device.ui b/src/calibre/gui2/wizard/device.ui index a422140bb1..229f83be9e 100644 --- a/src/calibre/gui2/wizard/device.ui +++ b/src/calibre/gui2/wizard/device.ui @@ -15,7 +15,7 @@ - :/images/wizard.svg:/images/wizard.svg + :/images/wizard.png:/images/wizard.png Welcome to calibre diff --git a/src/calibre/gui2/wizard/send_email.py b/src/calibre/gui2/wizard/send_email.py index 504c426359..61b9c9f934 100644 --- a/src/calibre/gui2/wizard/send_email.py +++ b/src/calibre/gui2/wizard/send_email.py @@ -9,7 +9,7 @@ __docformat__ = 'restructuredtext en' import cStringIO, sys from binascii import hexlify, unhexlify -from PyQt4.Qt import QWidget, SIGNAL, QDialog, Qt +from PyQt4.Qt import QWidget, pyqtSignal, QDialog, Qt from calibre.gui2.wizard.send_email_ui import Ui_Form from calibre.utils.smtp import config as smtp_prefs @@ -24,7 +24,7 @@ class TestEmail(QDialog, TE_Dialog): self.setupUi(self) opts = smtp_prefs().parse() self.test_func = parent.test_email_settings - self.connect(self.test_button, SIGNAL('clicked(bool)'), self.test) + self.test_button.clicked.connect(self.test) self.from_.setText(unicode(self.from_.text())%opts.from_) if pa: self.to.setText(pa) @@ -33,7 +33,7 @@ class TestEmail(QDialog, TE_Dialog): (opts.relay_username, unhexlify(opts.relay_password), opts.relay_host, opts.relay_port, opts.encryption)) - def test(self): + def test(self, *args): self.log.setPlainText(_('Sending...')) self.test_button.setEnabled(False) try: @@ -47,6 +47,8 @@ class TestEmail(QDialog, TE_Dialog): class SendEmail(QWidget, Ui_Form): + changed_signal = pyqtSignal() + def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) @@ -57,23 +59,31 @@ class SendEmail(QWidget, Ui_Form): self.smtp_opts = opts if opts.from_: self.email_from.setText(opts.from_) + self.email_from.textChanged.connect(self.changed) if opts.relay_host: self.relay_host.setText(opts.relay_host) + self.relay_host.textChanged.connect(self.changed) self.relay_port.setValue(opts.relay_port) + self.relay_port.valueChanged.connect(self.changed) if opts.relay_username: self.relay_username.setText(opts.relay_username) + self.relay_username.textChanged.connect(self.changed) if opts.relay_password: self.relay_password.setText(unhexlify(opts.relay_password)) + self.relay_password.textChanged.connect(self.changed) (self.relay_tls if opts.encryption == 'TLS' else self.relay_ssl).setChecked(True) - self.connect(self.relay_use_gmail, SIGNAL('clicked(bool)'), - self.create_gmail_relay) - self.connect(self.relay_show_password, SIGNAL('stateChanged(int)'), - lambda - state:self.relay_password.setEchoMode(self.relay_password.Password if - state == 0 else self.relay_password.Normal)) - self.connect(self.test_email_button, SIGNAL('clicked(bool)'), - self.test_email) + self.relay_tls.toggled.connect(self.changed) + self.relay_use_gmail.clicked.connect( + self.create_gmail_relay) + self.relay_show_password.stateChanged.connect( + lambda state : self.relay_password.setEchoMode( + self.relay_password.Password if + state == 0 else self.relay_password.Normal)) + self.test_email_button.clicked.connect(self.test_email) + + def changed(self, *args): + self.changed_signal.emit() def test_email(self, *args): pa = self.preferred_to_address() diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index ca66d28ddb..b9c1211c7f 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -319,12 +319,18 @@ class ResultCache(SearchQueryParser): matches.add(item[0]) return matches - def get_matches(self, location, query): + def get_matches(self, location, query, allow_recursion=True): matches = set([]) if query and query.strip(): # get metadata key associated with the search term. Eliminates # dealing with plurals and other aliases location = self.field_metadata.search_term_to_key(location.lower().strip()) + if isinstance(location, list): + if allow_recursion: + for loc in location: + matches |= self.get_matches(loc, query, allow_recursion=False) + return matches + raise ParseException(query, len(query), 'Recursive query group detected', self) # take care of dates special case if location in self.field_metadata and \ diff --git a/src/calibre/library/catalog.py b/src/calibre/library/catalog.py index b4fd537729..bd2160aff1 100644 --- a/src/calibre/library/catalog.py +++ b/src/calibre/library/catalog.py @@ -20,7 +20,7 @@ from calibre.utils.date import isoformat, now as nowf from calibre.utils.logging import default_log as log FIELDS = ['all', 'author_sort', 'authors', 'comments', - 'cover', 'formats', 'id', 'isbn', 'pubdate', 'publisher', 'rating', + 'cover', 'formats', 'id', 'isbn', 'ondevice', 'pubdate', 'publisher', 'rating', 'series_index', 'series', 'size', 'tags', 'timestamp', 'title', 'uuid'] @@ -67,6 +67,8 @@ class CSV_XML(CatalogPlugin): if opts.verbose: opts_dict = vars(opts) log("%s(): Generating %s" % (self.name,self.fmt)) + if opts.connected_device['is_device_connected']: + log(" connected_device: %s" % opts.connected_device['name']) if opts_dict['search_text']: log(" --search='%s'" % opts_dict['search_text']) @@ -81,7 +83,6 @@ class CSV_XML(CatalogPlugin): else: log(" Fields: %s" % opts_dict['fields']) - # If a list of ids are provided, don't use search_text if opts.ids: opts.search_text = None @@ -95,6 +96,11 @@ class CSV_XML(CatalogPlugin): # Get the requested output fields as a list fields = self.get_output_fields(opts) + # If connected device, add 'On Device' values to data + if opts.connected_device['is_device_connected'] and 'ondevice' in fields: + for entry in data: + entry['ondevice'] = db.catalog_plugin_on_device_temp_mapping[entry['id']]['ondevice'] + if self.fmt == 'csv': outfile = codecs.open(path_to_output, 'w', 'utf8') @@ -140,10 +146,10 @@ class CSV_XML(CatalogPlugin): root.append(record) for field in ('id', 'uuid', 'title', 'publisher', 'rating', 'size', - 'isbn'): + 'isbn','ondevice'): if field in fields: val = r[field] - if val is None: + if not val: continue if not isinstance(val, (str, unicode)): val = unicode(val) @@ -561,6 +567,13 @@ class EPUB_MOBI(CatalogPlugin): help=_("Include 'Titles' section in catalog.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats")), + Option('--generate-series', + default=False, + dest='generate_series', + action = 'store_true', + help=_("Include 'Series' section in catalog.\n" + "Default: '%default'\n" + "Applies to: ePub, MOBI output formats")), Option('--generate-recently-added', default=False, dest='generate_recently_added', @@ -886,304 +899,307 @@ class EPUB_MOBI(CatalogPlugin): self.__totalSteps += 2 if self.generateRecentlyRead: self.__totalSteps += 2 + if self.opts.generate_series: + self.__totalSteps += 2 + # Accessors - ''' - @dynamic_property - def xxxx(self): - def fget(self): - return self.__ - def fset(self, val): - self.__ = val - return property(fget=fget, fset=fset) - ''' + if True: + ''' + @dynamic_property + def xxxx(self): + def fget(self): + return self.__ + def fset(self, val): + self.__ = val + return property(fget=fget, fset=fset) + ''' + @dynamic_property + def authorClip(self): + def fget(self): + return self.__authorClip + def fset(self, val): + self.__authorClip = val + return property(fget=fget, fset=fset) + @dynamic_property + def authors(self): + def fget(self): + return self.__authors + def fset(self, val): + self.__authors = val + return property(fget=fget, fset=fset) + @dynamic_property + def basename(self): + def fget(self): + return self.__basename + def fset(self, val): + self.__basename = val + return property(fget=fget, fset=fset) + @dynamic_property + def bookmarked_books(self): + def fget(self): + return self.__bookmarked_books + def fset(self, val): + self.__bookmarked_books = val + return property(fget=fget, fset=fset) + @dynamic_property + def booksByAuthor(self): + def fget(self): + return self.__booksByAuthor + def fset(self, val): + self.__booksByAuthor = val + return property(fget=fget, fset=fset) + @dynamic_property + def booksByDateRead(self): + def fget(self): + return self.__booksByDateRead + def fset(self, val): + self.__booksByDateRead = val + return property(fget=fget, fset=fset) + @dynamic_property + def booksByTitle(self): + def fget(self): + return self.__booksByTitle + def fset(self, val): + self.__booksByTitle = val + return property(fget=fget, fset=fset) + @dynamic_property + def booksByTitle_noSeriesPrefix(self): + def fget(self): + return self.__booksByTitle_noSeriesPrefix + def fset(self, val): + self.__booksByTitle_noSeriesPrefix = val + return property(fget=fget, fset=fset) + @dynamic_property + def catalogPath(self): + def fget(self): + return self.__catalogPath + def fset(self, val): + self.__catalogPath = val + return property(fget=fget, fset=fset) + @dynamic_property + def contentDir(self): + def fget(self): + return self.__contentDir + def fset(self, val): + self.__contentDir = val + return property(fget=fget, fset=fset) + @dynamic_property + def currentStep(self): + def fget(self): + return self.__currentStep + def fset(self, val): + self.__currentStep = val + return property(fget=fget, fset=fset) + @dynamic_property + def creator(self): + def fget(self): + return self.__creator + def fset(self, val): + self.__creator = val + return property(fget=fget, fset=fset) + @dynamic_property + def db(self): + def fget(self): + return self.__db + return property(fget=fget) + @dynamic_property + def descriptionClip(self): + def fget(self): + return self.__descriptionClip + def fset(self, val): + self.__descriptionClip = val + return property(fget=fget, fset=fset) + @dynamic_property + def error(self): + def fget(self): + return self.__error + return property(fget=fget) + @dynamic_property + def generateForKindle(self): + def fget(self): + return self.__generateForKindle + def fset(self, val): + self.__generateForKindle = val + return property(fget=fget, fset=fset) + @dynamic_property + def generateRecentlyRead(self): + def fget(self): + return self.__generateRecentlyRead + def fset(self, val): + self.__generateRecentlyRead = val + return property(fget=fget, fset=fset) + @dynamic_property + def genres(self): + def fget(self): + return self.__genres + def fset(self, val): + self.__genres = val + return property(fget=fget, fset=fset) + @dynamic_property + def genre_tags_dict(self): + def fget(self): + return self.__genre_tags_dict + def fset(self, val): + self.__genre_tags_dict = val + return property(fget=fget, fset=fset) + @dynamic_property + def htmlFileList(self): + def fget(self): + return self.__htmlFileList + def fset(self, val): + self.__htmlFileList = val + return property(fget=fget, fset=fset) + @dynamic_property + def libraryPath(self): + def fget(self): + return self.__libraryPath + def fset(self, val): + self.__libraryPath = val + return property(fget=fget, fset=fset) + @dynamic_property + def markerTags(self): + def fget(self): + return self.__markerTags + def fset(self, val): + self.__markerTags = val + return property(fget=fget, fset=fset) + @dynamic_property + def ncxSoup(self): + def fget(self): + return self.__ncxSoup + def fset(self, val): + self.__ncxSoup = val + return property(fget=fget, fset=fset) + @dynamic_property + def opts(self): + def fget(self): + return self.__opts + return property(fget=fget) + @dynamic_property + def playOrder(self): + def fget(self): + return self.__playOrder + def fset(self,val): + self.__playOrder = val + return property(fget=fget, fset=fset) + @dynamic_property + def plugin(self): + def fget(self): + return self.__plugin + return property(fget=fget) + @dynamic_property + def progressInt(self): + def fget(self): + return self.__progressInt + def fset(self, val): + self.__progressInt = val + return property(fget=fget, fset=fset) + @dynamic_property + def progressString(self): + def fget(self): + return self.__progressString + def fset(self, val): + self.__progressString = val + return property(fget=fget, fset=fset) + @dynamic_property + def reporter(self): + def fget(self): + return self.__reporter + def fset(self, val): + self.__reporter = val + return property(fget=fget, fset=fset) + @dynamic_property + def stylesheet(self): + def fget(self): + return self.__stylesheet + def fset(self, val): + self.__stylesheet = val + return property(fget=fget, fset=fset) + @dynamic_property + def thumbs(self): + def fget(self): + return self.__thumbs + def fset(self, val): + self.__thumbs = val + return property(fget=fget, fset=fset) + def thumbWidth(self): + def fget(self): + return self.__thumbWidth + def fset(self, val): + self.__thumbWidth = val + return property(fget=fget, fset=fset) + def thumbHeight(self): + def fget(self): + return self.__thumbHeight + def fset(self, val): + self.__thumbHeight = val + return property(fget=fget, fset=fset) + @dynamic_property + def title(self): + def fget(self): + return self.__title + def fset(self, val): + self.__title = val + return property(fget=fget, fset=fset) + @dynamic_property + def totalSteps(self): + def fget(self): + return self.__totalSteps + return property(fget=fget) + @dynamic_property + def useSeriesPrefixInTitlesSection(self): + def fget(self): + return self.__useSeriesPrefixInTitlesSection + def fset(self, val): + self.__useSeriesPrefixInTitlesSection = val + return property(fget=fget, fset=fset) + @dynamic_property + def verbose(self): + def fget(self): + return self.__verbose + def fset(self, val): + self.__verbose = val + return property(fget=fget, fset=fset) - @dynamic_property - def authorClip(self): - def fget(self): - return self.__authorClip - def fset(self, val): - self.__authorClip = val - return property(fget=fget, fset=fset) - @dynamic_property - def authors(self): - def fget(self): - return self.__authors - def fset(self, val): - self.__authors = val - return property(fget=fget, fset=fset) - @dynamic_property - def basename(self): - def fget(self): - return self.__basename - def fset(self, val): - self.__basename = val - return property(fget=fget, fset=fset) - @dynamic_property - def bookmarked_books(self): - def fget(self): - return self.__bookmarked_books - def fset(self, val): - self.__bookmarked_books = val - return property(fget=fget, fset=fset) - @dynamic_property - def booksByAuthor(self): - def fget(self): - return self.__booksByAuthor - def fset(self, val): - self.__booksByAuthor = val - return property(fget=fget, fset=fset) - @dynamic_property - def booksByDateRead(self): - def fget(self): - return self.__booksByDateRead - def fset(self, val): - self.__booksByDateRead = val - return property(fget=fget, fset=fset) - @dynamic_property - def booksByTitle(self): - def fget(self): - return self.__booksByTitle - def fset(self, val): - self.__booksByTitle = val - return property(fget=fget, fset=fset) - @dynamic_property - def booksByTitle_noSeriesPrefix(self): - def fget(self): - return self.__booksByTitle_noSeriesPrefix - def fset(self, val): - self.__booksByTitle_noSeriesPrefix = val - return property(fget=fget, fset=fset) - @dynamic_property - def catalogPath(self): - def fget(self): - return self.__catalogPath - def fset(self, val): - self.__catalogPath = val - return property(fget=fget, fset=fset) - @dynamic_property - def contentDir(self): - def fget(self): - return self.__contentDir - def fset(self, val): - self.__contentDir = val - return property(fget=fget, fset=fset) - @dynamic_property - def currentStep(self): - def fget(self): - return self.__currentStep - def fset(self, val): - self.__currentStep = val - return property(fget=fget, fset=fset) - @dynamic_property - def creator(self): - def fget(self): - return self.__creator - def fset(self, val): - self.__creator = val - return property(fget=fget, fset=fset) - @dynamic_property - def db(self): - def fget(self): - return self.__db - return property(fget=fget) - @dynamic_property - def descriptionClip(self): - def fget(self): - return self.__descriptionClip - def fset(self, val): - self.__descriptionClip = val - return property(fget=fget, fset=fset) - @dynamic_property - def error(self): - def fget(self): - return self.__error - return property(fget=fget) - @dynamic_property - def generateForKindle(self): - def fget(self): - return self.__generateForKindle - def fset(self, val): - self.__generateForKindle = val - return property(fget=fget, fset=fset) - @dynamic_property - def generateRecentlyRead(self): - def fget(self): - return self.__generateRecentlyRead - def fset(self, val): - self.__generateRecentlyRead = val - return property(fget=fget, fset=fset) - @dynamic_property - def genres(self): - def fget(self): - return self.__genres - def fset(self, val): - self.__genres = val - return property(fget=fget, fset=fset) - @dynamic_property - def genre_tags_dict(self): - def fget(self): - return self.__genre_tags_dict - def fset(self, val): - self.__genre_tags_dict = val - return property(fget=fget, fset=fset) - @dynamic_property - def htmlFileList(self): - def fget(self): - return self.__htmlFileList - def fset(self, val): - self.__htmlFileList = val - return property(fget=fget, fset=fset) - @dynamic_property - def libraryPath(self): - def fget(self): - return self.__libraryPath - def fset(self, val): - self.__libraryPath = val - return property(fget=fget, fset=fset) - @dynamic_property - def markerTags(self): - def fget(self): - return self.__markerTags - def fset(self, val): - self.__markerTags = val - return property(fget=fget, fset=fset) - @dynamic_property - def ncxSoup(self): - def fget(self): - return self.__ncxSoup - def fset(self, val): - self.__ncxSoup = val - return property(fget=fget, fset=fset) - @dynamic_property - def opts(self): - def fget(self): - return self.__opts - return property(fget=fget) - @dynamic_property - def playOrder(self): - def fget(self): - return self.__playOrder - def fset(self,val): - self.__playOrder = val - return property(fget=fget, fset=fset) - @dynamic_property - def plugin(self): - def fget(self): - return self.__plugin - return property(fget=fget) - @dynamic_property - def progressInt(self): - def fget(self): - return self.__progressInt - def fset(self, val): - self.__progressInt = val - return property(fget=fget, fset=fset) - @dynamic_property - def progressString(self): - def fget(self): - return self.__progressString - def fset(self, val): - self.__progressString = val - return property(fget=fget, fset=fset) - @dynamic_property - def reporter(self): - def fget(self): - return self.__reporter - def fset(self, val): - self.__reporter = val - return property(fget=fget, fset=fset) - @dynamic_property - def stylesheet(self): - def fget(self): - return self.__stylesheet - def fset(self, val): - self.__stylesheet = val - return property(fget=fget, fset=fset) - @dynamic_property - def thumbs(self): - def fget(self): - return self.__thumbs - def fset(self, val): - self.__thumbs = val - return property(fget=fget, fset=fset) - def thumbWidth(self): - def fget(self): - return self.__thumbWidth - def fset(self, val): - self.__thumbWidth = val - return property(fget=fget, fset=fset) - def thumbHeight(self): - def fget(self): - return self.__thumbHeight - def fset(self, val): - self.__thumbHeight = val - return property(fget=fget, fset=fset) - @dynamic_property - def title(self): - def fget(self): - return self.__title - def fset(self, val): - self.__title = val - return property(fget=fget, fset=fset) - @dynamic_property - def totalSteps(self): - def fget(self): - return self.__totalSteps - return property(fget=fget) - @dynamic_property - def useSeriesPrefixInTitlesSection(self): - def fget(self): - return self.__useSeriesPrefixInTitlesSection - def fset(self, val): - self.__useSeriesPrefixInTitlesSection = val - return property(fget=fget, fset=fset) - @dynamic_property - def verbose(self): - def fget(self): - return self.__verbose - def fset(self, val): - self.__verbose = val - return property(fget=fget, fset=fset) - - @dynamic_property - def NOT_READ_SYMBOL(self): - def fget(self): - return '' if self.generateForKindle else \ - '%s' % self.opts.read_tag - return property(fget=fget) - @dynamic_property - def READING_SYMBOL(self): - def fget(self): - return '' if self.generateForKindle else \ - '%s' % self.opts.read_tag - return property(fget=fget) - @dynamic_property - def READ_SYMBOL(self): - def fget(self): - return '' if self.generateForKindle else \ - '%s' % self.opts.read_tag - return property(fget=fget) - @dynamic_property - def FULL_RATING_SYMBOL(self): - def fget(self): - return "★" if self.generateForKindle else "*" - return property(fget=fget) - @dynamic_property - def EMPTY_RATING_SYMBOL(self): - def fget(self): - return "☆" if self.generateForKindle else ' ' - return property(fget=fget) - @dynamic_property - def READ_PROGRESS_SYMBOL(self): - def fget(self): - return "▪" if self.generateForKindle else '+' - return property(fget=fget) - @dynamic_property - def UNREAD_PROGRESS_SYMBOL(self): - def fget(self): - return "▫" if self.generateForKindle else '-' - return property(fget=fget) + @dynamic_property + def NOT_READ_SYMBOL(self): + def fget(self): + return '' if self.generateForKindle else \ + '%s' % self.opts.read_tag + return property(fget=fget) + @dynamic_property + def READING_SYMBOL(self): + def fget(self): + return '' if self.generateForKindle else \ + '%s' % self.opts.read_tag + return property(fget=fget) + @dynamic_property + def READ_SYMBOL(self): + def fget(self): + return '' if self.generateForKindle else \ + '%s' % self.opts.read_tag + return property(fget=fget) + @dynamic_property + def FULL_RATING_SYMBOL(self): + def fget(self): + return "★" if self.generateForKindle else "*" + return property(fget=fget) + @dynamic_property + def EMPTY_RATING_SYMBOL(self): + def fget(self): + return "☆" if self.generateForKindle else ' ' + return property(fget=fget) + @dynamic_property + def READ_PROGRESS_SYMBOL(self): + def fget(self): + return "▪" if self.generateForKindle else '+' + return property(fget=fget) + @dynamic_property + def UNREAD_PROGRESS_SYMBOL(self): + def fget(self): + return "▫" if self.generateForKindle else '-' + return property(fget=fget) # Methods def buildSources(self): @@ -1196,6 +1212,8 @@ class EPUB_MOBI(CatalogPlugin): self.generateHTMLByAuthor() if self.opts.generate_titles: self.generateHTMLByTitle() + if self.opts.generate_series: + self.generateHTMLBySeries() if self.opts.generate_recently_added: self.generateHTMLByDateAdded() if self.generateRecentlyRead: @@ -1206,15 +1224,17 @@ class EPUB_MOBI(CatalogPlugin): self.generateOPF() self.generateNCXHeader() - self.generateNCXDescriptions("Descriptions") self.generateNCXByAuthor("Authors") if self.opts.generate_titles: self.generateNCXByTitle("Titles") + if self.opts.generate_series: + self.generateNCXBySeries("Series") if self.opts.generate_recently_added: self.generateNCXByDateAdded("Recently Added") if self.generateRecentlyRead: self.generateNCXByDateRead("Recently Read") self.generateNCXByGenre("Genres") + self.generateNCXDescriptions("Descriptions") self.writeNCX() return True @@ -1569,13 +1589,26 @@ class EPUB_MOBI(CatalogPlugin): emTag = Tag(soup, "em") if title['series']: # title
series series_index - brTag = Tag(soup,'br') - title_tokens = title['title'].split(': ') - emTag.insert(0, escape(NavigableString(title_tokens[1]))) - emTag.insert(1, brTag) - smallTag = Tag(soup,'small') - smallTag.insert(0, escape(NavigableString(title_tokens[0]))) - emTag.insert(2, smallTag) + if self.opts.generate_series: + brTag = Tag(soup,'br') + title_tokens = list(title['title'].partition(':')) + emTag.insert(0, escape(NavigableString(title_tokens[2].strip()))) + emTag.insert(1, brTag) + smallTag = Tag(soup,'small') + aTag = Tag(soup,'a') + aTag['href'] = "%s.html#%s_series" % ('BySeries', + re.sub('\W','',title['series']).lower()) + aTag.insert(0, title_tokens[0]) + smallTag.insert(0, aTag) + emTag.insert(2, smallTag) + else: + brTag = Tag(soup,'br') + title_tokens = list(title['title'].partition(':')) + emTag.insert(0, escape(NavigableString(title_tokens[2].strip()))) + emTag.insert(1, brTag) + smallTag = Tag(soup,'small') + smallTag.insert(0, escape(NavigableString(title_tokens[0]))) + emTag.insert(2, smallTag) else: emTag.insert(0, NavigableString(escape(title['title']))) titleTag = body.find(attrs={'class':'title'}) @@ -1724,17 +1757,17 @@ class EPUB_MOBI(CatalogPlugin): body.insert(btc, aTag) btc += 1 - ''' - # We don't need this because the Kindle shows section titles - #

By Title

- h2Tag = Tag(soup, "h2") - aTag = Tag(soup, "a") - aTag['name'] = "bytitle" - h2Tag.insert(0,aTag) - h2Tag.insert(1,NavigableString('By Title (%d)' % len(self.booksByTitle))) - body.insert(btc,h2Tag) - btc += 1 - ''' + if not self.__generateForKindle: + # We don't need this because the Kindle shows section titles + #

By Title

+ pTag = Tag(soup, "p") + pTag['class'] = 'title' + aTag = Tag(soup, "a") + aTag['name'] = "bytitle" + pTag.insert(0,aTag) + pTag.insert(1,NavigableString('Titles')) + body.insert(btc,pTag) + btc += 1 #

#

@@ -1742,13 +1775,13 @@ class EPUB_MOBI(CatalogPlugin): dtc = 0 current_letter = "" - # 2/14/10 7:11 AM Experimental: re-sort title list without leading series/series_index + # Re-sort title list without leading series/series_index if not self.useSeriesPrefixInTitlesSection: nspt = deepcopy(self.booksByTitle) for book in nspt: if book['series']: - tokens = book['title'].split(': ') - book['title'] = '%s (%s)' % (tokens[1], tokens[0]) + tokens = book['title'].partition(':') + book['title'] = '%s (%s)' % (tokens[2].strip(), tokens[0]) book['title_sort'] = self.generateSortTitle(book['title']) nspt = sorted(nspt, key=lambda x:(x['title_sort'].upper(), x['title_sort'].upper())) @@ -1835,7 +1868,7 @@ class EPUB_MOBI(CatalogPlugin): # Write books by author A-Z self.updateProgressFullStep("'Authors'") - friendly_name = "By Author" + friendly_name = "Authors" soup = self.generateHTMLEmptyHeader(friendly_name) body = soup.find('body') @@ -1906,15 +1939,14 @@ class EPUB_MOBI(CatalogPlugin): current_series = None pAuthorTag = Tag(soup, "p") pAuthorTag['class'] = "author_index" - emTag = Tag(soup, "em") aTag = Tag(soup, "a") aTag['name'] = "%s" % self.generateAuthorAnchor(current_author) aTag.insert(0,NavigableString(current_author)) - emTag.insert(0,aTag) - pAuthorTag.insert(0,emTag) + pAuthorTag.insert(0,aTag) divTag.insert(dtc,pAuthorTag) dtc += 1 + ''' # Insert an


between non-series and series if not current_series and non_series_books and book['series']: # Insert an
@@ -1922,6 +1954,7 @@ class EPUB_MOBI(CatalogPlugin): hrTag['class'] = "series_divider" divTag.insert(dtc,hrTag) dtc += 1 + ''' # Check for series if book['series'] and book['series'] != current_series: @@ -1929,7 +1962,18 @@ class EPUB_MOBI(CatalogPlugin): current_series = book['series'] pSeriesTag = Tag(soup,'p') pSeriesTag['class'] = "series" - pSeriesTag.insert(0,NavigableString(self.NOT_READ_SYMBOL + book['series'])) + + if self.opts.generate_series: + aTag = Tag(soup,'a') + aTag['href'] = "%s.html#%s_series" % ('BySeries', + re.sub('\W','',book['series']).lower()) + aTag.insert(0, book['series']) + #pSeriesTag.insert(0, NavigableString(self.NOT_READ_SYMBOL)) + pSeriesTag.insert(0, aTag) + else: + #pSeriesTag.insert(0,NavigableString(self.NOT_READ_SYMBOL + '%s' % book['series'])) + pSeriesTag.insert(0,NavigableString('%s' % book['series'])) + divTag.insert(dtc,pSeriesTag) dtc += 1 if current_series and not book['series']: @@ -1957,30 +2001,34 @@ class EPUB_MOBI(CatalogPlugin): aTag = Tag(soup, "a") aTag['href'] = "book_%d.html" % (int(float(book['id']))) - # Use series, series index if avail else just title + # Use series, series index if avail else just title, + year of publication if current_series: - aTag.insert(0,escape(book['title'][len(book['series'])+1:])) + aTag.insert(0,'%s (%s)' % (escape(book['title'][len(book['series'])+1:]), + book['date'].split()[1])) else: - aTag.insert(0,escape(book['title'])) + aTag.insert(0,'%s (%s)' % (escape(book['title']), + book['date'].split()[1])) non_series_books += 1 pBookTag.insert(ptc, aTag) ptc += 1 + divTag.insert(dtc, pBookTag) dtc += 1 - ''' - # Insert the

tag with book_count at the head - #

By Author

- h2Tag = Tag(soup, "h2") - aTag = Tag(soup, "a") - anchor_name = friendly_name.lower() - aTag['name'] = anchor_name.replace(" ","") - h2Tag.insert(0,aTag) - h2Tag.insert(1,NavigableString('%s (%d)' % (friendly_name, book_count))) - body.insert(btc,h2Tag) - btc += 1 - ''' + if not self.__generateForKindle: + # Insert the

tag with book_count at the head + #

By Author

+ pTag = Tag(soup, "p") + pTag['class'] = 'title' + aTag = Tag(soup, "a") + anchor_name = friendly_name.lower() + aTag['name'] = anchor_name.replace(" ","") + pTag.insert(0,aTag) + #h2Tag.insert(1,NavigableString('%s (%d)' % (friendly_name, book_count))) + pTag.insert(1,NavigableString('%s' % (friendly_name))) + body.insert(btc,pTag) + btc += 1 # Add the divTag to the body body.insert(btc, divTag) @@ -2023,15 +2071,14 @@ class EPUB_MOBI(CatalogPlugin): current_series = None pAuthorTag = Tag(soup, "p") pAuthorTag['class'] = "author_index" - emTag = Tag(soup, "em") aTag = Tag(soup, "a") aTag['name'] = "%s" % self.generateAuthorAnchor(current_author) aTag.insert(0,NavigableString(current_author)) - emTag.insert(0,aTag) - pAuthorTag.insert(0,emTag) + pAuthorTag.insert(0,aTag) divTag.insert(dtc,pAuthorTag) dtc += 1 + ''' # Insert an
between non-series and series if not current_series and non_series_books and new_entry['series']: # Insert an
@@ -2039,6 +2086,7 @@ class EPUB_MOBI(CatalogPlugin): hrTag['class'] = "series_divider" divTag.insert(dtc,hrTag) dtc += 1 + ''' # Check for series if new_entry['series'] and new_entry['series'] != current_series: @@ -2046,7 +2094,14 @@ class EPUB_MOBI(CatalogPlugin): current_series = new_entry['series'] pSeriesTag = Tag(soup,'p') pSeriesTag['class'] = "series" - pSeriesTag.insert(0,NavigableString(self.NOT_READ_SYMBOL + new_entry['series'])) + if self.opts.generate_series: + aTag = Tag(soup,'a') + aTag['href'] = "%s.html#%s_series" % ('BySeries', + re.sub('\W','',new_entry['series']).lower()) + aTag.insert(0, new_entry['series']) + pSeriesTag.insert(0, aTag) + else: + pSeriesTag.insert(0,NavigableString('%s' % new_entry['series'])) divTag.insert(dtc,pSeriesTag) dtc += 1 if current_series and not new_entry['series']: @@ -2160,18 +2215,18 @@ class EPUB_MOBI(CatalogPlugin): aTag['name'] = anchor_name.replace(" ","") body.insert(btc, aTag) btc += 1 - ''' - # We don't need this because the kindle inserts section titles - #

By Author

- h2Tag = Tag(soup, "h2") - aTag = Tag(soup, "a") - anchor_name = friendly_name.lower() - aTag['name'] = anchor_name.replace(" ","") - h2Tag.insert(0,aTag) - h2Tag.insert(1,NavigableString('%s' % friendly_name)) - body.insert(btc,h2Tag) - btc += 1 - ''' + + if not self.__generateForKindle: + #

By Author

+ pTag = Tag(soup, "p") + pTag['class'] = 'title' + aTag = Tag(soup, "a") + anchor_name = friendly_name.lower() + aTag['name'] = anchor_name.replace(" ","") + pTag.insert(0,aTag) + pTag.insert(1,NavigableString('%s' % friendly_name)) + body.insert(btc,pTag) + btc += 1 #

#

@@ -2186,14 +2241,13 @@ class EPUB_MOBI(CatalogPlugin): nspt = deepcopy(self.booksByTitle) for book in nspt: if book['series']: - tokens = book['title'].split(': ') - book['title'] = '%s (%s)' % (tokens[1], tokens[0]) + tokens = book['title'].partition(':') + book['title'] = '%s (%s)' % (tokens[2].strip(), tokens[0]) book['title_sort'] = self.generateSortTitle(book['title']) self.booksByDateRange = sorted(nspt, key=lambda x:(x['timestamp'], x['timestamp']),reverse=True) date_range_list = [] today_time = nowf().replace(hour=23, minute=59, second=59) - books_added_in_date_range = False for (i, date) in enumerate(self.DATE_RANGE): date_range_limit = self.DATE_RANGE[i] if i: @@ -2206,18 +2260,20 @@ class EPUB_MOBI(CatalogPlugin): delta = today_time-book_time if delta.days <= date_range_limit: date_range_list.append(book) - books_added_in_date_range = True else: break dtc = add_books_to_HTML_by_date_range(date_range_list, date_range, dtc) date_range_list = [book] + ''' if books_added_in_date_range: # Add an


separating date ranges from months hrTag = Tag(soup,'hr') + hrTag['class'] = "description_divider" divTag.insert(dtc,hrTag) dtc += 1 + ''' # >>>> Books by month <<<< # Sort titles case-insensitive for by month using series prefix @@ -2437,6 +2493,174 @@ class EPUB_MOBI(CatalogPlugin): outfile.close() self.htmlFileList.append("content/ByDateRead.html") + def generateHTMLBySeries(self): + ''' + Generate a list of series + ''' + self.updateProgressFullStep("Fetching series") + + self.opts.sort_by = 'series' + + # Merge opts.exclude_tags with opts.search_text + # Updated to use exact match syntax + empty_exclude_tags = False if len(self.opts.exclude_tags) else True + search_phrase = 'series:true ' + if not empty_exclude_tags: + exclude_tags = self.opts.exclude_tags.split(',') + search_terms = [] + for tag in exclude_tags: + search_terms.append("tag:=%s" % tag) + search_phrase += "not (%s)" % " or ".join(search_terms) + + # If a list of ids are provided, don't use search_text + if self.opts.ids: + self.opts.search_text = search_phrase + else: + if self.opts.search_text: + self.opts.search_text += " " + search_phrase + else: + self.opts.search_text = search_phrase + + # Fetch the database as a dictionary + self.booksBySeries = self.plugin.search_sort_db(self.db, self.opts) + + friendly_name = "Series" + + soup = self.generateHTMLEmptyHeader(friendly_name) + body = soup.find('body') + + btc = 0 + + # Insert section tag + aTag = Tag(soup,'a') + aTag['name'] = 'section_start' + body.insert(btc, aTag) + btc += 1 + + # Insert the anchor + aTag = Tag(soup, "a") + anchor_name = friendly_name.lower() + aTag['name'] = anchor_name.replace(" ","") + body.insert(btc, aTag) + btc += 1 + + #

+ #

+ divTag = Tag(soup, "div") + dtc = 0 + current_letter = "" + current_series = None + + # Loop through booksBySeries + series_count = 0 + for book in self.booksBySeries: + # Check for initial letter change + sort_title = self.generateSortTitle(book['series']) + if self.letter_or_symbol(sort_title[0].upper()) != current_letter : + ''' + # Start a new letter - anchor only, hidden + current_letter = book['author_sort'][0].upper() + aTag = Tag(soup, "a") + aTag['name'] = "%sseries" % current_letter + divTag.insert(dtc, aTag) + dtc += 1 + ''' + # Start a new letter with Index letter + current_letter = self.letter_or_symbol(sort_title[0].upper()) + pIndexTag = Tag(soup, "p") + pIndexTag['class'] = "letter_index" + aTag = Tag(soup, "a") + aTag['name'] = "%s_series" % self.letter_or_symbol(current_letter) + pIndexTag.insert(0,aTag) + pIndexTag.insert(1,NavigableString(self.letter_or_symbol(sort_title[0].upper()))) + divTag.insert(dtc,pIndexTag) + dtc += 1 + + # Check for series change + if book['series'] != current_series: + # Start a new series + series_count += 1 + current_series = book['series'] + pSeriesTag = Tag(soup,'p') + pSeriesTag['class'] = "series" + aTag = Tag(soup, 'a') + aTag['name'] = "%s_series" % re.sub('\W','',book['series']).lower() + pSeriesTag.insert(0,aTag) + pSeriesTag.insert(1,NavigableString(self.NOT_READ_SYMBOL + '%s' % book['series'])) + divTag.insert(dtc,pSeriesTag) + dtc += 1 + + # Add books + pBookTag = Tag(soup, "p") + ptc = 0 + + # book with read/reading/unread symbol + if 'read' in book and book['read']: + # check mark + pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + elif book['id'] in self.bookmarked_books: + pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + else: + # hidden check mark + pBookTag['class'] = "unread_book" + pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + ptc += 1 + + aTag = Tag(soup, "a") + aTag['href'] = "book_%d.html" % (int(float(book['id']))) + # Use series, series index if avail else just title + #aTag.insert(0,'%d. %s · %s' % (book['series_index'],escape(book['title']), ' & '.join(book['authors']))) + + # Link to book + aTag.insert(0,'%d. %s (%s)' % (book['series_index'], + escape(book['title']), + strftime(u'%Y', book['pubdate'].timetuple()))) + pBookTag.insert(ptc, aTag) + ptc += 1 + + # · + pBookTag.insert(ptc, NavigableString(' · ')) + ptc += 1 + + # Link to author + aTag = Tag(soup, "a") + aTag['href'] = "%s.html#%s" % ("ByAlphaAuthor", + self.generateAuthorAnchor(escape(' & '.join(book['authors'])))) + aTag.insert(0, NavigableString(' & '.join(book['authors']))) + pBookTag.insert(ptc, aTag) + ptc += 1 + + divTag.insert(dtc, pBookTag) + dtc += 1 + + if not self.__generateForKindle: + # Insert the

tag with book_count at the head + #

By Series

+ pTag = Tag(soup, "p") + pTag['class'] = 'title' + aTag = Tag(soup, "a") + anchor_name = friendly_name.lower() + aTag['name'] = anchor_name.replace(" ","") + pTag.insert(0,aTag) + #h2Tag.insert(1,NavigableString('%s (%d)' % (friendly_name, series_count))) + pTag.insert(1,NavigableString('%s' % friendly_name)) + body.insert(btc,pTag) + btc += 1 + + # Add the divTag to the body + body.insert(btc, divTag) + + # Write the generated file to contentdir + outfile_spec = "%s/BySeries.html" % (self.contentDir) + outfile = open(outfile_spec, 'w') + outfile.write(soup.prettify()) + outfile.close() + self.htmlFileList.append("content/BySeries.html") + def generateHTMLByTags(self): # Generate individual HTML files for each tag, e.g. Fiction, Nonfiction ... # Note that special tags - ~+*[] - have already been filtered from books[] @@ -2587,24 +2811,8 @@ class EPUB_MOBI(CatalogPlugin): # Check to see if thumbnail exists thumb_fp = "%s/thumbnail_default.jpg" % (image_dir) cover = "%s/DefaultCover.png" % (self.catalogPath) - - # Init Qt for image conversion - from calibre.gui2 import is_ok_to_use_qt - if is_ok_to_use_qt(): - from PyQt4.Qt import QImage, QColor, QPainter, Qt - - # Convert .svg to .jpg - cover_img = QImage(I('book.svg')) - i = QImage(cover_img.size(), - QImage.Format_ARGB32_Premultiplied) - i.fill(QColor(Qt.white).rgb()) - p = QPainter(i) - p.drawImage(0, 0, cover_img) - p.end() - i.save(cover) - else: - if not os.path.exists(cover): - shutil.copyfile(I('library.png'), cover) + if not os.path.exists(cover): + shutil.copyfile(I('book.png'), cover) if os.path.isfile(thumb_fp): # Check to see if default cover is newer than thumbnail @@ -2699,22 +2907,7 @@ class EPUB_MOBI(CatalogPlugin): # HTML files - add books to manifest and spine sort_descriptions_by = self.booksByAuthor if self.opts.sort_descriptions_by_author \ else self.booksByTitle - for book in sort_descriptions_by: - # manifest - itemTag = Tag(soup, "item") - itemTag['href'] = "content/book_%d.html" % int(book['id']) - itemTag['id'] = "book%d" % int(book['id']) - itemTag['media-type'] = "application/xhtml+xml" - manifest.insert(mtc, itemTag) - mtc += 1 - - # spine - itemrefTag = Tag(soup, "itemref") - itemrefTag['idref'] = "book%d" % int(book['id']) - spine.insert(stc, itemrefTag) - stc += 1 - - # Add other html_files to manifest and spine + # Add html_files to manifest and spine for file in self.htmlFileList: itemTag = Tag(soup, "item") @@ -2750,6 +2943,21 @@ class EPUB_MOBI(CatalogPlugin): spine.insert(stc, itemrefTag) stc += 1 + for book in sort_descriptions_by: + # manifest + itemTag = Tag(soup, "item") + itemTag['href'] = "content/book_%d.html" % int(book['id']) + itemTag['id'] = "book%d" % int(book['id']) + itemTag['media-type'] = "application/xhtml+xml" + manifest.insert(mtc, itemTag) + mtc += 1 + + # spine + itemrefTag = Tag(soup, "itemref") + itemrefTag['idref'] = "book%d" % int(book['id']) + spine.insert(stc, itemrefTag) + stc += 1 + # Guide referenceTag = Tag(soup, "reference") referenceTag['type'] = 'masthead' @@ -2785,7 +2993,8 @@ class EPUB_MOBI(CatalogPlugin): navLabelTag.insert(0, textTag) navPointTag.insert(0, navLabelTag) contentTag = Tag(soup, 'content') - contentTag['src'] = "content/book_%d.html" % int(self.booksByTitle[0]['id']) + #contentTag['src'] = "content/book_%d.html" % int(self.booksByTitle[0]['id']) + contentTag['src'] = "content/ByAlphaAuthor.html" navPointTag.insert(1, contentTag) cmiTag = Tag(soup, '%s' % 'calibre:meta-img') cmiTag['name'] = "mastheadImage" @@ -2837,15 +3046,15 @@ class EPUB_MOBI(CatalogPlugin): navLabelTag = Tag(ncx_soup, "navLabel") textTag = Tag(ncx_soup, "text") if book['series']: - tokens = book['title'].split(': ') + tokens = list(book['title'].partition(':')) if self.generateForKindle: # Don't include Author for Kindle textTag.insert(0, NavigableString(self.formatNCXText('%s (%s)' % \ - (tokens[1], tokens[0]), dest='title'))) + (tokens[2].strip(), tokens[0]), dest='title'))) else: # Include Author for non-Kindle textTag.insert(0, NavigableString(self.formatNCXText('%s · %s (%s)' % \ - (tokens[1], book['author'], tokens[0]), dest='title'))) + (tokens[2].strip(), book['author'], tokens[0]), dest='title'))) else: if self.generateForKindle: # Don't include Author for Kindle @@ -2898,6 +3107,98 @@ class EPUB_MOBI(CatalogPlugin): self.ncxSoup = ncx_soup + def generateNCXBySeries(self, tocTitle): + self.updateProgressFullStep("NCX 'Series'") + + def add_to_series_by_letter(current_series_list): + current_series_list = " • ".join(current_series_list) + current_series_list = self.formatNCXText(current_series_list, dest="description") + series_by_letter.append(current_series_list) + + soup = self.ncxSoup + output = "BySeries" + body = soup.find("navPoint") + btc = len(body.contents) + + # --- Construct the 'Books By Series' section --- + navPointTag = Tag(soup, 'navPoint') + navPointTag['class'] = "section" + navPointTag['id'] = "byseries-ID" + navPointTag['playOrder'] = self.playOrder + self.playOrder += 1 + navLabelTag = Tag(soup, 'navLabel') + textTag = Tag(soup, 'text') + textTag.insert(0, NavigableString(tocTitle)) + navLabelTag.insert(0, textTag) + nptc = 0 + navPointTag.insert(nptc, navLabelTag) + nptc += 1 + contentTag = Tag(soup,"content") + contentTag['src'] = "content/%s.html#section_start" % (output) + navPointTag.insert(nptc, contentTag) + nptc += 1 + + series_by_letter = [] + + # Loop over the series titles, find start of each letter, add description_preview_count books + # Special switch for using different title list + title_list = self.booksBySeries + current_letter = self.letter_or_symbol(title_list[0]['series'][0]) + title_letters = [current_letter] + current_series_list = [] + current_series = "" + for book in title_list: + sort_title = self.generateSortTitle(book['series']) + if self.letter_or_symbol(sort_title[0]) != current_letter: + # Save the old list + add_to_series_by_letter(current_series_list) + + # Start the new list + current_letter = self.letter_or_symbol(sort_title[0]) + title_letters.append(current_letter) + current_series = book['series'] + current_series_list = [book['series']] + else: + if len(current_series_list) < self.descriptionClip and \ + book['series'] != current_series : + current_series = book['series'] + current_series_list.append(book['series']) + + # Add the last book list + add_to_series_by_letter(current_series_list) + + # Add *article* entries for each populated series title letter + for (i,books) in enumerate(series_by_letter): + navPointByLetterTag = Tag(soup, 'navPoint') + navPointByLetterTag['class'] = "article" + navPointByLetterTag['id'] = "%sSeries-ID" % (title_letters[i].upper()) + navPointTag['playOrder'] = self.playOrder + self.playOrder += 1 + navLabelTag = Tag(soup, 'navLabel') + textTag = Tag(soup, 'text') + textTag.insert(0, NavigableString(u"Series beginning with %s" % \ + (title_letters[i] if len(title_letters[i])>1 else "'" + title_letters[i] + "'"))) + navLabelTag.insert(0, textTag) + navPointByLetterTag.insert(0,navLabelTag) + contentTag = Tag(soup, 'content') + contentTag['src'] = "content/%s.html#%s_series" % (output, title_letters[i]) + navPointByLetterTag.insert(1,contentTag) + + if self.generateForKindle: + cmTag = Tag(soup, '%s' % 'calibre:meta') + cmTag['name'] = "description" + cmTag.insert(0, NavigableString(self.formatNCXText(books, dest='description'))) + navPointByLetterTag.insert(2, cmTag) + + navPointTag.insert(nptc, navPointByLetterTag) + nptc += 1 + + # Add this section to the body + body.insert(btc, navPointTag) + btc += 1 + + self.ncxSoup = soup + def generateNCXByTitle(self, tocTitle): self.updateProgressFullStep("NCX 'Titles'") @@ -3729,7 +4030,7 @@ class EPUB_MOBI(CatalogPlugin): btc += 1 titleTag = body.find(attrs={'class':'title'}) - titleTag.insert(0,NavigableString('%s' % escape(self.getFriendlyGenreTag(genre)))) + titleTag.insert(0,NavigableString('%s' % escape(self.getFriendlyGenreTag(genre)))) # Insert the books by author list divTag = body.find(attrs={'class':'authors'}) @@ -3745,15 +4046,14 @@ class EPUB_MOBI(CatalogPlugin): current_series = None pAuthorTag = Tag(soup, "p") pAuthorTag['class'] = "author_index" - emTag = Tag(soup, "em") aTag = Tag(soup, "a") aTag['href'] = "%s.html#%s" % ("ByAlphaAuthor", self.generateAuthorAnchor(book['author'])) aTag.insert(0, book['author']) - emTag.insert(0,aTag) - pAuthorTag.insert(0,emTag) + pAuthorTag.insert(0,aTag) divTag.insert(dtc,pAuthorTag) dtc += 1 + ''' # Insert an
between non-series and series if not current_series and non_series_books and book['series']: # Insert an
@@ -3761,6 +4061,7 @@ class EPUB_MOBI(CatalogPlugin): hrTag['class'] = "series_divider" divTag.insert(dtc,hrTag) dtc += 1 + ''' # Check for series if book['series'] and book['series'] != current_series: @@ -3768,7 +4069,14 @@ class EPUB_MOBI(CatalogPlugin): current_series = book['series'] pSeriesTag = Tag(soup,'p') pSeriesTag['class'] = "series" - pSeriesTag.insert(0,NavigableString(self.NOT_READ_SYMBOL + book['series'])) + if self.opts.generate_series: + aTag = Tag(soup,'a') + aTag['href'] = "%s.html#%s_series" % ('BySeries', + re.sub('\W','',book['series']).lower()) + aTag.insert(0, book['series']) + pSeriesTag.insert(0, aTag) + else: + pSeriesTag.insert(0,NavigableString('%s' % book['series'])) divTag.insert(dtc,pSeriesTag) dtc += 1 @@ -3825,7 +4133,7 @@ class EPUB_MOBI(CatalogPlugin): def generateHTMLDescriptionHeader(self, title): title_border = '' if self.opts.fmt == 'epub' else \ - '

' + '
' header = ''' @@ -3871,7 +4179,7 @@ class EPUB_MOBI(CatalogPlugin):   -

+
@@ -3913,7 +4221,7 @@ class EPUB_MOBI(CatalogPlugin):

-

+
@@ -4065,6 +4373,12 @@ class EPUB_MOBI(CatalogPlugin): except: self.opts.log.error("generateThumbnail(): Error with %s" % title['title']) + def getFriendlyGenreTag(self, genre): + # Find the first instance of friendly_tag matching genre + for friendly_tag in self.genre_tags_dict: + if self.genre_tags_dict[friendly_tag] == genre: + return friendly_tag + def getMarkerTags(self): ''' Return a list of special marker tags to be excluded from genre list ''' markerTags = [] @@ -4079,12 +4393,6 @@ class EPUB_MOBI(CatalogPlugin): else: return char - def getFriendlyGenreTag(self, genre): - # Find the first instance of friendly_tag matching genre - for friendly_tag in self.genre_tags_dict: - if self.genre_tags_dict[friendly_tag] == genre: - return friendly_tag - def markdownComments(self, comments): ''' Convert random comment text to normalized, xml-legal block of

s @@ -4240,13 +4548,15 @@ class EPUB_MOBI(CatalogPlugin): opts.fmt = self.fmt = path_to_output.rpartition('.')[2] # Add local options - opts.creator = "calibre" + opts.creator = '%s, %s %s, %s' % (strftime('%A'), strftime('%B'), strftime('%d').lstrip('0'), strftime('%Y')) + opts.creator_sort_as = '%s %s' % ('calibre', strftime('%Y-%m-%d')) opts.connected_kindle = False # Finalize output_profile op = opts.output_profile if op is None: op = 'default' + if opts.connected_device['name'] and 'kindle' in opts.connected_device['name'].lower(): opts.connected_kindle = True if opts.connected_device['serial'] and opts.connected_device['serial'][:4] in ['B004','B005']: @@ -4272,7 +4582,8 @@ class EPUB_MOBI(CatalogPlugin): opts.exclude_genre = '\[^.\]' build_log.append(" converting empty exclude_genre to '\[^.\]'") - if opts.connected_device['name']: + if opts.connected_device['is_device_connected'] and \ + opts.connected_device['kind'] == 'device': if opts.connected_device['serial']: build_log.append(u" connected_device: '%s' #%s%s " % \ (opts.connected_device['name'], @@ -4283,9 +4594,14 @@ class EPUB_MOBI(CatalogPlugin): build_log.append(u" mount point: %s" % storage) else: build_log.append(u" connected_device: '%s'" % opts.connected_device['name']) - for storage in opts.connected_device['storage']: - if storage: - build_log.append(u" mount point: %s" % storage) + try: + for storage in opts.connected_device['storage']: + if storage: + build_log.append(u" mount point: %s" % storage) + except: + build_log.append(u" (no mount points)") + else: + build_log.append(u" connected_device: '%s'" % opts.connected_device['name']) opts_dict = vars(opts) if opts_dict['ids']: diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index ea42fe5998..9a2d0b0a62 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -324,6 +324,7 @@ def do_remove(db, ids): db.delete_book(y) send_message() + db.clean() def remove_option_parser(): return get_parser(_( @@ -449,6 +450,7 @@ def command_show_metadata(args, dbpath): def do_set_metadata(db, id, stream): mi = OPF(stream) db.set_metadata(id, mi) + db.clean() do_show_metadata(db, id, False) send_message() @@ -574,6 +576,9 @@ def command_add_custom_column(args, dbpath): return 1 do_add_custom_column(get_db(dbpath, opts), args[0], args[1], args[2], opts.is_multiple, json.loads(opts.display)) + # Re-open the DB so that field_metadata is reflects the column changes + db = get_db(dbpath, opts) + db.prefs['field_metadata'] = db.field_metadata.all_metadata() return 0 def catalog_option_parser(args): @@ -672,7 +677,14 @@ def command_catalog(args, dbpath): # No support for connected device in CLI environment # Parallel initialization in calibre.gui2.tools:generate_catalog() - opts.connected_device = { 'storage':None,'serial':None,'save_template':None,'name':None} + opts.connected_device = { + 'is_device_connected': False, + 'kind': None, + 'name': None, + 'save_template': None, + 'serial': None, + 'storage': None, + } with plugin: plugin.run(args[1], opts, get_db(dbpath, opts)) @@ -797,6 +809,9 @@ def command_remove_custom_column(args, dbpath): return 1 do_remove_custom_column(get_db(dbpath, opts), args[0], opts.force) + # Re-open the DB so that field_metadata is reflects the column changes + db = get_db(dbpath, opts) + db.prefs['field_metadata'] = db.field_metadata.all_metadata() return 0 def saved_searches_option_parser(): diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index ba4095fbc5..4106f8c965 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -6,7 +6,7 @@ __docformat__ = 'restructuredtext en' ''' The database used to store ebook metadata ''' -import os, sys, shutil, cStringIO, glob, time, functools, traceback +import os, sys, shutil, cStringIO, glob, time, functools, traceback, re from itertools import repeat from math import floor @@ -144,7 +144,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.initialize_dynamic() def initialize_dynamic(self): + self.field_metadata = FieldMetadata() #Ensure we start with a clean copy self.prefs = DBPrefs(self) + defs = self.prefs.defaults + defs['gui_restriction'] = defs['cs_restriction'] = '' # Migrate saved search and user categories to db preference scheme def migrate_preference(key, default): @@ -287,16 +290,21 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # Reconstruct the user categories, putting them into field_metadata # Assumption is that someone else will fix them if they change. + self.field_metadata.remove_dynamic_categories() tb_cats = self.field_metadata - for k in tb_cats.keys(): - if tb_cats[k]['kind'] in ['user', 'search']: - del tb_cats[k] for user_cat in sorted(self.prefs.get('user_categories', {}).keys()): cat_name = user_cat+':' # add the ':' to avoid name collision tb_cats.add_user_category(label=cat_name, name=user_cat) if len(saved_searches().names()): tb_cats.add_search_category(label='search', name=_('Searches')) + gst = tweaks['grouped_search_terms'] + for t in gst: + try: + self.field_metadata._add_search_terms_to_map(gst[t], [t]) + except ValueError: + traceback.print_exc() + self.book_on_device_func = None self.data = ResultCache(self.FIELD_MAP, self.field_metadata) self.search = self.data.search @@ -322,7 +330,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): for prop in ('author_sort', 'authors', 'comment', 'comments', 'isbn', 'publisher', 'rating', 'series', 'series_index', 'tags', - 'title', 'timestamp', 'uuid', 'pubdate'): + 'title', 'timestamp', 'uuid', 'pubdate', 'ondevice'): setattr(self, prop, functools.partial(get_property, loc=self.FIELD_MAP['comments' if prop == 'comment' else prop])) setattr(self, 'title_sort', functools.partial(get_property, @@ -550,6 +558,43 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return bool(self.conn.get('SELECT id FROM books where title=?', (title,), all=False)) return False + def find_identical_books(self, mi): + fuzzy_title_patterns = [(re.compile(pat), repl) for pat, repl in + [ + (r'[\[\](){}<>\'";,:#]', ''), + (r'^(the|a|an) ', ''), + (r'[-._]', ' '), + (r'\s+', ' ') + ] + ] + + def fuzzy_title(title): + title = title.strip().lower() + for pat, repl in fuzzy_title_patterns: + title = pat.sub(repl, title) + return title + + identical_book_ids = set([]) + if mi.authors: + try: + query = u' and '.join([u'author:"=%s"'%(a.replace('"', '')) for a in + mi.authors]) + except ValueError: + return identical_book_ids + try: + book_ids = self.data.parse(query) + except: + import traceback + traceback.print_exc() + return identical_book_ids + for book_id in book_ids: + fbook_title = self.title(book_id, index_is_id=True) + fbook_title = fuzzy_title(fbook_title) + mbook_title = fuzzy_title(mi.title) + if fbook_title == mbook_title: + identical_book_ids.add(book_id) + return identical_book_ids + def has_cover(self, index, index_is_id=False): id = index if index_is_id else self.id(index) path = os.path.join(self.library_path, self.path(id, index_is_id=True), 'cover.jpg') @@ -593,16 +638,17 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def book_on_device_string(self, id): loc = [] + count = 0 on = self.book_on_device(id) if on is not None: - m, a, b = on + m, a, b, count = on[:4] if m is not None: loc.append(_('Main')) if a is not None: loc.append(_('Card A')) if b is not None: loc.append(_('Card B')) - return ', '.join(loc) + return ', '.join(loc) + ((' (%s books)'%count) if count > 1 else '') def set_book_on_device_func(self, func): self.book_on_device_func = func @@ -1079,7 +1125,6 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if not authors: authors = [_('Unknown')] self.conn.execute('DELETE FROM books_authors_link WHERE book=?',(id,)) - self.conn.execute('DELETE FROM authors WHERE (SELECT COUNT(id) FROM books_authors_link WHERE author=authors.id) < 1') for a in authors: if not a: continue @@ -1681,7 +1726,18 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): path = path_or_stream return run_plugins_on_import(path, format) + def _add_newbook_tag(self, mi): + tags = prefs['new_book_tags'] + if tags: + for tag in [t.strip() for t in tags]: + if tag: + if mi.tags is None: + mi.tags = [tag] + else: + mi.tags.append(tag) + def create_book_entry(self, mi, cover=None, add_duplicates=True): + self._add_newbook_tag(mi) if not add_duplicates and self.has_book(mi): return None series_index = 1.0 if mi.series_index is None else mi.series_index @@ -1720,6 +1776,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): ids = [] for path in paths: mi = metadata.next() + self._add_newbook_tag(mi) format = formats.next() if not add_duplicates and self.has_book(mi): duplicates.append((path, format, mi)) @@ -1758,8 +1815,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return (paths, formats, metadata), len(ids) return None, len(ids) - def import_book(self, mi, formats, notify=True, import_hooks=True): + def import_book(self, mi, formats, notify=True, import_hooks=True, + apply_import_tags=True): series_index = 1.0 if mi.series_index is None else mi.series_index + if apply_import_tags: + self._add_newbook_tag(mi) if not mi.title: mi.title = _('Unknown') if not mi.authors: @@ -2090,8 +2150,6 @@ books_series_link feeds os.remove(self.dbpath) shutil.copyfile(dest, self.dbpath) self.connect() - self.field_metadata.remove_dynamic_categories() - self.field_metadata.remove_custom_fields() self.initialize_dynamic() self.refresh() if os.path.exists(dest): diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index 2a79c3a75b..66cdee51f0 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -306,7 +306,7 @@ class FieldMetadata(dict): self._tb_cats[k]['label'] = k self._tb_cats[k]['display'] = {} self._tb_cats[k]['is_editable'] = True - self._add_search_terms_to_map(k, self._tb_cats[k]['search_terms']) + self._add_search_terms_to_map(k, v['search_terms']) self.custom_field_prefix = '#' self.get = self._tb_cats.get @@ -371,6 +371,12 @@ class FieldMetadata(dict): def get_custom_fields(self): return [l for l in self._tb_cats if self._tb_cats[l]['is_custom']] + def all_metadata(self): + l = {} + for k in self._tb_cats: + l[k] = self._tb_cats[k] + return l + def get_custom_field_metadata(self): l = {} for k in self._tb_cats: @@ -408,10 +414,6 @@ class FieldMetadata(dict): self._add_search_terms_to_map(key, [key]) self.custom_label_to_key_map[label+'_index'] = key - def remove_custom_fields(self): - for key in self.get_custom_fields(): - del self._tb_cats[key] - def remove_dynamic_categories(self): for key in list(self._tb_cats.keys()): val = self._tb_cats[key] @@ -475,9 +477,7 @@ class FieldMetadata(dict): # ]) def get_search_terms(self): - s_keys = [] - for v in self._tb_cats.itervalues(): - map((lambda x:s_keys.append(x)), v['search_terms']) + s_keys = sorted(self._search_term_map.keys()) for v in self.search_items: s_keys.append(v) # if set(s_keys) != self.DEFAULT_LOCATIONS: @@ -488,6 +488,9 @@ class FieldMetadata(dict): def _add_search_terms_to_map(self, key, terms): if terms is not None: for t in terms: + t = t.lower() + if t in self._search_term_map: + raise ValueError('Attempt to add duplicate search term "%s"'%t) self._search_term_map[t] = key def search_term_to_key(self, term): diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 15020855f7..f5c4063789 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -61,7 +61,7 @@ def config(defaults=None): 'actual e-book file(s).')) x('formats', default='all', help=_('Comma separated list of formats to save for each book.' - ' By default all available books are saved.')) + ' By default all available formats are saved.')) x('template', default=DEFAULT_TEMPLATE, help=_('The template to control the filename and directory structure of the saved files. ' 'Default is "%s" which will save books into a per-author ' diff --git a/src/calibre/library/server/mobile.py b/src/calibre/library/server/mobile.py index aa7a740972..229e0c21c4 100644 --- a/src/calibre/library/server/mobile.py +++ b/src/calibre/library/server/mobile.py @@ -13,11 +13,11 @@ from lxml import html from lxml.html.builder import HTML, HEAD, TITLE, LINK, DIV, IMG, BODY, \ OPTION, SELECT, INPUT, FORM, SPAN, TABLE, TR, TD, A, HR -from calibre.library.server.utils import strftime +from calibre.library.server.utils import strftime, format_tag_string from calibre.ebooks.metadata import fmt_sidx from calibre.constants import __appname__ from calibre import human_readable -from calibre.utils.date import utcfromtimestamp +from calibre.utils.date import utcfromtimestamp, format_date def CLASS(*args, **kwargs): # class is a reserved word in Python kwargs['class'] = ' '.join(args) @@ -85,7 +85,7 @@ def build_navigation(start, num, total, url_base): # {{{ # }}} -def build_index(books, num, search, sort, order, start, total, url_base): +def build_index(books, num, search, sort, order, start, total, url_base, CKEYS): logo = DIV(IMG(src='/static/calibre.png', alt=__appname__), id='logo') search_box = build_search_box(num, search, sort, order) @@ -123,10 +123,16 @@ def build_index(books, num, search, sort, order, start, total, url_base): series = u'[%s - %s]'%(book['series'], book['series_index']) \ if book['series'] else '' - tags = u'[%s]'%book['tags'] if book['tags'] else '' + tags = u'Tags=[%s]'%book['tags'] if book['tags'] else '' - text = u'\u202f%s %s by %s - %s - %s %s' % (book['title'], series, - book['authors'], book['size'], book['timestamp'], tags) + ctext = '' + for key in CKEYS: + val = book.get(key, None) + if val: + ctext += '%s=[%s] '%tuple(val.split(':#:')) + + text = u'\u202f%s %s by %s - %s - %s %s %s' % (book['title'], series, + book['authors'], book['size'], book['timestamp'], tags, ctext) if last is None: data.text = text @@ -150,7 +156,7 @@ def build_index(books, num, search, sort, order, start, total, url_base): class MobileServer(object): 'A view optimized for browsers in mobile devices' - MOBILE_UA = re.compile('(?i)(?:iPhone|Opera Mini|NetFront|webOS|Mobile|Android|imode|DoCoMo|Minimo|Blackberry|MIDP|Symbian|HD2)') + MOBILE_UA = re.compile('(?i)(?:iPhone|Opera Mini|NetFront|webOS|Mobile|Android|imode|DoCoMo|Minimo|Blackberry|MIDP|Symbian|HD2|Kindle)') def add_routes(self, connect): connect('mobile', '/mobile', self.mobile) @@ -189,6 +195,10 @@ class MobileServer(object): if sort is not None: self.sort(items, sort, (order.lower().strip() == 'ascending')) + CFM = self.db.field_metadata + CKEYS = [key for key in sorted(CFM.get_custom_fields(), + cmp=lambda x,y: cmp(CFM[x]['name'].lower(), + CFM[y]['name'].lower()))] books = [] for record in items[(start-1):(start-1)+num]: book = {'formats':record[FM['formats']], 'size':record[FM['size']]} @@ -203,12 +213,37 @@ class MobileServer(object): book['authors'] = authors book['series_index'] = fmt_sidx(float(record[FM['series_index']])) book['series'] = record[FM['series']] - book['tags'] = record[FM['tags']] + book['tags'] = format_tag_string(record[FM['tags']], ',') book['title'] = record[FM['title']] for x in ('timestamp', 'pubdate'): book[x] = strftime('%Y/%m/%d %H:%M:%S', record[FM[x]]) book['id'] = record[FM['id']] books.append(book) + for key in CKEYS: + def concat(name, val): + return '%s:#:%s'%(name, unicode(val)) + val = record[CFM[key]['rec_index']] + if val: + datatype = CFM[key]['datatype'] + if datatype in ['comments']: + continue + name = CFM[key]['name'] + if datatype == 'text' and CFM[key]['is_multiple']: + book[key] = concat(name, format_tag_string(val, '|')) + elif datatype == 'series': + book[key] = concat(name, '%s [%s]'%(val, + fmt_sidx(record[CFM.cc_series_index_column_for(key)]))) + elif datatype == 'datetime': + book[key] = concat(name, + format_date(val, CFM[key]['display'].get('date_format','dd MMM yyyy'))) + elif datatype == 'bool': + if val: + book[key] = concat(name, __builtin__._('Yes')) + else: + book[key] = concat(name, __builtin__._('No')) + else: + book[key] = concat(name, val) + updated = self.db.last_modified() cherrypy.response.headers['Content-Type'] = 'text/html; charset=utf-8' @@ -218,7 +253,7 @@ class MobileServer(object): url_base = "/mobile?search=" + search+";order="+order+";sort="+sort+";num="+str(num) return html.tostring(build_index(books, num, search, sort, order, - start, len(ids), url_base), + start, len(ids), url_base, CKEYS), encoding='utf-8', include_meta_content_type=True, pretty_print=True) diff --git a/src/calibre/library/server/utils.py b/src/calibre/library/server/utils.py index ad5aaac169..23916aa75c 100644 --- a/src/calibre/library/server/utils.py +++ b/src/calibre/library/server/utils.py @@ -11,6 +11,7 @@ import cherrypy from calibre import strftime as _strftime, prints from calibre.utils.date import now as nowf +from calibre.utils.config import tweaks def expose(func): @@ -43,4 +44,14 @@ def strftime(fmt='%Y/%m/%d %H:%M:%S', dt=None): except: return _strftime(fmt, nowf().timetuple()) +def format_tag_string(tags, sep): + MAX = tweaks['max_content_server_tags_shown'] + if tags: + tlist = [t.strip() for t in tags.split(sep)] + else: + tlist = [] + tlist.sort(cmp=lambda x,y:cmp(x.lower(), y.lower())) + if len(tlist) > MAX: + tlist = tlist[:MAX]+['...'] + return u'%s'%(', '.join(tlist)) if tlist else '' diff --git a/src/calibre/library/server/xml.py b/src/calibre/library/server/xml.py index 9db786953e..ed8479980e 100644 --- a/src/calibre/library/server/xml.py +++ b/src/calibre/library/server/xml.py @@ -11,10 +11,11 @@ import cherrypy from lxml.builder import ElementMaker from lxml import etree -from calibre.library.server.utils import strftime +from calibre.library.server.utils import strftime, format_tag_string from calibre.ebooks.metadata import fmt_sidx from calibre.constants import preferred_encoding from calibre import isbytestring +from calibre.utils.date import format_date E = ElementMaker() @@ -83,9 +84,44 @@ class XMLServer(object): for x in ('isbn', 'formats', 'series', 'tags', 'publisher', 'comments'): y = record[FM[x]] + if x == 'tags': + y = format_tag_string(y, ',') kwargs[x] = serialize(y) if y else '' c = kwargs.pop('comments') + + CFM = self.db.field_metadata + CKEYS = [key for key in sorted(CFM.get_custom_fields(), + cmp=lambda x,y: cmp(CFM[x]['name'].lower(), + CFM[y]['name'].lower()))] + custcols = [] + for key in CKEYS: + def concat(name, val): + return '%s:#:%s'%(name, unicode(val)) + val = record[CFM[key]['rec_index']] + if val: + datatype = CFM[key]['datatype'] + if datatype in ['comments']: + continue + k = str('CF_'+key[1:]) + name = CFM[key]['name'] + custcols.append(k) + if datatype == 'text' and CFM[key]['is_multiple']: + kwargs[k] = concat(name, format_tag_string(val,'|')) + elif datatype == 'series': + kwargs[k] = concat(name, '%s [%s]'%(val, + fmt_sidx(record[CFM.cc_series_index_column_for(key)]))) + elif datatype == 'datetime': + kwargs[k] = concat(name, + format_date(val, CFM[key]['display'].get('date_format','dd MMM yyyy'))) + elif datatype == 'bool': + if val: + kwargs[k] = concat(name, __builtin__._('Yes')) + else: + kwargs[k] = concat(name, __builtin__._('No')) + else: + kwargs[k] = concat(name, val) + kwargs['custcols'] = ','.join(custcols) books.append(E.book(c, **kwargs)) updated = self.db.last_modified() diff --git a/src/calibre/linux.py b/src/calibre/linux.py index 9323581c53..eceea6a262 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -334,7 +334,7 @@ class PostInstall: with TemporaryDirectory() as tdir: with CurrentDir(tdir): - render_img('mimetypes/lrf.svg', 'calibre-lrf.png') + render_img('mimetypes/lrf.png', 'calibre-lrf.png') check_call('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf', shell=True) self.icon_resources.append(('mimetypes', 'application-lrf', '128')) check_call('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs', shell=True) @@ -343,7 +343,7 @@ class PostInstall: render_img('lt.png', 'calibre-gui.png') check_call('xdg-icon-resource install --noupdate --size 128 calibre-gui.png calibre-gui', shell=True) self.icon_resources.append(('apps', 'calibre-gui', '128')) - render_img('viewer.svg', 'calibre-viewer.png') + render_img('viewer.png', 'calibre-viewer.png') check_call('xdg-icon-resource install --size 128 calibre-viewer.png calibre-viewer', shell=True) self.icon_resources.append(('apps', 'calibre-viewer', '128')) diff --git a/src/calibre/manual/custom.py b/src/calibre/manual/custom.py index eb0a65ac33..80eeb59e0b 100644 --- a/src/calibre/manual/custom.py +++ b/src/calibre/manual/custom.py @@ -28,7 +28,7 @@ Command Line Interface .. image:: ../images/cli.png -On OS X you have to go to Preferences->Advanced and click install command line +On OS X you have to go to Preferences->Advanced->Miscellaneous and click install command line tools to make the command line tools available. On other platforms, just start a terminal and type the command. diff --git a/src/calibre/manual/customize.rst b/src/calibre/manual/customize.rst index 0dd2e349f3..c35defc0b0 100644 --- a/src/calibre/manual/customize.rst +++ b/src/calibre/manual/customize.rst @@ -11,7 +11,7 @@ Customizing |app| *recipes* to add new sources of online content to |app| in the Section :ref:`news`. Here, you will learn, first, how to use environment variables and *tweaks* to customize |app|'s behavior, and then how to specify your own static resources like icons and templates to override the defaults and finally how to -use *plugins* to add funtionality to |app|. +use *plugins* to add functionality to |app|. .. contents:: :depth: 2 @@ -45,7 +45,7 @@ All static resources are stored in the resources sub-folder of the calibre insta from the calibre website it will be :file:`/opt/calibre/resources`. These paths can change depending on where you choose to install |app|. You should not change the files in this resources folder, as your changes will get overwritten the next time you update |app|. Instead, go to -:guilabel:`Preferences->Advanced` and click :guilabel:`Open calibre configuration directory`. In this configuration directory, create a sub-folder called resources and place the files you want to override in it. Place the files in the appropriate sub folders, for example place images in :file:`resources/images`, etc. +:guilabel:`Preferences->Advanced->Miscellaneous` and click :guilabel:`Open calibre configuration directory`. In this configuration directory, create a sub-folder called resources and place the files you want to override in it. Place the files in the appropriate sub folders, for example place images in :file:`resources/images`, etc. |app| will automatically use your custom file in preference to the builtin one the next time it is started. For example, if you wanted to change the icon for the :guilabel:`Remove books` action, you would first look in the builtin resources folder and see that the relevant file is diff --git a/src/calibre/manual/develop.rst b/src/calibre/manual/develop.rst index ca067e45bc..f95d51bfca 100644 --- a/src/calibre/manual/develop.rst +++ b/src/calibre/manual/develop.rst @@ -123,7 +123,7 @@ the previously checked out calibre code directory, for example:: cd /Users/kovid/work/calibre -calibre is the directory that contains the src and resources sub directories. Ensure you have installed the |app| commandline tools via Preferences->Advanced in the |app| GUI. +calibre is the directory that contains the src and resources sub directories. Ensure you have installed the |app| commandline tools via :guilabel:Preferences->Advanced->Miscellaneous in the |app| GUI. The next step is to set the environment variable ``CALIBRE_DEVELOP_FROM`` to the absolute path to the src directory. So, following the example above, it would be ``/Users/kovid/work/calibre/src``. Apple diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index efc05a3f38..b93444f4c3 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -62,7 +62,7 @@ How do I convert my file containing non-English characters, or smart quotes? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ There are two aspects to this problem: 1. Knowing the encoding of the source file: |app| tries to guess what character encoding your source files use, but often, this is impossible, so you need to tell it what encoding to use. This can be done in the GUI via the :guilabel:`Input character encoding` field in the :guilabel:`Look & Feel` section. The command-line tools all have an :option:`--input-encoding` option. - 2. When adding HTML files to |app|, you may need to tell |app| what encoding the files are in. To do this go to Preferences->Plugins->File Type plugins and customize the HTML2Zip plugin, telling it what encoding your HTML files are in. Now when you add HTML files to |app| they will be correctly processed. HTML files from different sources often have different encodings, so you may have to change this setting repeatedly. A common encoding for many files from the web is ``cp1252`` and I would suggest you try that first. Note that when converting HTML files, leave the input encoding setting mentioned above blank. This is because the HTML2ZIP plugin automatically converts the HTML files to a standard encoding (utf-8). + 2. When adding HTML files to |app|, you may need to tell |app| what encoding the files are in. To do this go to :guilabel:`Preferences->Advanced->Plugins->File Type plugins` and customize the HTML2Zip plugin, telling it what encoding your HTML files are in. Now when you add HTML files to |app| they will be correctly processed. HTML files from different sources often have different encodings, so you may have to change this setting repeatedly. A common encoding for many files from the web is ``cp1252`` and I would suggest you try that first. Note that when converting HTML files, leave the input encoding setting mentioned above blank. This is because the HTML2ZIP plugin automatically converts the HTML files to a standard encoding (utf-8). 3. Embedding fonts: If you are generating an LRF file to read on your SONY Reader, you are limited by the fact that the Reader only supports a few non-English characters in the fonts it comes pre-loaded with. You can work around this problem by embedding a unicode-aware font that supports the character set your file uses into the LRF file. You should embed atleast a serif and a sans-serif font. Be aware that embedding fonts significantly slows down page-turn speed on the reader. @@ -92,7 +92,7 @@ We just need some information from you: * What e-book formats does your device support? * Is there a special directory on the device in which all e-book files should be placed? * We also need information about your device that |app| will collect automatically. First, if your - device supports SD cards, insert them. Then connect your device. In calibre go to Preferences->Advanced + device supports SD cards, insert them. Then connect your device. In calibre go to :guilabel:`Preferences->Advanced->Miscellaneous` and click the "Debug device detection" button. This will create some debug output. Copy it to a file and repeat the process, this time with your device disconnected. * Send both the above outputs to us with the other information and we will write a device driver for your @@ -109,11 +109,11 @@ of which books are members are shown on the device view. When you send a book to the reader, |app| will add the book to collections based on the metadata for that book. By default, collections are created from tags and series. You can control what metadata is used by going to -Preferences->Plugins->Device Interface plugins and customizing the SONY device interface plugin. If you remove all +:guilabel:`Preferences->Advanced->Plugins->Device Interface plugins` and customizing the SONY device interface plugin. If you remove all values, |app| will not add the book to any collection. Collection management is largely controlled by the 'Metadata management' option found at -Preferences->Add/Save->Sending to device. If set to 'Manual' (the default), managing collections is left to +:guilabel:`Preferences->Import/Export->Sending books to devices`. If set to 'Manual' (the default), managing collections is left to the user; |app| will not delete already existing collections for a book on your reader when you resend the book to the reader, but |app| will add the book to collections if necessary. To ensure that the collections for a book are based only on current |app| metadata, first delete the books from the reader, then resend the @@ -185,8 +185,8 @@ The easiest way to browse your |app| collection on your Apple device (iPad/iPhon First perform the following steps in |app| - * Set the Preferred Output Format in |app| to EPUB (The output format can be set under Preferences->General) - * Set the output profile to iPad (this will work for iPhone/iPods as well), under Preferences->Conversion->Page Setup + * Set the Preferred Output Format in |app| to EPUB (The output format can be set under :guilabel:`Preferences->Interface->Behavior`) + * Set the output profile to iPad (this will work for iPhone/iPods as well), under :guilabel:`Preferences->Conversion->Common Options->Page Setup` * Convert the books you want to read on your iPhone to EPUB format by selecting them and clicking the Convert button. * Turn on the Content Server in |app|'s preferences and leave |app| running. @@ -217,13 +217,13 @@ Can I access my |app| books using the web browser in my Kindle or other reading ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |app| has a *Content Server* that exports the books in |app| as a web page. You can turn it on under -Preferences->Content Server. Then just point the web browser on your device to the computer running +:guilabel:`Preferences->Network->Sharing over the net`. Then just point the web browser on your device to the computer running the Content Server and you will be able to browse your book collection. For example, if the computer running the server has IP address 63.45.128.5, in the browser, you would type:: http://63.45.128.5:8080 -Some devices, like the Kindle, do not allow you to access port 8080 (the default port on which the content +Some devices, like the Kindle (1/2/DX), do not allow you to access port 8080 (the default port on which the content server runs. In that case, change the port in the |app| Preferences to 80. (On some operating systems, you may not be able to run the server on a port number less than 1024 because of security settings. In this case the simplest solution is to adjust your router to forward requests on port 80 to port 8080). @@ -277,14 +277,14 @@ In |app|, you would instead use tags to mark genre and read status and then just Why doesn't |app| have a column for foo? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -|app| is designed to have columns for the most frequently and widely used fields. In addition, you can add any columns you like. Columns can be added via Preferences->Interface. +|app| is designed to have columns for the most frequently and widely used fields. In addition, you can add any columns you like. Columns can be added via :guilabel:`Preferences->Interface->Add your own columns`. Watch the tutorial `UI Power tips `_ to learn how to create your own columns. How do I move my |app| library from one computer to another? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Simply copy the |app| library folder from the old to the new computer. You can find out what the library folder is by clicking the calibre icon in the toolbar. The very first item is the path to the library folder. Now on the new computer, start |app| for the first time. It will run the Welcome Wizard asking you for the location of the |app| library. Point it to the previously copied folder. -Note that if you are transferring between different types of computers (for example Windows to OS X) then after doing the above you should also go to Preferences->Advanced and click the Check database integrity button. It will warn you about missing files, if any, which you should then transfer by hand. +Note that if you are transferring between different types of computers (for example Windows to OS X) then after doing the above you should also go to :guilabel:`Preferences->Advanced->Miscellaneous` and click the "Check database integrity button". It will warn you about missing files, if any, which you should then transfer by hand. Content From The Web diff --git a/src/calibre/manual/gui.rst b/src/calibre/manual/gui.rst index e9573e91be..aa49c51b76 100644 --- a/src/calibre/manual/gui.rst +++ b/src/calibre/manual/gui.rst @@ -345,6 +345,8 @@ Calibre has several keyboard shortcuts to save you time and mouse movement. Thes - Show book details * - :kbd:`M` - Merge selected records + * - :kbd:`Alt+M` + - Merge selected records, keeping originals * - :kbd:`O` - Open containing folder * - :kbd:`S` diff --git a/src/calibre/manual/plugins.rst b/src/calibre/manual/plugins.rst index 8b6919db90..1b9b47ed3d 100644 --- a/src/calibre/manual/plugins.rst +++ b/src/calibre/manual/plugins.rst @@ -165,3 +165,19 @@ User Interface Actions :members: :member-order: bysource +Preferences Plugins +-------------------------- + +.. autoclass:: calibre.customize.PreferencesPlugin + :show-inheritance: + :members: + :member-order: bysource + +.. autoclass:: calibre.gui2.preferences.ConfigWidgetInterface + :members: + :member-order: bysource + +.. autoclass:: calibre.gui2.preferences.ConfigWidgetBase + :members: + :member-order: bysource + diff --git a/src/calibre/manual/portable.rst b/src/calibre/manual/portable.rst index 2a88107842..a2c8e323d8 100644 --- a/src/calibre/manual/portable.rst +++ b/src/calibre/manual/portable.rst @@ -46,8 +46,8 @@ The steps required to prepare the USB stick are as follows: * Deselect the options for creating Menu shortcuts; creating a calibre shortcut on the desktop; and adding Calibre to the path * Create the CalibreLibrary folder inside the Calibre_Root_Folder. If you have an existing Calibre library copy it and all its contents to the CalibreLibrary folder. If you do not already have a library do not worry as a new one will be created at this location when Calibre is started. - * Create the CalibreConfig folder inside the Calibre_Root_Folder. This will hold your personal Calibre configuration settings. If you have an existing Calibre installation and want to copy the current settings then copy the contents of your current configuration folder to the CalibreConfig folder. You can find the location of your current configuration folder by going to Preferences->Advanced and clicking the “Open calibre configuration Directory” button. - * When you have started Calibre, go into Preferences->General and check that you have set the Job Priority to ‘Low’. This setting keeps single-processor Windows systems responsive without affecting Calibre performance to any noticeable degree. On multi-processor or multi-core systems this setting does not matter as much, but setting it will do no harm. + * Create the CalibreConfig folder inside the Calibre_Root_Folder. This will hold your personal Calibre configuration settings. If you have an existing Calibre installation and want to copy the current settings then copy the contents of your current configuration folder to the CalibreConfig folder. You can find the location of your current configuration folder by going to :guilabel:`Preferences->Advanced->Miscellaneous` and clicking the “Open calibre configuration Directory” button. + * When you have started Calibre, go into :guilabel:`Preferences->Interface->Behavior` and check that you have set the Job Priority to ‘Low’. This setting keeps single-processor Windows systems responsive without affecting Calibre performance to any noticeable degree. On multi-processor or multi-core systems this setting does not matter as much, but setting it will do no harm. Using calibre-portable.bat --------------------------- diff --git a/src/calibre/manual/viewer.rst b/src/calibre/manual/viewer.rst index dd70674b99..8fdbb4b021 100644 --- a/src/calibre/manual/viewer.rst +++ b/src/calibre/manual/viewer.rst @@ -18,7 +18,7 @@ Starting the viewer You can view any of the books in your |app| library by selecting the book and pressing the View button. This will open up the book in the e-book viewer. You can also launch the viewer by itself, from the Start menu in windows or using the command :command:`ebook-viewer` in Linux and OS X (you have to install the command line tools on OS X -first by going to Preferences->Advanced). +first by going to :guilabel:`Preferences->Advanced->Miscellaneous`). Navigating around an e-book ----------------------------- diff --git a/src/calibre/translations/ar.po b/src/calibre/translations/ar.po index 9bd380d661..2538d0a304 100644 --- a/src/calibre/translations/ar.po +++ b/src/calibre/translations/ar.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-08-20 20:19+0000\n" -"PO-Revision-Date: 2010-08-22 19:43+0000\n" -"Last-Translator: Kovid Goyal \n" +"POT-Creation-Date: 2010-09-05 23:43+0000\n" +"PO-Revision-Date: 2010-09-06 05:21+0000\n" +"Last-Translator: Hsn \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-08-23 03:53+0000\n" +"X-Launchpad-Export-Date: 2010-09-07 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -22,12 +22,13 @@ msgid "Does absolutely nothing" msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 -#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:72 -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:75 +#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:395 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:507 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:522 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -35,15 +36,15 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:407 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:70 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:72 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:335 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:338 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:336 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:339 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:236 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:279 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:282 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:398 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:240 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:283 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:286 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:20 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:21 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 @@ -100,22 +101,22 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:82 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:234 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:236 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:293 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:300 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:247 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:330 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:289 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:292 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1163 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1166 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1158 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 @@ -130,17 +131,17 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:186 #: /home/kovid/work/calibre/src/calibre/library/cli.py:213 #: /home/kovid/work/calibre/src/calibre/library/database.py:913 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:362 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:374 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1007 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1076 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1760 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1762 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1889 -#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:201 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139 -#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:70 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:375 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:387 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1057 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1126 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1825 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1827 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1954 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:211 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:140 +#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:71 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:117 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:64 @@ -158,23 +159,33 @@ msgstr "قاعدة" msgid "File type" msgstr "نوع الملف" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:206 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:208 msgid "Metadata reader" msgstr "قارئ دليل المعلومات" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:235 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:238 msgid "Metadata writer" msgstr "كاتب دليل المعلومات" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:263 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:268 msgid "Catalog generator" msgstr "مولد الكاتالوج" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:359 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:366 msgid "User Interface Action" -msgstr "" +msgstr "واجهة المستخدم" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:16 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 +msgid "Preferences" +msgstr "التفضيلات" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -183,7 +194,7 @@ msgstr "" "إلتحاق بكل الوصلات المحلية في ملف HTML وإنشاء ملف ZIP ليحتوي كل الملفات " "الموصولة. هذا الملحق ينفّذ كل مرة تضيف ملف HTML إلى المكتبة." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:52 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -191,7 +202,7 @@ msgstr "" "رمزالحروف لاجل ملفات HTML المدخلة, تشتمل على الخيارات التالية : cp1252, " "latin1, iso-8859-1 وutf-8" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:59 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -201,52 +212,210 @@ msgstr "" "pmlname_img او صور. هذا المضاف يتم تشغيله كل مرة اضيف فيها ملف PML الى " "المكتبة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:93 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 msgid "Extract cover from comic files" msgstr "استخرج الغلاف من ملف الرسومات" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:120 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:131 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:143 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:153 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:163 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:174 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:184 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:204 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:214 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:224 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:235 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:246 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:258 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:279 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:290 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:300 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:310 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:121 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:132 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:144 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:154 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:164 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:175 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:185 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:195 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:205 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:215 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:225 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:236 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:247 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:259 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:280 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:291 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:301 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:311 msgid "Read metadata from %s files" msgstr "يقرأ دليل المعلومات من الملفات %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:269 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:270 msgid "Read metadata from ebooks in RAR archives" msgstr "إقرأ دليل المعلومات لكتب في أرشيفات RAR" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:321 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:322 msgid "Read metadata from ebooks in ZIP archives" msgstr "إقرأ ميتاداتا لكتب في أرشيفات ZIP" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:334 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:344 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:354 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:376 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:387 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:397 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:335 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:345 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:355 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:377 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:388 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:398 msgid "Set metadata in %s files" msgstr "ضبط دليل المعلومات في الملفات %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:365 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:366 msgid "Set metadata from %s files" msgstr "ضبط دليل المعلومات من ملفات %s" +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:682 +msgid "Look and Feel" +msgstr "المظهر" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:684 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:707 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +msgid "Interface" +msgstr "الواجهة" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 +msgid "Adjust the look and feel of the calibre interface to suit your tastes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 +msgid "Behavior" +msgstr "سلوك" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 +msgid "Change the way calibre behaves" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:705 +msgid "Add your own columns" +msgstr "اضف عامودك الخاص" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +msgid "Add/remove your own columns to the calibre book list" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:716 +msgid "Customize the toolbar" +msgstr "خصِّص شريط الأدوات" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 +msgid "" +"Customize the toolbars and context menus, changing which actions are " +"available in each" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 +msgid "Input Options" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +msgid "Conversion" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 +msgid "Set conversion options specific to each input format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:739 +msgid "Common Options" +msgstr "خيارات متداولة" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +msgid "Set conversion options common to all formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:750 +msgid "Output Options" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 +msgid "Set conversion options specific to each output format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:761 +msgid "Adding books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +msgid "Import/Export" +msgstr "إستيراد/تصدير" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 +msgid "Control how calibre reads metadata from files when adding books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 +msgid "Saving books to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +msgid "" +"Control how calibre exports files from its database to disk when using Save " +"to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +msgid "Sending books to devices" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +msgid "Control how calibre transfers files to your ebook reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +msgid "Sharing books by email" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 +msgid "Sharing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +msgid "" +"Setup sharing of books via email. Can be used for automatic sending of " +"downloaded news to your devices" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +msgid "Sharing over the net" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 +msgid "" +"Setup the calibre Content Server which will give you access to your calibre " +"library from anywhere, on any device, over the internet" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 +msgid "Plugins" +msgstr "الملحقات" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 +msgid "Advanced" +msgstr "متقدّم" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +msgid "Add/remove/customize various bits of calibre functionality" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 +msgid "Tweaks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +msgid "Fine tune how calibre behaves in various contexts" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +msgid "Miscellaneous" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +msgid "Miscellaneous advanced configuration" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102 msgid "Conversion Input" msgstr "دخل التحويل" @@ -400,35 +569,35 @@ msgstr "" msgid "This profile is intended for the Amazon Kindle DX." msgstr "ملف التعريف هذا يستخدم مع Amazon Kindle DX" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:33 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 msgid "Installed plugins" msgstr "ملحقات مثبتة" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 msgid "Mapping for filetype plugins" msgstr "تعيين لملحقات أنواع الملفات" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:36 msgid "Local plugin customization" msgstr "تخصيص الملحقات المحلية" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:36 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:37 msgid "Disabled plugins" msgstr "ملحقات معطلة" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:37 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:38 msgid "Enabled plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:85 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 msgid "No valid plugin found in " msgstr "لا يجد ملحق صالح " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:489 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 msgid "Initialization of plugin %s failed with traceback:" msgstr "فشل استهلال الملحق %s مع اقتفاء الأثر:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:522 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 msgid "" " %prog options\n" "\n" @@ -440,29 +609,29 @@ msgstr "" " المقدرة على التخصيص بتحميل الملحقات الخارجية .\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:528 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "إضافة ملحق يتخصيص مسار إلى ملف zip الذي يحتويه." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "حذف الملحق المخصص عن طريق اسمه. لا يؤثر على الملحقات المضمنة" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:532 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." msgstr "تخصيص الملحق . حدد اسم الملحق وسلسلة التخصيص وفرقهما بفاصلة." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 msgid "List all installed plugins" msgstr "قائمة كل الملحقات المثبتة" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:536 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 msgid "Enable the named plugin" msgstr "تمكين الملحق المسمى" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:538 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 msgid "Disable the named plugin" msgstr "تعطيل الملحق المسمى" @@ -500,13 +669,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2822 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2861 msgid "%d of %d" -msgstr "" +msgstr "%d من %d" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:369 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:962 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2867 msgid "finished" -msgstr "" +msgstr "تم" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:544 msgid "Use Series as Category in iTunes/iBooks" @@ -534,16 +703,16 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:823 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:851 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:244 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:190 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:203 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1644 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:192 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:205 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1694 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:132 msgid "News" msgstr "الأخبار" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2729 msgid "Communicate with iTunes." -msgstr "" +msgstr "تواصل معا iTunes" #: /home/kovid/work/calibre/src/calibre/devices/binatone/driver.py:17 msgid "Communicate with the Binatone Readme eBook reader." @@ -551,7 +720,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13 msgid "Communicate with the Blackberry smart phone." -msgstr "" +msgstr "تواصل معا جهاز بلاك برري" #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:14 #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18 @@ -665,19 +834,19 @@ msgstr "التواصل مع القارئ الكتاب الاليكترونى Iri msgid "Communicate with the JetBook eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى JetBook ." -#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:86 +#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:88 msgid "Communicate with the MiBuk Wolder reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:42 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 msgid "Communicate with the Kindle eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى Kindle ." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:169 -msgid "Communicate with the Kindle 2 eBook reader." -msgstr "التواصل مع القارئ الكتاب الاليكترونى Kindle 2 ." +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:170 +msgid "Communicate with the Kindle 2/3 eBook reader." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:210 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:211 msgid "Communicate with the Kindle DX eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى Kindle DX ." @@ -688,7 +857,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:53 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:56 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:59 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:161 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:170 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -698,33 +867,33 @@ msgstr "" msgid "Getting list of books on device..." msgstr "يجري إحصاء قائمة كتب من الجهاز..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:221 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:265 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 msgid "Removing books from device..." msgstr "يجري حذف الكتب من الجهاز..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:269 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:276 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:285 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:281 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:315 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:290 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:324 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "إضافة كتب لقائمة البيانات الوصفية للجهاز ..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:366 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:251 msgid "Not Implemented" -msgstr "" +msgstr "غير مطبق" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:367 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:376 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." @@ -760,7 +929,7 @@ msgstr "التواصل مع نوكيا 810" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:74 msgid "Communicate with the Nokia E52" -msgstr "" +msgstr "تواصل معا جهاز نوكيا E52" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:20 msgid "The Nook" @@ -793,7 +962,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:145 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 msgid "Unnamed" -msgstr "" +msgstr "بلا اسم" #: /home/kovid/work/calibre/src/calibre/devices/sne/driver.py:17 msgid "Communicate with the Samsung SNE eBook reader." @@ -857,7 +1026,7 @@ msgstr "لا توجد مساحة كافية في بطاقة التخزين" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:12 msgid "Configure Device" -msgstr "" +msgstr "ضنط الجهاز" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:37 msgid "settings for device drivers" @@ -872,7 +1041,7 @@ msgid "Place files in sub directories if the device supports them" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:43 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:86 msgid "Read metadata from files on device" msgstr "" @@ -885,7 +1054,7 @@ msgid "Template to control how books are saved" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:89 msgid "Extra customization" msgstr "" @@ -1625,7 +1794,7 @@ msgstr "" msgid "Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:147 #: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:77 msgid "Table of Contents:" @@ -1643,20 +1812,27 @@ msgstr "" msgid "Add Table of Contents to beginning of the book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:248 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:24 +msgid "" +"Try to turn chapters into individual sections. WARNING: This option is " +"experimental. It can cause conversion to fail. It can also produce " +"unexpected output." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:249 msgid "" "Traverse links in HTML files breadth first. Normally, they are traversed " "depth first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:255 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:256 msgid "" "Maximum levels of recursion when following links in HTML files. Must be non-" "negative. 0 implies that no links in the root HTML file are followed. " "Default is %default." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:264 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:265 msgid "" "Normally this input plugin re-arranges all the input files into a standard " "folder hierarchy. Only use this option if you know what you are doing as it " @@ -1664,7 +1840,7 @@ msgid "" "pipeline." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:272 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:273 msgid "" "Average line length for line breaking if the HTML is from a previous partial " "conversion of a PDF file. Default is %default which disables this." @@ -1890,7 +2066,7 @@ msgstr "ضم أسرة الخطوط أحادية القياس" msgid "Comic" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:397 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 @@ -1899,11 +2075,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:887 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 msgid "Title" msgstr "العنوان" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:398 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:364 @@ -1911,30 +2087,30 @@ msgstr "العنوان" msgid "Author(s)" msgstr "المؤلف أو المؤلفون" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:399 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:403 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "الناشر" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:400 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:404 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "المنتج" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:405 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:210 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:99 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1079 msgid "Comments" msgstr "التعليقات" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:409 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:413 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 @@ -1944,7 +2120,7 @@ msgstr "التعليقات" msgid "Tags" msgstr "الوسوم" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:411 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:415 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 @@ -1954,22 +2130,22 @@ msgstr "الوسوم" msgid "Series" msgstr "السلسلة" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:412 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:416 msgid "Language" msgstr "اللغة" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:414 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 msgid "Timestamp" msgstr "ختم التوقيت" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:416 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:420 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:422 msgid "Rights" msgstr "" @@ -2246,7 +2422,7 @@ msgstr "صقحة العنوان" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "المحتويات" @@ -2599,7 +2775,7 @@ msgid "" "Specify the character encoding of the output document. The default is cp1252." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:194 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:196 msgid "" "This RTF file has a feature calibre does not support. Convert it to HTML " "first and then try it.\n" @@ -2661,262 +2837,266 @@ msgid "" "allows max-line-length to be below the minimum" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 msgid "Send file to storage card instead of main memory by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Confirm before deleting" msgstr "تأكيد قبل الحذف" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 msgid "Main window geometry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Notify when a new version is available" msgstr "Notify when a new version is available" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Use Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 msgid "Sort tags list by name, popularity, or rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Number of covers to show in the cover browsing mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Defaults for conversion to LRF" msgstr "الإفتراضي للتحويل إلى LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 msgid "Options for the LRF ebook viewer" msgstr "الخيارات لمستعرض كتب LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:84 msgid "Formats that are viewed using the internal viewer" msgstr "تهيئات التي تعرض عن طريق المستعرض الداخلي" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 msgid "Columns to be displayed in the book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 msgid "Automatically launch content server on application startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Oldest news kept in database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Show system tray icon" msgstr "إظهار أيقونة صينية النظام" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 msgid "Upload downloaded news to device" msgstr "رفع أخبار تم تنزيلها إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Delete books from library after uploading to device" msgstr "حذف كتب من المكتبة بعد رفعها إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "Disable notifications from the system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Default action to perform when send to device button is clicked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:119 msgid "Maximum number of waiting worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 msgid "Download social metadata (tags/rating/etc.)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 msgid "Overwrite author and title with new metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 msgid "tag browser categories not to display" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 msgid "The layout of the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 msgid "Show the average rating per item indication in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Disable UI animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:181 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:479 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:433 msgid "Choose Files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:25 -msgid "A" -msgstr "A" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:25 msgid "Add books" msgstr "إضافة كتب" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:26 +msgid "Add books to the calibre library/device from files on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:27 +msgid "A" +msgstr "A" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 msgid "Add books from a single directory" msgstr "إضافة كتب من دليل واحد" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 msgid "" "Add books from directories, including sub-directories (One book per " "directory, assumes every ebook file is the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 msgid "" "Add books from directories, including sub directories (Multiple books per " "directory, assumes every ebook file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:42 msgid "Add Empty book. (Book entry with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:44 msgid "Add from ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:83 msgid "How many empty books?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:140 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:200 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 msgid "Books" msgstr "كتب" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 msgid "EPUB Books" msgstr "كتب EPUB" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 msgid "LRF Books" msgstr "كتب LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 msgid "HTML Books" msgstr "كتب HTML" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 msgid "LIT Books" msgstr "كتب LIT" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 msgid "MOBI Books" msgstr "كتب MOBI" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "Text books" msgstr "كتب نصّية" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "PDF Books" msgstr "كتب PDF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "Comics" msgstr "الرسومات" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "Archives" msgstr "أرشيفات" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:209 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:210 msgid "" "Some duplicates were found and merged into the following existing books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:55 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 msgid "No book files found" msgstr "" @@ -2924,8 +3104,12 @@ msgstr "" msgid "Add books to library" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add_to_library.py:14 +msgid "Add books to your calibre library from the connected device" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:498 msgid "Fetch annotations (experimental)" msgstr "" @@ -2940,9 +3124,9 @@ msgid "User annotations generated from main library only" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 @@ -2980,81 +3164,120 @@ msgid "Location %d • %s
" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:33 msgid "Create catalog of books in your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:32 msgid "No books selected to generate catalog for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:49 msgid "Generating %s catalog..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 msgid "No books found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:55 msgid "" "No books to catalog\n" "Check exclude tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:65 msgid "Catalog generated." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 msgid "Export Catalog Directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 msgid "Select destination for %s.%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:62 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:111 msgid "%d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:82 msgid "Choose calibre library to work with" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81 -msgid "Switch to library..." +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:91 +msgid "Switch/create library..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:99 msgid "Quick switch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:101 +msgid "Rename library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:103 +msgid "Delete library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:168 +msgid "Rename" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:169 +msgid "Choose a new name for the library %s. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:170 +msgid "Note that the actual library folder will be renamed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 +msgid "Already exists" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:178 +msgid "The folder %s already exists. Delete it first." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:100 +msgid "Are you sure?" +msgstr "هل أنت متأكّد؟" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:187 +msgid "All files from %s will be permanently deleted. Are you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:207 msgid "No library found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:208 msgid "" "No existing calibre library was found at %s. It will be removed from the " "list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:245 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:542 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:241 msgid "You cannot change libraries when a device is connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:246 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -3066,58 +3289,58 @@ msgstr "C" msgid "Convert books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:27 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:29 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 msgid "Cannot convert" msgstr "لا يمكن تحويله" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:114 msgid "Starting conversion of %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:79 msgid "Copy to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:80 msgid "Copy selected books to the specified library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:114 msgid "Cannot copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:119 msgid "No library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 msgid "No library found at %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:127 msgid "Copying" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137 msgid "Could not copy books: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:671 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:234 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:140 msgid "Copied %d books to %s" msgstr "" @@ -3174,14 +3397,14 @@ msgid "Main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:436 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:435 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 msgid "Storage Card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:438 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:446 msgid "Storage Card B" msgstr "" @@ -3210,46 +3433,46 @@ msgid "" "you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:26 msgid "Connect to folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:31 msgid "Connect to iTunes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:48 msgid "Start Content Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:50 msgid "Stop Content Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:69 msgid "Email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:69 msgid " and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:81 msgid "Setup email based sharing of books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:98 msgid "D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:98 msgid "Send to device" msgstr "إرسال لجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:117 msgid "Connect/share" msgstr "" @@ -3257,6 +3480,10 @@ msgstr "" msgid "Manage collections" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_collections.py:14 +msgid "Manage the collections on this device" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 msgid "E" msgstr "E" @@ -3338,9 +3565,9 @@ msgid "Failed to download metadata:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:608 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:566 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:112 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "خطأ" @@ -3423,27 +3650,20 @@ msgstr "" msgid "Ctrl+P" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 -msgid "Preferences" -msgstr "التفضيلات" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 msgid "Run welcome wizard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:32 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:34 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:39 msgid "Cannot configure before calibre is restarted." msgstr "" @@ -3522,11 +3742,11 @@ msgstr "" msgid "I" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 msgid "No detailed information is available for books on the device." msgstr "" @@ -3542,27 +3762,27 @@ msgstr "" msgid "Books by same author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 -msgid "Alt+S" -msgstr "Alt+S" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 msgid "Books in this series" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 +msgid "Alt+Shift+S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 msgid "Alt+P" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 msgid "Books by this publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Books with the same tags" msgstr "كتب بنفس الوسوم" @@ -3613,60 +3833,60 @@ msgstr "" msgid "Searching in" msgstr "يتم البحث في" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:197 msgid "Adding..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:210 msgid "Searching in all sub-directories..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:223 msgid "Path error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:224 msgid "The specified directory could not be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:804 msgid "No books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:293 msgid "Added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:306 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:307 msgid "" "The add books process seems to have hung. Try restarting calibre and adding " "the books in smaller increments, until you find the problem book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:322 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:323 msgid "" "Books with the same title as the following already exist in the database. " "Add them anyway?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:326 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:393 msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:446 msgid "Saved" msgstr "تم الحفظ" @@ -3683,7 +3903,7 @@ msgid "Looking for duplicates based on file hash" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:70 msgid "Choose root folder" msgstr "" @@ -3700,7 +3920,7 @@ msgid "Add books to calibre" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:49 @@ -3716,15 +3936,15 @@ msgstr "" msgid "This may take a few minutes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 msgid "Choose the location to add books from" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64 msgid "Select a folder on your hard disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:65 msgid "" "

calibre can scan your computer for existing books automatically. These " "books will then be copied into the calibre library. This wizard will " @@ -3736,77 +3956,81 @@ msgid "" "not under the root folder you choose.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 msgid "&Root folder:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:69 msgid "" "This folder and its sub-folders will be scanned for books to import into " "calibre's library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:79 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:634 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:103 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:87 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:90 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:156 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:159 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:166 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:269 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:270 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:191 msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:72 msgid "Handle multiple files per book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:73 msgid "" "&One book per folder, assumes every ebook file in a folder is the same book " "in a different format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:74 msgid "" "&Multiple books per folder, assumes every ebook file is a different book" msgstr "" @@ -3831,8 +4055,8 @@ msgstr "المسار" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:100 msgid "Formats" msgstr "التهيئات" @@ -3855,9 +4079,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1074 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:293 msgid "None" msgstr "بدون" @@ -3907,13 +4131,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:88 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:31 @@ -3925,13 +4149,26 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:55 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 msgid "Form" msgstr "استمارة" @@ -4014,8 +4251,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:550 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1607 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1625 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1657 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1675 msgid "Catalog" msgstr "" @@ -4089,52 +4326,52 @@ msgid "input" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:99 msgid "&Number of Colors:" msgstr "&عدد الألوان:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:90 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:101 msgid "Disable &normalize" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:102 msgid "Keep &aspect ratio" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:103 msgid "Disable &Sharpening" msgstr "تعطيل تشحيذ&" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:109 msgid "Disable &Trimming" msgstr "تعطيل اقتصاص&" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:108 msgid "&Wide" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:104 msgid "&Landscape" msgstr "&عرضي" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:106 msgid "&Right to left" msgstr "&يمين إلى يسار" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:105 msgid "Don't so&rt" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:107 msgid "De&speckle" msgstr "" @@ -4143,7 +4380,7 @@ msgid "&Disable comic processing" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:120 msgid "&Output format:" msgstr "" @@ -4160,7 +4397,7 @@ msgid "Debug the conversion process." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:56 msgid "Choose debug folder" msgstr "" @@ -4172,7 +4409,7 @@ msgstr "" msgid "Failed to create debug directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:55 msgid "" "Choose a folder to put the debug output into. If you specify a folder, " "calibre will place a lot of debug output into it. This will be useful in " @@ -4180,7 +4417,7 @@ msgid "" "conversion parameters like Table of Contents and Chapter Detection." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:59 msgid "" "The debug process outputs the intermediate HTML generated at various stages " "of the conversion process. This HTML can sometimes serve as a good starting " @@ -4227,18 +4464,22 @@ msgstr "" msgid "FB2 Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:47 msgid "&Inline TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:33 +msgid "Sectionize Chapters (Use with care!)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:104 msgid "Font rescaling wizard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:105 msgid "" "

This wizard will help you choose an appropriate font size key for your " "needs. Just enter the base font size of the input document and then enter an " @@ -4254,25 +4495,25 @@ msgid "" "for a discussion of how font size rescaling works.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:108 msgid "&Output document" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114 msgid "&Base font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 msgid "Font size &key:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:117 #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:125 @@ -4283,23 +4524,23 @@ msgstr "" msgid " pt" msgstr " pt" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:112 msgid "Use &default values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113 msgid "&Input document" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:116 msgid "&Font size: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:118 msgid " will map to size: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:119 msgid "0.0 pt" msgstr "" @@ -4323,66 +4564,66 @@ msgstr "" msgid "Justify text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125 msgid "&Disable font size rescaling" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 msgid "Base &font size:" msgstr "حجم الخط& الأساسي:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 msgid "Wizard to help you choose an appropriate font size key" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 msgid "Line &height:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 msgid "Input character &encoding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 msgid "Remove &spacing between paragraphs" msgstr "حذف الفراغات& بين الفقرات" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 msgid "Indent size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 msgid "" "

When calibre removes inter paragraph spacing, it automatically sets a " "paragraph indent, to ensure that paragraphs can be easily distinguished. " "This option controls the width of that indent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 msgid " em" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 msgid "Text justification:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:139 msgid "&Linearize tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:140 msgid "Extra &CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:141 msgid "&Transliterate unicode characters to ASCII" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:142 msgid "Insert &blank line" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:143 msgid "Keep &ligatures" msgstr "" @@ -4440,7 +4681,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "ميتاداتا" @@ -4481,65 +4722,64 @@ msgstr "" msgid " is not a valid picture" msgstr " ليست صورة صالحة" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 msgid "Book Cover" msgstr "غلاف الكتاب" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 msgid "Use cover from &source file" msgstr "استخدم غلاف من المصدر&" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Change &cover image:" msgstr "تغيير صورة الغلاف&:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 msgid "Browse for an image to use as the cover of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 msgid "&Title: " msgstr ":ال&عنوان " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 msgid "Change the title of this book" msgstr "تغيير عنوان هذا الكتاب" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "&Author(s): " msgstr "ال&مؤلف: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 msgid "Author So&rt:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 msgid "&Publisher: " msgstr "&الناشر: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 msgid "Ta&gs: " msgstr "الو&سوم: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -4547,23 +4787,23 @@ msgstr "" "الوسوم تصنّف الكتاب. هذا يفيد كثيراً في البحث.

ممكن تكون أي كلمة أو " "مجموعة كلمات، مفرقة بفاصلة." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "&Series:" msgstr "&سلسلات:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:175 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid "List of known series. You can add new series." msgstr "قائمة السلسلات المعروفة. بإمكانك إضافة سلسلات جديدة." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 msgid "Book " msgstr "الكتاب " @@ -4571,7 +4811,7 @@ msgstr "الكتاب " msgid "MOBI Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:43 msgid "Default" msgstr "" @@ -4734,18 +4974,18 @@ msgstr "" msgid "Options specific to the input format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:53 msgid "Dialog" msgstr "حوار" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:118 msgid "&Input format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:119 msgid "Use &saved conversion settings for individual books" msgstr "" @@ -4777,12 +5017,12 @@ msgid "Footer regular expression:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:87 msgid "Invalid regular expression" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:88 msgid "Invalid regular expression: %s" msgstr "" @@ -4901,18 +5141,18 @@ msgstr "" msgid "Force maximum line length" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:51 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:55 msgid "TextLabel" msgstr "تسمية النصّ" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:57 msgid "Use a wizard to help construct the XPath expression" msgstr "" @@ -5013,14 +5253,14 @@ msgid "Undefined" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:241 +#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:119 msgid "Yes" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:243 +#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:121 msgid "No" msgstr "" @@ -5041,7 +5281,7 @@ msgid " index:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:193 msgid "Automatically number books in this series" msgstr "" @@ -5057,253 +5297,253 @@ msgstr "" msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:48 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:136 msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:165 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:283 msgid "Get device information" msgstr "احصل على معلومات الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:294 msgid "Get list of books on device" msgstr "احصل على قائمة الكتب على الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:304 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:313 msgid "Send metadata to device" msgstr "ارسل الميتاداتا إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:318 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:342 msgid "Upload %d books to device" msgstr "رفع %d كتاب إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:357 msgid "Delete books from device" msgstr "حذف كتب من الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Download books from device" msgstr "تنزيل الكتب من الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:384 msgid "View book on device" msgstr "عرض كتاب على الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:425 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:426 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:428 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:442 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:454 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:453 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:454 msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:490 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:608 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:629 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:677 msgid "Error talking to device" msgstr "خطأ في الاتصال بالجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:717 msgid "Device: " msgstr "الجهاز: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719 msgid " detected." msgstr " تم كشفه." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:805 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:817 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:810 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:819 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:820 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:834 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:835 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:824 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:828 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:887 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:932 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:917 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1080 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1199 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:933 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:926 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:944 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:945 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:956 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:977 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:978 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:989 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1027 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1200 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1057 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1113 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1166 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1216 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1208 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1278 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1270 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1279 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1271 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 msgid "Select available formats and their order for this device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:87 msgid "Use sub directories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:88 msgid "Use author sort for author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:90 msgid "Save &template:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:48 msgid "Add books by ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:49 msgid "" "

Enter a list of ISBNs in the box to the left, one per line. calibre will " "automatically create entries for books based on the ISBN and download " @@ -5311,19 +5551,19 @@ msgid "" "ignored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:50 msgid "&Paste from clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 msgid "Fit &cover within view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 msgid "&Previous" msgstr "ال&سابق" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 msgid "&Next" msgstr "ال&تالي" @@ -5357,7 +5597,7 @@ msgstr "" msgid "Catalog options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:45 msgid "Choose Format" msgstr "إختيار التهيئة" @@ -5405,27 +5645,27 @@ msgstr "" msgid "%s is not an existing folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 msgid "Choose your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 msgid "Your calibre library is currently located at {0}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:73 msgid "New &Location:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:74 msgid "Use &existing library at the new location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:75 msgid "&Create an empty library at the new location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:76 msgid "&Move current library to new location" msgstr "" @@ -5437,15 +5677,15 @@ msgstr "ضبط الإفتراضي في تحويل الرسومات (ملفات C msgid "Set options for converting %s" msgstr "ضبط الخيارات لتحويل %s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 msgid "&Title:" msgstr ":ال&عنوان" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:98 msgid "&Author(s):" msgstr "ال&مؤلف:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:100 msgid "&Profile:" msgstr "&طور:" @@ -5453,1030 +5693,11 @@ msgstr "&طور:" msgid "Edit Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:172 -msgid "%(plugin_type)s %(plugins)s" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:173 -msgid "plugins" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:182 -msgid "" -"\n" -"Customization: " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:197 -msgid "General" -msgstr "عام" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:198 -msgid "Interface" -msgstr "الواجهة" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199 -msgid "Conversion" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 -msgid "" -"Email\n" -"Delivery" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201 -msgid "Add/Save" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:202 -msgid "Advanced" -msgstr "متقدّم" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:203 -msgid "" -"Content\n" -"Server" -msgstr "" -"محتوى\n" -"خادم" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:204 -msgid "Plugins" -msgstr "الملحقات" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 -msgid "Auto send" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 -msgid "Email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:233 -msgid "Formats to email. The first matching format will be sent." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:234 -msgid "" -"If checked, downloaded news will be automatically mailed
to this email " -"address (provided it is in one of the listed formats)." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:308 -msgid "new email address" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 -msgid "Wide" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 -msgid "Narrow" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 -msgid "Medium" -msgstr "متوسط" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 -msgid "Small" -msgstr "صغير" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509 -msgid "Large" -msgstr "كبير" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 -msgid "Always" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 -msgid "Automatic" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 -msgid "Never" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:540 -msgid "Done" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:541 -msgid "Confirmation dialogs have all been reset" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:546 -msgid "System port selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:547 -msgid "" -"The value %d you have chosen for the content server port is a system " -"port. Your operating system may not allow the server to run on this " -"port. To be safe choose a port number larger than 1024." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:567 -msgid "Failed to install command line tools." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:570 -msgid "Command line tools installed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:571 -msgid "Command line tools installed in" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:572 -msgid "" -"If you move calibre.app, you have to re-install the command line tools." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:623 -msgid "No valid plugin path" -msgstr "مسار الملحق غير صالح" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:624 -msgid "%s is not a valid plugin path" -msgstr "%s ليس مسار لملحق صالح" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:627 -msgid "Choose plugin" -msgstr "إختيار الملحق" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:639 -msgid "Plugin cannot be disabled" -msgstr "لا يمكن تعطيل الملحق" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:640 -msgid "The plugin: %s cannot be disabled" -msgstr "الملحق: %s لا يمكن تعطيله" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:649 -msgid "Plugin not customizable" -msgstr "لا يمكن تخصيص الملحق" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:650 -msgid "Plugin: %s does not need customization" -msgstr "الملحق: %s لا يحتاج التخصيص" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:658 -msgid "Customize" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:696 -msgid "Cannot remove builtin plugin" -msgstr "لم يمكن حذف الملحق المضمن" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:697 -msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." -msgstr " لا يمكن حذفه. هذا ملحق مضمن في البرنامج. حاول تعطيله بدلاً من حذفه." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:712 -msgid "Invalid tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:713 -msgid "" -"The tweaks you entered are invalid, try resetting the tweaks to default and " -"changing them one by one until you find the invalid setting." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:743 -msgid "You must select a column to delete it" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:748 -msgid "The selected column is not a custom column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:749 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:48 -msgid "Are you sure?" -msgstr "هل أنت متأكّد؟" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:750 -msgid "Do you really want to delete column %s and all its data?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:817 -msgid "Error log:" -msgstr "سجل الأخطاء:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:824 -msgid "Access log:" -msgstr "سجل النفاذ:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:852 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:315 -msgid "Failed to start content server" -msgstr "فشل في تشغيل خادم المحتوى" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:877 -msgid "Invalid size" -msgstr "حجم غير صالح" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:878 -msgid "The size %s is invalid. must be of the form widthxheight" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:944 -msgid "Must restart" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:945 -msgid "" -"The changes you made require that Calibre be restarted. Please restart as " -"soon as practical." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:979 -msgid "Checking database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:999 -msgid "Failed to check database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1004 -msgid "Some inconsistencies found" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1005 -msgid "" -"The following books had formats listed in the database that are not actually " -"available. The entries for the formats have been removed. You should check " -"them manually. This can happen if you manipulate the files in the library " -"folder directly." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:133 -msgid "TabWidget" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:134 -msgid "" -"Here you can control how calibre will read metadata from the files you add " -"to it. calibre can either read metadata from the contents of the file, or " -"from the filename." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:135 -msgid "Read metadata only from &file name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:136 -msgid "" -"Swap the firstname and lastname of the author. This affects only metadata " -"read from file names." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:137 -msgid "&Swap author firstname and lastname" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:138 -msgid "" -"If an existing book with a similar title and author is found that does not " -"have the format being added, the format is added\n" -"to the existing book, instead of creating a new entry. If the existing book " -"already has the format, then it is silently ignored.\n" -"\n" -"Title match ignores leading indefinite articles (\"the\", \"a\", \"an\"), " -"punctuation, case, etc. Author match is exact." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:142 -msgid "" -"If books with similar titles and authors found, &merge the new files " -"automatically" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:143 -msgid "&Configure metadata from file name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:144 -msgid "&Adding books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:145 -msgid "" -"Here you can control how calibre will save your books when you click the " -"Save to Disk button:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:146 -msgid "Save &cover separately" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:147 -msgid "Update &metadata in saved copies" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:148 -msgid "Save metadata in &OPF file" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:149 -msgid "Convert non-English characters to &English equivalents" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:150 -msgid "Format &dates as:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:151 -msgid "File &formats to save:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:152 -msgid "Replace space with &underscores" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:153 -msgid "Change paths to &lowercase" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:154 -msgid "&Saving books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:155 -msgid "Metadata &management:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:156 -msgid "Manual management" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:157 -msgid "Only on send" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:158 -msgid "Automatic management" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:159 -msgid "" -"

  • Manual Management: Calibre updates the metadata and adds " -"collections only when a book is sent. With this option, calibre will never " -"remove a collection.
  • \n" -"
  • Only on send: Calibre updates metadata and adds/removes " -"collections for a book only when it is sent to the device.
  • \n" -"
  • Automatic management: Calibre automatically keeps metadata on the " -"device in sync with the calibre library, on every connect
  • " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:162 -msgid "" -"Here you can control how calibre will save your books when you click the " -"Send to Device button. This setting can be overriden for individual devices " -"by customizing the device interface plugins in Preferences->Plugins" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:163 -msgid "Sending to &device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:603 -msgid "Show notification when &new version is available" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:604 -msgid "Download &social metadata (tags/ratings/etc.) by default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605 -msgid "&Overwrite author and title by default when fetching metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 -msgid "Default network &timeout:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 -msgid "" -"Set the default timeout for network fetches (i.e. anytime we go out to the " -"internet to get information)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 -msgid " seconds" -msgstr " ثانية" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 -msgid "Choose &language (requires restart):" -msgstr "إختر ال&لغة (يحتاج إعادة تشغيل):" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 -msgid "Normal" -msgstr "عادي" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 -msgid "High" -msgstr "مرتفع" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 -msgid "Low" -msgstr "منخفض" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 -msgid "Job &priority:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 -msgid "Preferred &output format:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 -msgid "Reset all disabled &confirmation dialogs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 -msgid "Preferred &input format order:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 -msgid "Use &Roman numerals for series number" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 -msgid "Enable system &tray icon (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 -msgid "Show ¬ifications in system tray" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 -msgid "Show &splash screen at startup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:623 -msgid "Show cover &browser in a separate window (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 -msgid "Show &average ratings in the tags browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:625 -msgid "Search as you type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:626 -msgid "Automatically send downloaded &news to ebook reader" -msgstr "إرسال الأخبار& التي تم تنزيلها آلياً إلى قارئ الكتب الإلكترونية" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 -msgid "&Delete news from library when it is automatically sent to reader" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 -msgid "&Number of covers to show in browse mode (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:629 -msgid "Select visible &columns in library view" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 -msgid "Remove a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 -msgid "Add a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:635 -msgid "Edit settings of a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:638 -msgid "Use internal &viewer for:" -msgstr "استخدم المستعرض& الداخلي في:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:639 -msgid "User Interface &layout (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640 -msgid "Restriction to apply when the current library is opened:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641 -msgid "" -"Apply this restriction on calibre startup if the current library is being " -"used. Also applied when switching to this library. Note that this setting is " -"per library. " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642 -msgid "Disable all animations. Useful if you have a slow/old computer." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:643 -msgid "Disable &animations" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:644 -msgid "Show &donate button (restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:645 -msgid "&Toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:646 -msgid "&Icon size:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:647 -msgid "Show &text under icons:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:648 -msgid "Add an email address to which to send books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:649 -msgid "&Add email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:650 -msgid "Make &default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:651 -msgid "&Remove email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:652 -msgid "" -"calibre can send your books to you (or your reader) by email. Emails will be " -"automatically sent for downloaded news to all email addresses that have Auto-" -"send checked." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:653 -msgid "&Maximum number of waiting worker processes (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654 -msgid "Limit the max. simultaneous jobs to the available CPU &cores" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655 -msgid "Debug &device detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:656 -msgid "&Check database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:657 -msgid "Open calibre &configuration directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:658 -msgid "&Install command line tools" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:659 -msgid "&Miscellaneous" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:660 -msgid "" -"Values for the tweaks are shown below. Edit them to change the behavior of " -"calibre" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:661 -msgid "All available tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:662 -msgid "&Current tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:663 -msgid "&Restore to defaults" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:664 -msgid "&Tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:665 -msgid "" -"calibre contains a network server that allows you to access your book " -"collection using a browser from anywhere in the world. Any changes to the " -"settings will only take effect after a server restart." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:666 -msgid "Server &port:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:667 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 -msgid "&Username:" -msgstr "&اسم المستخدم:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:668 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 -msgid "&Password:" -msgstr "&كلمة السرّ" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:669 -msgid "" -"If you leave the password blank, anyone will be able to access your book " -"collection using the web interface." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:670 -msgid "" -"The maximum size (widthxheight) for displayed covers. Larger covers are " -"resized. " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:671 -msgid "Max. &cover size:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:672 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 -msgid "&Show password" -msgstr "إظهار& كلمة السرّ" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:673 -msgid "Max. &OPDS items per query:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:674 -msgid "Max. OPDS &ungrouped items:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675 -msgid "Restriction (saved search) to apply:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676 -msgid "" -"This restriction (based on a saved search) will restrict the books the " -"content server makes available to those matching the search. This setting is " -"per library (i.e. you can have a different restriction per library)." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677 -msgid "&Start Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:678 -msgid "St&op Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:679 -msgid "&Test Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:680 -msgid "Run server &automatically on startup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:681 -msgid "View &server logs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:682 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46 -msgid "" -"

    Remember to leave calibre running as the server only runs as long as " -"calibre is running.\n" -"

    Stanza should see your calibre collection automatically. If not, try " -"adding the URL http://myhostname:8080 as a new catalog in the Stanza reader " -"on your iPhone. Here myhostname should be the fully qualified hostname or " -"the IP address of the computer calibre is running on." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:684 -msgid "" -"Here you can customize the behavior of Calibre by controlling what plugins " -"it uses." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:685 -msgid "Enable/&Disable plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:686 -msgid "&Customize plugin" -msgstr "ت&خصيص الملحق" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:687 -msgid "&Remove plugin" -msgstr "&حذف الملحق" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:688 -msgid "Add new plugin" -msgstr "إضافة ملحق جديد" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:689 -msgid "Plugin &file:" -msgstr "&ملف الملحق:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:691 -msgid "&Add" -msgstr "&إضافة" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:125 -msgid "Create Tag-based Column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:126 -msgid "Lookup name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:127 -msgid "Column heading" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:128 -msgid "Column type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:129 -msgid "Use brackets" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:130 -msgid "Values can be edited" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:135 -msgid "Text" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:136 -msgid "Number" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:889 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568 -msgid "Date" -msgstr "تاريخ" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:138 -msgid "Tag on book" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:139 -msgid "Explanation text added in create_ct_column.py" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:140 -msgid "Create and edit tag-based columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:19 -msgid "Text, column shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:22 -msgid "Comma separated text, like tags, shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:25 -msgid "Long text, like comments, not shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:28 -msgid "Text column for keeping series-like information" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:33 -msgid "Floating point numbers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:35 -msgid "Integers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:37 -msgid "Ratings, shown with stars" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:40 -msgid "Yes/No" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:69 -msgid "No column selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:70 -msgid "No column has been selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:74 -msgid "Selected column is not a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:105 -msgid "No lookup name was provided" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:107 -msgid "" -"The lookup name must contain only lower case letters, digits and " -"underscores, and start with a letter" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:116 -msgid "No column heading was provided" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:122 -msgid "The lookup name %s is already used" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:132 -msgid "The heading %s is already used" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:117 -msgid "Create or edit custom columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:102 -msgid "&Lookup name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:103 -msgid "Column &heading" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:104 -msgid "" -"Used for searching the column. Must contain only digits and lower case " -"letters." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:105 -msgid "" -"Column heading in the library view and category name in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:106 -msgid "Column &type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:107 -msgid "What kind of information will be kept in the column." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:108 -msgid "" -"

    Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's " -"for year.

    \n" -"

    For example:\n" -"

      \n" -"
    • ddd, d MMM yyyy gives Mon, 5 Jan 2010
    • \n" -"
    • dd MMMM yy gives 05 January 10
    • \n" -"
    " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:114 -msgid "Use MMM yyyy for month + year, yyyy for year only" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:115 -msgid "Default: dd MMM yyyy." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:116 -msgid "Format for &dates" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:21 -msgid "Getting debug information" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:22 -msgid "Copy to &clipboard" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:24 -msgid "Debug device detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:44 -msgid "Invalid template" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:45 -msgid "The template %s is invalid:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:42 -msgid "Save &template" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:43 -msgid "" -"By adjusting the template below, you can control what folders the files are " -"saved in and what filenames they are given. You can use the / character to " -"indicate sub-folders. Available metadata variables are described below. If a " -"particular book does not have some metadata, the variable will be replaced " -"by the empty string." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:44 -msgid "Available variables:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/social.py:34 -msgid "Downloading social metadata, please wait..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50 -msgid "Separator" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:63 -msgid "Choose library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:113 -msgid "The main toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:114 -msgid "The main toolbar when a device is connected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:115 -msgid "The context menu for the books in the calibre library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:117 -msgid "The context menu for the books on the device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94 -msgid "Customize the actions in:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95 -msgid "A&vailable actions" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96 -msgid "&Current actions" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97 -msgid "Move selected action up" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99 -msgid "Move selected action down" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 -msgid "Ctrl+S" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102 -msgid "Add selected actions to toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104 -msgid "Remove selected actions from toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:55 msgid "&Show this warning again" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:47 msgid "ERROR" msgstr "خطأ" @@ -6490,6 +5711,14 @@ msgstr "" msgid "Location" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 +msgid "Date" +msgstr "تاريخ" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1064 msgid "Format" @@ -6563,11 +5792,11 @@ msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 msgid "Fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91 msgid "" "

    calibre can find metadata for your books from two locations: Google " "Books and isbndb.com.

    To use isbndb.com you must sign up for a " @@ -6575,48 +5804,48 @@ msgid "" "below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92 msgid "&Access Key:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:93 msgid "Fetch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:94 msgid "Matches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:95 msgid "" "Select the book that most closely matches your copy from the list below" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:96 msgid "Download &social metadata (tags/rating/etc.) for the selected book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:97 msgid "Overwrite author and title with author and title of selected book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:42 msgid "Details of job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:49 msgid "Active Jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:50 msgid "&Stop selected job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:51 msgid "Show job &details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:52 msgid "Stop &all non device jobs" msgstr "" @@ -6624,78 +5853,86 @@ msgstr "" msgid "Editing meta information for %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:225 msgid "Applying changes to %d books. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 msgid "Edit Meta information" msgstr "تحرير معلومات الميتا" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:167 msgid "A&utomatically set author sort" msgstr "ضبط& ترتيب المؤلف آلياً" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 msgid "Author s&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid "&Rating:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:164 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Rating of this book. 0-5 stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid " stars" msgstr " نجمة" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "Open Tag Editor" msgstr "فتح محرر الوسوم" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:180 msgid "&Remove tags:" msgstr "حذف& الوسوم:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:181 msgid "Comma separated list of tags to remove from the books. " msgstr "قائمة من الوسوم مفرقة بالفاصلة لحذفها من الكتب. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:182 +msgid "Remove all" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +msgid "Check this box to remove all tags from the books." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:187 msgid "Remove &format:" msgstr "حذف الت&هيئة:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 msgid "&Swap title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -6703,24 +5940,24 @@ msgid "" "Book A will have series number 1 and Book B series number 2." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:194 msgid "" "Remove stored conversion settings for the selected books.\n" "\n" "Future conversion of these books will use the default settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:197 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "&Basic metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 msgid "&Custom metadata" msgstr "" @@ -6861,95 +6098,119 @@ msgstr "" msgid "Could not open %s. Is it being used by another program?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 msgid "Edit Meta Information" msgstr "تحرير معلومات الميتا" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 msgid "Meta information" msgstr "معلومات الميتا" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 msgid "Swap the author and title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 msgid "Author S&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid "" "Automatically create the author sort entry based on the current author entry" msgstr "ينشئ مدخل ترتيب المؤلف حسب مدخل المؤلف الحالي" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid "Remove unused series (Series that have no books)" msgstr "حذف سلسلات غير مستخدمة (سلسلات التي لا تحتوي على كتب)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 msgid "Publishe&d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 msgid "dd MMM yyyy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 msgid "&Date:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "&Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 msgid "&Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "Available Formats" msgstr "التهيئات المتوفرة" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 msgid "Remove the selected formats for this book from the database." msgstr "حذف التهيئات المختارة لهذا الكتاب من قاعدة البيانات." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "Set the cover for the book from the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "Update metadata from the metadata in the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 -msgid "Reset cover to default" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 -msgid "Download &cover" +msgid "&Browse" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 +msgid "Reset cover to default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +msgid "Download &cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 msgid "Generate a default cover based on the title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 msgid "&Generate cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:61 msgid "Password needed" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 +msgid "&Username:" +msgstr "&اسم المستخدم:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 +msgid "&Password:" +msgstr "&كلمة السرّ" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 +msgid "&Show password" +msgstr "إظهار& كلمة السرّ" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:59 msgid "Aborting..." msgstr "" @@ -6963,31 +6224,31 @@ msgid "" "The current saved search will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 msgid "Saved Search Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 msgid "Saved Search: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:90 msgid "Select a saved search to edit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 msgid "Delete this selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:93 msgid "Enter a new saved search name." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:94 msgid "Add the new saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:96 msgid "Change the contents of the saved search" msgstr "" @@ -7016,7 +6277,7 @@ msgid "Last downloaded" msgstr "آخر تنزيل" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:220 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 msgid "Schedule news download" msgstr "جدولة تنزيل الأخبار" @@ -7036,116 +6297,116 @@ msgstr "" msgid "Cannot download news as no internet connection is active" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:278 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 msgid "Download all scheduled recipes at once" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 msgid "Download &all scheduled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 msgid "blurb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 msgid "&Schedule for download:" msgstr "ج&دولة للتنزيل:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 msgid "Every " msgstr "كل " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 msgid "day" msgstr "اليوم" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 msgid "Monday" msgstr "الأثنين" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 msgid "Tuesday" msgstr "الثلاثاء" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 msgid "Wednesday" msgstr "الأربعاء" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 msgid "Thursday" msgstr "الخميس" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 msgid "Friday" msgstr "الجمعة" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 msgid "Saturday" msgstr "السبت" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 msgid "Sunday" msgstr "الأحد" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 msgid "at" msgstr "في" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 msgid "" "Interval at which to download this recipe. A value of zero means that the " "recipe will be downloaded every hour." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 msgid " days" msgstr " يوم" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 msgid "&Account" msgstr "&حساب" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "For the scheduling to work, you must leave calibre running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "&Schedule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Add &title as tag" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "&Extra tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "&Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "&Download now" msgstr "&تنزيل الآن" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "" "Delete downloaded news older than the specified number of days. Set to zero " "to disable." msgstr "" "حذف الأخبار المنزّلة التي أقدم من العدد المخصص من الأيام. اضبطه بـ0 لتعطيله." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "Delete downloaded news older than " msgstr "حذف أخبار أقدم من " @@ -7167,56 +6428,56 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 msgid "Advanced Search" msgstr "بحث متقدم" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 msgid "Find entries that have..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 msgid "&All these words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 msgid "This exact &phrase:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 msgid "&One or more of these words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 msgid "But dont show entries that have..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 msgid "Any of these &unwanted words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 msgid "What kind of match to use:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 msgid "Contains: the word or phrase matches anywhere in the metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 msgid "Equals: the word or phrase must match an entire metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 msgid "" "Regular expression: the expression must match anywhere in the metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:129 msgid " " msgstr " " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 msgid "" "See the User Manual for more help" @@ -7245,51 +6506,51 @@ msgid "" "The current tag category will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 msgid "User Categories Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:159 msgid "A&vailable items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 msgid "Apply tags to current tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 msgid "A&pplied items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:163 msgid "Unapply (remove) tag from current tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:165 msgid "Category name: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:166 msgid "Select a category to edit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 msgid "Delete this selected tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:169 msgid "Enter a new category name. Select the kind before adding it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:170 msgid "Add the new category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:172 msgid "Category filter: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:173 msgid "Select the content kind of the new category" msgstr "" @@ -7304,15 +6565,15 @@ msgid "" "to delete them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 msgid "Tag Editor" msgstr "محرر الوسوم" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 msgid "A&vailable tags" msgstr "الوسوم المت&وفرة" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -7320,23 +6581,23 @@ msgstr "" "حذف الوسم من قائمة البيانات. هذا سيحذف الوسم من الكتب وثم سيحذف الوسم تماماً " "من القاعدة." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 msgid "Apply tag to current book" msgstr "علّم الكتاب الحالي بالوسم" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 msgid "A&pplied tags" msgstr "الوسوم الم&علّمة" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 msgid "Unapply (remove) tag from current book" msgstr "حذف الوسم من الكتاب الحالي" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:137 msgid "&Add tag:" msgstr "إض&افة وسم:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:138 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -7344,7 +6605,7 @@ msgstr "" "إذا الوسم الذي تريده ليس متوفر، بإمكانك إضافته هنا. يقبل قائمة من الوسوم " "مفرّقة بفاصلات." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:139 msgid "Add tag to available tags and apply it to current book" msgstr "إضافة وسم إلى قائمة الوسوم المتوفرة وعلّم الكتاب الحالي به" @@ -7382,33 +6643,38 @@ msgstr "" msgid "Are you certain you want to delete the following items?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 msgid "Category Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 msgid "Items in use" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:79 msgid "" "Delete item from database. This will unapply the item from all books and " "then remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:81 msgid "Rename the item in every book where it is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:106 +msgid "Ctrl+S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:56 msgid "Test email settings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:57 msgid "Send test mail from %s to:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115 msgid "&Test" msgstr "&تجربة" @@ -7427,7 +6693,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:150 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:260 msgid "Switch to Advanced mode" msgstr "" @@ -7452,10 +6718,6 @@ msgstr "" msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 -msgid "Already exists" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:186 msgid "This feed has already been added to the recipe" msgstr "" @@ -7496,35 +6758,35 @@ msgstr "" msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:253 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:254 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:255 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:256 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:257 msgid "&Share recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:258 msgid "Customize &builtin recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:259 msgid "&Load recipe from file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:261 msgid "" "\n" -"

    Create a basic news " -"recipe, by adding RSS feeds to it.
    For most feeds, you will have to " -"use the \"Advanced mode\" to further customize the fetch " -"process.

    " -msgstr "" -"\n" -"

    Create a basic news " -"recipe, by adding RSS feeds to it.
    For most feeds, you will have to " -"use the \"Advanced mode\" to further customize the fetch " -"process.

    " +msgid "&Remove recipe" +msgstr "&Ezabatu formula" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:260 -msgid "Recipe &title:" -msgstr "Recipe &title:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:257 +msgid "&Share recipe" +msgstr "&Partekatu formula" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:258 +msgid "Customize &builtin recipe" +msgstr "Pertsonalizatu &builtin formula" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:259 +msgid "&Load recipe from file" +msgstr "&Kargatu formula fitxategitik" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:261 -msgid "&Oldest article:" -msgstr "&Oldest article:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:262 -msgid "The oldest article to download" -msgstr "The oldest article to download" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:264 -msgid "&Max. number of articles per feed:" -msgstr "&Max. number of articles per feed:" +msgid "" +"\n" +"

    Create a basic news " +"recipe, by adding RSS feeds to it.
    For most feeds, you will have to " +"use the \"Advanced mode\" to further customize the fetch " +"process.

    " +msgstr "" +"\n" +"

    Sortu oinarrizko formula " +"bat, RSS jarioak erantsiz.
    Jario gehiagotarako, erabili beharko duzu " +"\"Modu aurreratua\" eskuratzeko prozesua haratago " +"pertsonalizatzeko.

    " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:265 -msgid "Maximum number of articles to download per feed." -msgstr "Maximum number of articles to download per feed." +msgid "Recipe &title:" +msgstr "Formularen &izenburua:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:266 -msgid "Feeds in recipe" -msgstr "Feeds in recipe" +msgid "&Oldest article:" +msgstr "Artikulu &Zaharragoa:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 -msgid "Remove feed from recipe" -msgstr "Remove feed from recipe" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:267 +msgid "The oldest article to download" +msgstr "Deskargatzeko artikulurik zaharrena" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:269 +msgid "&Max. number of articles per feed:" +msgstr "Jario bakoitzeko artikulu kopuru &Max.:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:270 +msgid "Maximum number of articles to download per feed." +msgstr "Jario bakoitzeko artikulu kopuru maximoa dekargatzeko" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:274 -msgid "Add feed to recipe" -msgstr "Add feed to recipe" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:272 -msgid "&Feed title:" -msgstr "&Feed title:" +msgid "Feeds in recipe" +msgstr "Jarioak formulan" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:273 -msgid "Feed &URL:" -msgstr "Feed &URL:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 -msgid "&Add feed" -msgstr "&Add feed" +msgid "Remove feed from recipe" +msgstr "Ezabatu jarioa formulatik" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:279 +msgid "Add feed to recipe" +msgstr "Gehitu jarioa formulara" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:277 +msgid "&Feed title:" +msgstr "&Jarioaren izenburua:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:278 +msgid "Feed &URL:" +msgstr "Jarioaren &URLa:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:280 +msgid "&Add feed" +msgstr "&Gehitu jarioa" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:281 msgid "" "For help with writing advanced news recipes, please visit User Recipes" msgstr "" -"For help with writing advanced news recipes, please visit User Recipes" +"Laguntza lortzeko albiste formula aurreratuak idazterakoan, bisita ezazu " +"mesedez User " +"Recipes (Erabiltzailearen formulak)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:282 msgid "Recipe source code (python)" -msgstr "Recipe source code (python)" +msgstr "Formularen iturri kodea (python)" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:107 msgid "" @@ -8495,175 +7650,178 @@ msgstr "" "\n" "

    Set a regular expression " -"pattern to use when trying to guess ebook metadata from filenames.

    \n" +"right:0px; -qt-block-indent:0; text-indent:0px;\">Ezarri adierazpen arrunt " +"eredu bat erabiltzeko ebook fitxategi-izenetatik metadatuak asmatzen ari " +"zarenean.

    \n" "

    A Badago reference on the syntax " -"of regular expressions is available.

    \n" +"decoration: underline; color:#0000ff;\">erreferentzia bat " +"adierazpen arrunteko sintaxiari buruz erabilgarri.

    \n" "

    Use the Test functionality below to test your regular " -"expression on a few sample filenames. The group names for the various " -"metadata entries are documented in tooltips.

    " +"right:0px; -qt-block-indent:0; text-indent:0px;\">Erabili Test aukera beherago aztertzeko adierazpen arrunta " +"fitxategi-izen jakin batzuekin. Hainbat metadatu sarrera talderen izenak " +"dokumentatuak daude laguntza-lanabesetan.

    " #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 msgid "Regular &expression" -msgstr "Regular &expression" +msgstr "Adierazpen &arrunta" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116 msgid "File &name:" -msgstr "File &name:" +msgstr "Fitxategi- &izena:" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:118 msgid "Title:" -msgstr "Title:" +msgstr "Izenburua:" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119 msgid "Regular expression (?P<title>)" -msgstr "Regular expression (?P<title>)" +msgstr "Adierazpen arrunta (?P<title>)" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:123 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:87 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:110 msgid "No match" -msgstr "No match" +msgstr "Bat etortzerik ez" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:121 msgid "Authors:" -msgstr "Authors:" +msgstr "Egileak:" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122 msgid "Regular expression (?P)" -msgstr "Regular expression (?P)" +msgstr "Adierazpen arrunta (?P)" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:124 msgid "Series:" -msgstr "Series:" +msgstr "Seriea:" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:125 msgid "Regular expression (?P)" -msgstr "Regular expression (?P)" +msgstr "Adierazpen arrunta (?P)" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:127 msgid "Series index:" -msgstr "Series index:" +msgstr "Seriearen aurkibidea:" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:128 msgid "Regular expression (?P)" -msgstr "Regular expression (?P)" +msgstr "Adierazpen arrunta (?P)" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:130 msgid "ISBN:" -msgstr "ISBN:" +msgstr "ISBNa:" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:131 msgid "Regular expression (?P)" -msgstr "Regular expression (?P)" +msgstr "Adierazpen arrunta (?P)" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:97 msgid "Cover Browser" -msgstr "Cover Browser" +msgstr "Liburu-azalen arakatzailea" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:102 msgid "Shift+Alt+B" -msgstr "Shift+Alt+B" +msgstr "Maiusk+Alt+B" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:116 msgid "Tag Browser" -msgstr "Tag Browser" +msgstr "Etiketa arakatzailea" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:118 msgid "Shift+Alt+T" -msgstr "Shift+Alt+T" +msgstr "Maiusk+Alt+T" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" -msgstr "version" +msgstr "bertsioa" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:30 msgid "created by Kovid Goyal" -msgstr "created by Kovid Goyal" +msgstr "Kovid Goyalek sortua" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:157 msgid "Connected " -msgstr "Connected " +msgstr "Konektaturik " -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:169 msgid "Update found" -msgstr "Update found" +msgstr "Eguneraketa aurkitua" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:218 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:214 msgid "Book Details" -msgstr "Book Details" +msgstr "Liburuaren zehaztasunak" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:206 msgid "Alt+D" msgstr "Alt+D" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:216 msgid "Shift+Alt+D" -msgstr "Shift+Alt+D" +msgstr "Maiusk+Alt+D" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:61 msgid "Job" -msgstr "Job" +msgstr "Lana" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:62 msgid "Status" -msgstr "Status" +msgstr "Egoera" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:63 msgid "Progress" -msgstr "Progress" +msgstr "Aurrerapena" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:64 msgid "Running time" -msgstr "Running time" +msgstr "Exekuzio denbora" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:76 msgid "There are %d running jobs:" -msgstr "There are %d running jobs:" +msgstr "Badaude %d lan exekutatzen:" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:102 msgid "Unknown job" -msgstr "Unknown job" +msgstr "Lan ezezaguna" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:83 msgid "There are %d waiting jobs:" -msgstr "There are %d waiting jobs:" +msgstr "Badaude %d lan itxaroten:" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:222 msgid "Cannot kill job" -msgstr "Cannot kill job" +msgstr "Ezin da lana geldiarazi" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:220 msgid "Cannot kill jobs that communicate with the device" -msgstr "Cannot kill jobs that communicate with the device" +msgstr "Ezin dira irakurgailuarekin konektaturik dauden lanak geldiarazi" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:223 msgid "Job has already run" -msgstr "Job has already run" +msgstr "Lana dagoeneko exekutatu egin da" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:251 msgid "Unavailable" -msgstr "Unavailable" +msgstr "Ez dago erabilgarri" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:283 msgid "Jobs:" -msgstr "Jobs:" +msgstr "Lanak:" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:285 msgid "Shift+Alt+J" @@ -8675,316 +7833,319 @@ msgstr "Egin klik lanen zerrenda ikusteko" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:371 msgid " - Jobs" -msgstr " - Jobs" +msgstr " - Lanak" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:53 +msgid "Eject this device" +msgstr "Irakurgailua deskonektatu" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:62 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:210 +msgid "Library" +msgstr "Liburutegia" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 +msgid "Show books in calibre library" +msgstr "Erakutsi liburuak calibre liburutegian" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 +msgid "Reader" +msgstr "Irakurgailua" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 +msgid "Show books in the main memory of the device" +msgstr "Erakutsi liburuak irakurgailuaren memoria nagusian" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 -msgid "Eject this device" -msgstr "Eject this device" - -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:194 -msgid "Library" -msgstr "Library" - -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:76 -msgid "Show books in calibre library" -msgstr "Show books in calibre library" - -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:77 -msgid "Reader" -msgstr "Reader" - -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:78 -msgid "Show books in the main memory of the device" -msgstr "Show books in the main memory of the device" - -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:79 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:598 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:650 msgid "Card A" -msgstr "Card A" +msgstr "A txartela" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 msgid "Show books in storage card A" -msgstr "Show books in storage card A" +msgstr "Erakutsi liburuak A memoria-txartelean" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:81 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:652 msgid "Card B" -msgstr "Card B" +msgstr "B txartela" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 msgid "Show books in storage card B" -msgstr "Show books in storage card B" +msgstr "Erakutsi liburuak B memoria-txartelean" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:109 msgid "available" -msgstr "available" +msgstr "erabilgarria" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:140 msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" -"Books display will be restricted to those matching the selected saved search" +"Erakutsi egingo dira gordetako bilaketarekin bat datozen liburuak bakarrik" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:153 msgid "Advanced search" -msgstr "Advanced search" +msgstr "Bilaketa aurreratua" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:162 msgid "" "

    Search the list of books by title, author, publisher, tags, comments, " "etc.

    Words separated by spaces are ANDed" msgstr "" -"

    Search the list of books by title, author, publisher, tags, comments, " -"etc.

    Words separated by spaces are ANDed" +"

    Bilatu ezazu liburu zerrenda hau bilaketarako, egile, argitaletxe, " +"etiketak, iruzkinak, eta abar erabilita.

    Espazioekin bereiziriko " +"hitzak ETA juntagailuarekin elkartuta baleude legez hartuko dira" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:169 +msgid "Reset Quick Search" +msgstr "Berrezarri bilaketa azkarra" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 -msgid "Reset Quick Search" -msgstr "Reset Quick Search" +msgid "Copy current search text (instead of search name)" +msgstr "Kopiatu oraingo bilaketa testua (bilaketa izenaren ordez)" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 +msgid "Save current search under the name shown in the box" +msgstr "Gorde oraingo bilaketa kutxatilan erakusten den izenarekin" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 -msgid "Copy current search text (instead of search name)" -msgstr "Copy current search text (instead of search name)" - -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:199 -msgid "Save current search under the name shown in the box" -msgstr "Save current search under the name shown in the box" - -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Delete current saved search" -msgstr "Delete current saved search" +msgstr "Ezabatu oraintxe gordetako bilaketa" #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:284 msgid "N" -msgstr "N" +msgstr "E" #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:284 msgid "Y" -msgstr "Y" +msgstr "B" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 msgid "On Device" -msgstr "On Device" +msgstr "Irakurgailuan" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 msgid "Size (MB)" -msgstr "Size (MB)" +msgstr "Tamaina (Mb)" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 msgid "Rating" -msgstr "Rating" +msgstr "Balorazioa" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1084 msgid "Book %s of %s." -msgstr "Book %s of %s." +msgstr "Liburua %s honi buruz: %s." #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:679 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1182 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 msgid "The lookup/search name is \"{0}\"" -msgstr "The lookup/search name is \"{0}\"" +msgstr "Bilaketa izena hauxe: \"{0}\"" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:886 msgid "In Library" -msgstr "In Library" +msgstr "Liburutegian" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:890 msgid "Size" -msgstr "Size" +msgstr "Tamaina" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1162 msgid "Marked for deletion" -msgstr "Marked for deletion" +msgstr "Ezabatzeko markatuta" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1165 msgid "Double click to edit me

    " -msgstr "Double click to edit me

    " +msgstr "Egin ezazu klik birritan editatzeko

    " #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:110 msgid "Hide column %s" -msgstr "Hide column %s" +msgstr "Ezkutatu %s zutabea" #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:115 msgid "Sort on %s" -msgstr "Sort on %s" +msgstr "%s -en arabera sailkatu" #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:116 msgid "Ascending" -msgstr "Ascending" +msgstr "Gorantz" #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:119 msgid "Descending" -msgstr "Descending" +msgstr "Beherantz" #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:131 msgid "Change text alignment for %s" -msgstr "Change text alignment for %s" +msgstr "Alda ezazu testuaren lerrokatzea %s horretarako" #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 msgid "Left" -msgstr "Left" +msgstr "Ezkerretara" #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 msgid "Right" -msgstr "Right" +msgstr "Eskuinetara" #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:134 msgid "Center" -msgstr "Center" +msgstr "Erdian" #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Show column" -msgstr "Show column" +msgstr "Erakutsi zutabea" #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 msgid "Restore default layout" -msgstr "Restore default layout" +msgstr "Berrezarri lehenetsitako diseinua" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:543 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." msgstr "" -"Dropping onto a device is not supported. First add the book to the calibre " -"library." +"Ez da onartzen zuzen-zuzenean irakurgailuan kopiatzea. Lehenago gehitu " +"liburua calibre liburutegira." -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:52 msgid "Configure Viewer" -msgstr "Configure Viewer" +msgstr "Ikustailea konfiguratu" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:53 msgid "Use white background" -msgstr "Use white background" +msgstr "Erabili atzeko plano zuria" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:54 msgid "Hyphenate" -msgstr "Hyphenate" +msgstr "Gidoia (hitz elkarteetan erabiltzen den - gidoia)" -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:55 msgid "Changes will only take effect after a restart." -msgstr "Changes will only take effect after a restart." +msgstr "Aldaketak berrabiarazi eta gero besterik ez dira hasiko." #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:70 msgid " - LRF Viewer" -msgstr " - LRF Viewer" +msgstr " - LRF Ikustailea" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:160 msgid "No matches for the search phrase %s were found." -msgstr "No matches for the search phrase %s were found." +msgstr "Ez da bat datorrenik esaldia bilatzerakoan %s aurkitu." #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:441 msgid "No matches found" -msgstr "No matches found" - -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:128 -msgid "LRF Viewer" -msgstr "LRF Viewer" - -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:129 -msgid "Parsing LRF file" -msgstr "Parsing LRF file" - -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:130 -msgid "LRF Viewer toolbar" -msgstr "LRF Viewer toolbar" - -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:477 -msgid "Next Page" -msgstr "Next Page" - -#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:478 -msgid "Previous Page" -msgstr "Previous Page" +msgstr "Ez da bat datorrenik aurkitu" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:188 -msgid "Back" -msgstr "Back" +msgid "LRF Viewer" +msgstr "LRF Ikustailea" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:189 -msgid "Forward" -msgstr "Forward" +msgid "Parsing LRF file" +msgstr "Aztertzen LRF fitxategia" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:135 -msgid "Next match" -msgstr "Next match" +msgid "LRF Viewer toolbar" +msgstr "LRF Ikustailearen tresna-barra" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:136 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:196 -msgid "Open ebook" -msgstr "Open ebook" +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:477 +msgid "Next Page" +msgstr "Hurrengo orrialdea" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:478 +msgid "Previous Page" +msgstr "Aurreko orrialdea" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:193 +msgid "Back" +msgstr "Atzera" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:194 +msgid "Forward" +msgstr "Aurrera" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:140 +msgid "Next match" +msgstr "Hurrengo bat etortzea" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 +msgid "Open ebook" +msgstr "Liburu elektronikoa zabaldu" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:142 msgid "Configure" -msgstr "Configure" +msgstr "Konfiguratu" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:30 msgid "Use the library located at the specified path." -msgstr "Use the library located at the specified path." +msgstr "Erabili zehaztutako bidearen buruan dagoen liburutegia." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:32 msgid "Start minimized to system tray." -msgstr "Start minimized to system tray." +msgstr "Hasi sistemaren erretilura minimizaturik" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:34 msgid "Log debugging information to console" -msgstr "Log debugging information to console" +msgstr "Bidali akatsen arazketaren informazioa kontsolara" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:36 msgid "Do not check for updates" -msgstr "Do not check for updates" +msgstr "Ez ibili eguneratzeen bila" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:598 msgid "Calibre Library" -msgstr "Calibre Library" +msgstr "calibre liburutegia" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:86 msgid "Choose a location for your calibre e-book library" -msgstr "Choose a location for your calibre e-book library" +msgstr "Aukera ezazu kokagune bat zure calibre liburutegirako" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "Failed to create library" -msgstr "Failed to create library" +msgstr "Huts egin du liburutegia sortzerakoan" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "Failed to create calibre library at: %r." -msgstr "Failed to create calibre library at: %r." +msgstr "Huts egin du liburutegia sortzerakoan hemen: %r." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:99 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:184 msgid "Choose a location for your new calibre e-book library" -msgstr "Choose a location for your new calibre e-book library" +msgstr "Aukera ezazu kokagune bat zure calibre liburutegi digitalerako" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Initializing user interface..." -msgstr "Initializing user interface..." +msgstr "Abiarazten erabiltzailearen interfazea..." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 msgid "Repairing failed" -msgstr "Repairing failed" +msgstr "Konponketa prozesuak huts egin du" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:179 msgid "The database repair failed. Starting with a new empty library." -msgstr "The database repair failed. Starting with a new empty library." +msgstr "" +"Datu basea konpontzeko saioak huts egin du. Liburutegi berri huts batekin " +"hasiko." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:193 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:226 msgid "Bad database location" -msgstr "Bad database location" +msgstr "Datu basearen kokagune okerra" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:194 msgid "Bad database location %r. calibre will now quit." -msgstr "Bad database location %r. calibre will now quit." +msgstr "Datu basearen kokagune okerra %r. calibrek ez du alde egingo." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:207 msgid "Corrupted database" -msgstr "Corrupted database" +msgstr "Datu base kutsatua" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:208 msgid "" @@ -8992,281 +8153,1375 @@ msgid "" "and repair it automatically? If you say No, a new empty calibre library will " "be created." msgstr "" -"Your calibre database appears to be corrupted. Do you want calibre to try " -"and repair it automatically? If you say No, a new empty calibre library will " -"be created." +"Badirudi zure calibreko datu basea kutsaturik dagoela. Nahi duzu calibre " +"bera bakarrik modu automatikoan datu basea konpontzen saatzea? Ezezkoa " +"hobesten baduzu, hutsik egongo den calibre liburutegi berri bat sortuko da." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:214 msgid "" "Repairing database. This can take a very long time for a large collection" msgstr "" -"Repairing database. This can take a very long time for a large collection" +"Datu basea konpontzen. Honek denbora luzea beharko du bilduma handia baldin " +"bada." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:227 msgid "" "Bad database location %r. Will start with a new, empty calibre library" msgstr "" -"Bad database location %r. Will start with a new, empty calibre library" +"Datu basearen kokapen okerra %r. calibre liburutegi huts berri batekin " +"hasiko." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:238 msgid "Starting %s: Loading books..." -msgstr "Starting %s: Loading books..." +msgstr "Abiarazten %s: Liburuak kargatzen..." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:283 msgid "If you are sure it is not running" -msgstr "If you are sure it is not running" +msgstr "Lanean ez dabilela ziur baldin badakizu" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:285 msgid "Cannot Start " -msgstr "Cannot Start " +msgstr "Ezin hasi " #: /home/kovid/work/calibre/src/calibre/gui2/main.py:286 msgid "%s is already running." -msgstr "%s is already running." +msgstr "%s lanean dagoeneko." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:289 msgid "may be running in the system tray, in the" -msgstr "may be running in the system tray, in the" +msgstr "agian sistemaren erretiluan dago lanen, hemen:" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:291 msgid "upper right region of the screen." -msgstr "upper right region of the screen." +msgstr "pantailaren goiko eskuineko aldea." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:293 msgid "lower right region of the screen." -msgstr "lower right region of the screen." +msgstr "pantailaren beheko eskuineko aldea." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:296 msgid "try rebooting your computer." -msgstr "try rebooting your computer." +msgstr "saia zaitez zure ordenagailua berrabiarazten." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:298 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:310 msgid "try deleting the file" -msgstr "try deleting the file" +msgstr "saia zaitez fitxategia ezabatzen" #: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:20 msgid "" "Redirect console output to a dialog window (both stdout and stderr). Useful " "on windows where GUI apps do not have a output streams." msgstr "" -"Redirect console output to a dialog window (both stdout and stderr). Useful " -"on windows where GUI apps do not have a output streams." +"Berbideratu kontsolaren outputa elkarrizketa leihora (bai stdout bai " +"stderr). Windowsen erabilgarria non GUI apps horrek (Graphical User " +"Interface apps horrek) ez du output korronterik." #: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:61 msgid "&Preferences" -msgstr "&Preferences" +msgstr "&Hobespenak" #: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:62 msgid "&Quit" -msgstr "&Quit" +msgstr "&Irten" #: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:90 msgid "ERROR: Unhandled exception" -msgstr "ERROR: Unhandled exception" +msgstr "ERROREA: erabilgarri ez den salbuespena" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:93 msgid "Book has neither title nor ISBN" -msgstr "Book has neither title nor ISBN" +msgstr "Liburuak ez du ez izenbururik ez ISBNrik" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:119 msgid "No matches found for this book" -msgstr "No matches found for this book" +msgstr "Ez da bat etortzerik aurkitu liburu honetarako" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:255 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:554 -msgid "Search" -msgstr "Search" - -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:307 -msgid "The selected search will be permanently deleted. Are you sure?" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/__init__.py:36 +msgid "" +"Restore settings to default values. You have to click Apply to actually save " +"the default settings." msgstr "" -"Aukeratutako bilaketa betirako ezabatua izango da. Ziur zaude?" +"Ezarpenak programaren berezko balioetara bueltatzea. \"Aplikatu\" klikatu " +"behar da, ezarpen lehenetsiak egitan berreskuratzeko" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:349 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:49 +msgid "" +"Here you can control how calibre will read metadata from the files you add " +"to it. calibre can either read metadata from the contents of the file, or " +"from the filename." +msgstr "" +"Hemen kontrola dezakezu nola irakurriko dituen calibrek zuk gehitu dizkiozun " +"fitxategien metadatuak. calibrek metadatuak irakur ditzake fitxategiaren " +"edukietatik edo fitxategi-izenetik." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:50 +msgid "Read metadata from &file contents rather than file name" +msgstr "" +"Irakur itzazu metadatuak &fitxategi edukietatik fitxategi izenetik beharrean" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:51 +msgid "" +"If an existing book with a similar title and author is found that does not " +"have the format being added, the format is added\n" +"to the existing book, instead of creating a new entry. If the existing book " +"already has the format, then it is silently ignored.\n" +"\n" +"Title match ignores leading indefinite articles (\"the\", \"a\", \"an\"), " +"punctuation, case, etc. Author match is exact." +msgstr "" +"Topatzen bada dagoeneko badagoela antzeko izenburua eta egile izena dituen " +"liburua baina formatu hau ez daukan liburua bada, formatu hau gehituko zaio\n" +"dagoeneko dagoen liburura eta ez da sarrera berria sortuko. Dagoen liburuak " +"dagoeneko formatu egokia baldin badauka, orduan aukera hau oharkabean " +"geratuko da.\n" +"\n" +"Izenburuak erkatzerakoan determinatzaile batzuk (ingelesezko \"the\", \"a\", " +"\"an\"), puntuazio markak batzuk eta, ez dira kontuan hartuko. Egilearen " +"izenarekin erkaketa eta bat egitea zehatza da." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:55 +msgid "" +"If books with similar titles and authors found, &merge the new files " +"automatically" +msgstr "" +"Antzeko izenburuak edo egileen izenak topatuz gero &bateratu fitxategi " +"berriak modu automatikoan" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:56 +msgid "&Configure metadata from file name" +msgstr "&Konfiguratu metadatuak fitxategi-izenetik" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:57 +msgid "" +"Swap the firstname and lastname of the author. This affects only metadata " +"read from file names." +msgstr "" +"Trukatu egilearen izena eta deituraren arteko ordena. Honek eragina izango " +"du fitxategi-izenetatik irakurritako metadatuetan bakarrik." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:58 +msgid "&Swap author firstname and lastname" +msgstr "&Trukatu egilearen izena eta deitura haien artean" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:145 +msgid "Normal" +msgstr "Normala" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:146 +msgid "High" +msgstr "Altua" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:147 +msgid "Low" +msgstr "Baxua" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:162 +msgid "Done" +msgstr "Egina" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:163 +msgid "Confirmation dialogs have all been reset" +msgstr "Baieztatze elkarrizketak berrezarri egin dira" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:137 +msgid "&Overwrite author and title by default when fetching metadata" +msgstr "" +"Lehenetsita: &Gain-idatzi egilearen izena eta izenburua metadatuak " +"eskuratzerakoan" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:138 +msgid "Download &social metadata (tags/ratings/etc.) by default" +msgstr "" +"Lehenetsita: deskargatu &gizarte mailako metadatuak " +"(etiketak/balorazioak/eta abar.)" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 +msgid "Show notification when &new version is available" +msgstr "Erakutsi ohartarazpena bertsio &berria eskuragarri dagoenean" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 +msgid "Automatically send downloaded &news to ebook reader" +msgstr "Igorri modu automatikoan deskargatutako &albisteak irakurgailura" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 +msgid "&Delete news from library when it is automatically sent to reader" +msgstr "" +"&Ezabatu albisteak liburutegitik modu automatikoan irakurgailura igorri " +"direnean" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:142 +msgid "Default network &timeout:" +msgstr "Lehenetsitako sarea &denboraz-kanpo:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:143 +msgid "" +"Set the default timeout for network fetches (i.e. anytime we go out to the " +"internet to get information)" +msgstr "" +"Ezarri lehenetsitako \"sarea denboraz-kanpo\" balioa sarean eskuratzen diren " +"kontuetarako (adibidez, internetera informazioaren bila zoazen bakoitzekoa)" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:144 +msgid " seconds" +msgstr " segundoak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:148 +msgid "Job &priority:" +msgstr "Lana &lehentasuna:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:149 +msgid "Preferred &output format:" +msgstr "Hobetsitako &output formatua:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:150 +msgid "Restriction to apply when the current library is opened:" +msgstr "Oraingo liburutegian zabalik dagoenean aplikatzeko murrizketak:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:151 +msgid "" +"Apply this restriction on calibre startup if the current library is being " +"used. Also applied when switching to this library. Note that this setting is " +"per library. " +msgstr "" +"Aplika ezazu murrizketa hau calibre abiarazterakoan egungo liburutegia " +"erabiltzen ari bada. Aplikatu egingo da liburutegi modura aldatzerakoan. " +"Ohar zaitez ezarpen hau liburutegirako dela. " + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:152 +msgid "" +"A comma-separated list of tags that will be applied to books added to the " +"library" +msgstr "" +"Liburutegira gehituko diren liburuei erantsiko zaizkion komen bidez " +"bereiziriko etiketen zerrenda" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:153 +msgid "Tags to apply when adding a book:" +msgstr "Liburu bat gehitzerekoan aplikatzeko etiketak:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:154 +msgid "Reset all disabled &confirmation dialogs" +msgstr "Berrezarri desgaitutako &baieztapen elkarrizketak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:155 +msgid "Preferred &input format order:" +msgstr "Hobetsitako &input formatu agindua:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:158 +msgid "Use internal &viewer for:" +msgstr "Erabili barneko &ikusgailua honetarako:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:96 +msgid "You must select a column to delete it" +msgstr "Zutabe bat hautatu beharko duzu ezabatzeko" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:101 +msgid "The selected column is not a custom column" +msgstr "Hautatutako zutabea ez da zutabe pertsonalizatu bat" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:103 +msgid "Do you really want to delete column %s and all its data?" +msgstr "Benetan nahi duzu %s zutabea ezabatu eta bere eduki guztiak ere bai?" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 +msgid "" +"Here you can re-arrange the layout of the columns in the calibre library " +"book list. You can hide columns by unchecking them. You can also create your " +"own, custom columns." +msgstr "" +"Hemendik berrabiarazi dezakezu calibreren liburutegiko liburu zerrendako " +"zutabeen diseinua. Zutabeak ezkuta ditzakezu aztertu gabe utzita. Sor " +"ditzakezu, baita, zure zutabe propio pertsonalizatuak." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 +msgid "Remove a user-defined column" +msgstr "Ezabatu erabiltzaileak definitutako zutabe bat" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:86 +msgid "Add a user-defined column" +msgstr "Gehitu erabiltzaileak definitutako zutabe bat" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:88 +msgid "Edit settings of a user-defined column" +msgstr "Editatu ezarpenak erabiltzaileak definitutako zutabe batean" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:91 +msgid "Add &custom column" +msgstr "Gehitu &pertsonalizatutako zutabea" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion.py:37 +msgid "" +"Restore settings to default values. Only settings for the currently selected " +"section are restored." +msgstr "" +"Ezarpenak programaren berezko balioetara bueltatzea. Orain hautatuta dagoen " +"ataleko ezarpenak baino ez dira aldatuko" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:19 +msgid "Text, column shown in the tag browser" +msgstr "Testua, etiketa-arakatzailean erakusten den zutabea" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:22 +msgid "Comma separated text, like tags, shown in the tag browser" +msgstr "" +"Komen bidez bareiziriko testua, etiketak esaterako, hau da etiketen " +"arakatzailean erakusten diren etiketak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:25 +msgid "Long text, like comments, not shown in the tag browser" +msgstr "" +"Testu luzea, iruzkinak-eta, etiketen-arakatzailean erakusten ez diren testu " +"luzeak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:28 +msgid "Text column for keeping series-like information" +msgstr "Testu zutabea serie moduko informazioa gordetzeko" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 +msgid "Floating point numbers" +msgstr "Mugikor diren puntu zenbakiak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:35 +msgid "Integers" +msgstr "Zenbaki osoak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:37 +msgid "Ratings, shown with stars" +msgstr "Balorazioak, izarrekin erakutsiak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:40 +msgid "Yes/No" +msgstr "Bai/Ez" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:69 +msgid "No column selected" +msgstr "Ez dago zutaberik hautatua" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:70 +msgid "No column has been selected" +msgstr "Ez da zutaberik hautatu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:74 +msgid "Selected column is not a user-defined column" +msgstr "Hautatutako zutabea ez da erabiltzaileak definitu duen zutabea" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:105 +msgid "No lookup name was provided" +msgstr "Ez da bilatutako izena aurkitu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:107 +msgid "" +"The lookup name must contain only lower case letters, digits and " +"underscores, and start with a letter" +msgstr "" +"Bilatzen ari garen izenak letra xeheak besterik ezin ditu izan eta zenbakiak " +"eta azpi-marrak, hau da __; letra xehe batekin hasi beharko" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:109 +msgid "" +"Lookup names cannot end with _index, because these names are reserved for " +"the index of a series column." +msgstr "" +"Bilatutako izenek ezin dute _index amaiera izan, izen horiek zutabe " +"serieetarako erreserbaturik daudelako." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:118 +msgid "No column heading was provided" +msgstr "Ez da zutabeko goibururik aurkitu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:124 +msgid "The lookup name %s is already used" +msgstr "Bilatutako izena %s dagoeneko erabilta dago" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:134 +msgid "The heading %s is already used" +msgstr "Goiburua %s dagoeneko erabilita dago" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:122 +msgid "Create or edit custom columns" +msgstr "Sortu edo editatu pertsonalizatutako zutabeak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:107 +msgid "&Lookup name" +msgstr "&Bilatu izena" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:108 +msgid "Column &heading" +msgstr "Zitabearen &goiburua" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:109 +msgid "" +"Used for searching the column. Must contain only digits and lower case " +"letters." +msgstr "" +"Zutabea arakatzeko erabilia. Bakarrik izan ditzake letra xeheak, minuskulak, " +"eta zenbakiak." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:110 +msgid "" +"Column heading in the library view and category name in the tag browser" +msgstr "" +"Liburutegi ikuspegian zutabearen goiburua eta kategoria izena etiketa " +"arakatzailean" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:111 +msgid "Column &type" +msgstr "Zutabe &mota" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:112 +msgid "What kind of information will be kept in the column." +msgstr "Zer motatako informazioa gordeko da zutabean." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:113 +msgid "" +"

    Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's " +"for year.

    \n" +"

    For example:\n" +"

      \n" +"
    • ddd, d MMM yyyy gives Mon, 5 Jan 2010
    • \n" +"
    • dd MMMM yy gives 05 January 10
    • \n" +"
    " +msgstr "" +"

    Data formatua. Erabili 1-4 'd' egunerako, 1-4 'M' hilabeterako, eta 2 edo " +"4 'y' urterako.

    \n" +"

    Adibidez:\n" +"

      \n" +"
    • ddd, d MMM yyyy adierazten du Lar, 5 mai. 2010
    • \n" +"
    • dd MMMM yy adierazten du 05 maia 10
    • \n" +"
    " + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:119 +msgid "Use MMM yyyy for month + year, yyyy for year only" +msgstr "" +"Erabili MMM yyyy hilabetea + urtea adierazteko, yyyy bakarrik urtea " +"adierazteko" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:120 +msgid "Default: dd MMM yyyy." +msgstr "Lehenetsita AEBko ohiko: dd MMM yyyy." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:121 +msgid "Format for &dates" +msgstr "Formatuak &datak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/device_debug.py:21 +msgid "Getting debug information" +msgstr "Lortzen akatsgabetze informazioa" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/device_debug.py:22 +msgid "Copy to &clipboard" +msgstr "Kopiatu &arbelara" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/device_debug.py:24 +msgid "Debug device detection" +msgstr "Irakurgailuaren akatsgabetze detekzioa" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:66 +msgid "" +"calibre can send your books to you (or your reader) by email. Emails will be " +"automatically sent for downloaded news to all email addresses that have Auto-" +"send checked." +msgstr "" +"calibrek bai zuri bai zure irakurgailuari liburuak igorri ahal dizkizu e-" +"postaren bidez. Automatikoki bidali egingo dira e-postak deskargatutako " +"albisteekin igortzeko zerbitzu automatikoa aztertuta daukaten e-posta " +"helbide guztietara." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:67 +msgid "Add an email address to which to send books" +msgstr "Gehitu ezazu e-posta helbide bat liburuak bertara igortzeko" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:68 +msgid "&Add email" +msgstr "&Gehitu e-posta" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:69 +msgid "Make &default" +msgstr "Ezarri &lehenetsita" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:70 +msgid "&Remove email" +msgstr "&Ezabatu e-posta helbidea" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 +msgid "Auto send" +msgstr "Modu automatikoan bidalia" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 +msgid "Email" +msgstr "E-posta" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:29 +msgid "Formats to email. The first matching format will be sent." +msgstr "" +"E-posta formatuak. Egokitzen den, bat egiten duen lehen formatua igorri " +"egingo da." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:30 +msgid "" +"If checked, downloaded news will be automatically mailed
    to this email " +"address (provided it is in one of the listed formats)." +msgstr "" +"Aztertuta badago, deskargatutako albisteak automatikoki e-postaz igorriko " +"dira
    posta helbide honetara (zerrendatutako formaturen batean eman izan " +"da helbide hori)." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:104 +msgid "new email address" +msgstr "e-posta helbide berria" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 +msgid "Narrow" +msgstr "Estu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 +msgid "Wide" +msgstr "Zabal" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 +msgid "Medium" +msgstr "Ertain" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 +msgid "Small" +msgstr "Txiki" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 +msgid "Large" +msgstr "Handi" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 +msgid "Always" +msgstr "Beti" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 +msgid "Automatic" +msgstr "Automatikoa" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 +msgid "Never" +msgstr "Inoiz ez" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:98 +msgid "User Interface &layout (needs restart):" +msgstr "Erabiltzailearen interfazearen &diseinua (berrabiarazi beharko):" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:99 +msgid "&Number of covers to show in browse mode (needs restart):" +msgstr "" +"Nabigatzaile moduan erakusteko liburu-azalen &Kopurua (berrabiarazi " +"beharko):" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:100 +msgid "Choose &language (requires restart):" +msgstr "Aukeratu &hizkuntza (berrabiarazi beharko gero):" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:101 +msgid "Show &average ratings in the tags browser" +msgstr "Erakutsi &batez besteko balorazioak etiketen arakatzailean" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:102 +msgid "Disable all animations. Useful if you have a slow/old computer." +msgstr "" +"Desgaitu animazio guztiak. Erabilgarria ordenagailu motela/zaharra baldin " +"badaukazu." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:103 +msgid "Disable &animations" +msgstr "Desgaitu &animazioak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:104 +msgid "Enable system &tray icon (needs restart)" +msgstr "Gaitu sistema &erretilu ikonoa (berrabiarazi beharko)" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 +msgid "Show &splash screen at startup" +msgstr "Erakutsi &splash (harrerako) pantaila hasterakoan" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:106 +msgid "Disable ¬ifications in system tray" +msgstr "Desgaitu &abisuak sistemaren erretiluan" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:107 +msgid "Use &Roman numerals for series" +msgstr "Erabili &Erromatar zenbakiak serietan" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:108 +msgid "Show cover &browser in a separate window (needs restart)" +msgstr "" +"Erakutsi liburu-azala &arakatzailea leiho bananduetan (berrabiarazi beharko)" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:109 +msgid "Search as you type" +msgstr "Bilatu giltzak (teklak) jo bitartean" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:110 +msgid "&Toolbar" +msgstr "&Tresna-barra" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:111 +msgid "&Icon size:" +msgstr "&Ikonoaren tamaina:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:112 +msgid "Show &text under icons:" +msgstr "Erakutsi &testua ikonoen azpian:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:215 +msgid "&Apply" +msgstr "&Aplikatu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +msgid "&Cancel" +msgstr "&Bertan behera utzi" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 +msgid "Restore &defaults" +msgstr "Berrezarri &lehenetsiak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:223 +msgid "Save changes" +msgstr "Aldaketak gorde" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:224 +msgid "Cancel and return to overview" +msgstr "Bertanbehera utzi eta ikuspegi orokorrera itzuli" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:259 +msgid "Restoring to defaults not supported for" +msgstr "Lehenetsitako balioak berreskuratzea ez dago onartua honentzat :" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:294 +msgid "" +"Some of the changes you made require a restart. Please restart calibre as " +"soon as possible." +msgstr "" +"Egindako aldaketa batzuek berrabiaraztea eskatzen dute. Mesedez, " +"berrabiarazi calibre ahal bezain pronto." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:297 +msgid "" +"The changes you have made require calibre be restarted immediately. You will " +"not be allowed set any more preferences, until you restart." +msgstr "" +"Egin dituzun aldaketek calibre oraintxe bertan berrabiaraztea eskatzen " +"duten. Ezin izango dituzu aukera gehiago aldatu edo ezarri calibre " +"berrabiarazi arte." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:120 +msgid "Restart needed" +msgstr "berrabiaraztea beharrezkoa" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:49 +msgid "Checking database integrity" +msgstr "Datu baseen osaketa aztertzen" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:66 +msgid "Failed to check database integrity" +msgstr "Huts egin du datu baseen osaketa aztertzen" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:71 +msgid "Some inconsistencies found" +msgstr "Funsgabetasun batzuk aurkitu egin dira" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:72 +msgid "" +"The following books had formats listed in the database that are not actually " +"available. The entries for the formats have been removed. You should check " +"them manually. This can happen if you manipulate the files in the library " +"folder directly." +msgstr "" +"Hurrengo liburuek badituzte datu basean zerrendatzen diren formatuak baina " +"oraindik eskuragarri ez daudenak. Formatu horietako sarrerak ezabatu egin " +"dira. Horiek eskuz aztertu beharko dituzu. Hau gerta daiteke liburutegiaren " +"karpetan bertan fitxategiak eraldatzen badituzu." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:113 +msgid "Failed to install command line tools." +msgstr "Huts egin du aginte-lerro lanabesak instalatzerakoan." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:116 +msgid "Command line tools installed" +msgstr "Aginte-lerro lanabesak instalaturik" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:117 +msgid "Command line tools installed in" +msgstr "Aginte-lerro lanabesak instalatuak hemen:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:118 +msgid "" +"If you move calibre.app, you have to re-install the command line tools." +msgstr "" +"Lekuz aldatzen baduzu calibre.app, berriro instalatu beharko dituzu aginte-" +"lerro lanabesak." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:64 +msgid "&Maximum number of waiting worker processes (needs restart):" +msgstr "" +"Itxaroten ari diren langile-prozesuen kopuru &Maximoa (berrabiarazi beharko):" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:65 +msgid "Limit the max. simultaneous jobs to the available CPU &cores" +msgstr "" +"Mugatu batera egin daitezkeen lanen kopuru maximoa erabil daitezkeen CPU " +"&nukleoak kontuan hartuz" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:66 +msgid "Debug &device detection" +msgstr "Akasgabetu &irakurgailu detekzioa" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:67 +msgid "&Check database integrity" +msgstr "&Aztertu datu basearen osotasuna" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:68 +msgid "Open calibre &configuration directory" +msgstr "Zabaldu calibreren &konfigurazio direktorioa" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:69 +msgid "&Install command line tools" +msgstr "&Instalatu lerro-aginduen, lerro-komandoen, lanabesa" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:100 +msgid "%(plugin_type)s %(plugins)s" +msgstr "%(plugin_type)s %(plugins)s" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:101 +msgid "plugins" +msgstr "pluginak, gehigarriak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:110 +msgid "" +"\n" +"Customization: " +msgstr "" +"\n" +"Pertsonalizatzeko: " + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:155 +msgid "No valid plugin path" +msgstr "Ez du balio gehegarrirako bidea (path)" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:156 +msgid "%s is not a valid plugin path" +msgstr "%s hori ez da gehegarri baterako balio duen bidea" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:159 +msgid "Choose plugin" +msgstr "Aukeratu gehigarria" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:171 +msgid "Plugin cannot be disabled" +msgstr "Gehigarria ezin da desgaitu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:172 +msgid "The plugin: %s cannot be disabled" +msgstr "Hau gehigarri %s hau ezin da desgaitu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:182 +msgid "Plugin not customizable" +msgstr "Gehigarria ezin da pertsonalizatu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:183 +msgid "Plugin: %s does not need customization" +msgstr "%s gehigarriak ez du pertsonalizatzerik behar" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:193 +msgid "Customize" +msgstr "Pertsonalizatu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:232 +msgid "Cannot remove builtin plugin" +msgstr "Ezin da builtin gehigarria ezabatu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:233 +msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." +msgstr "" +" Ezin da ezabatu Hau builtin gehigarri bat da. Hori egin beharrean, saia " +"zaitez desgaitzen." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:82 +msgid "" +"Here you can customize the behavior of Calibre by controlling what plugins " +"it uses." +msgstr "" +"Hementxe zuk pertsonaliza dezakezu calibreren jokabidea erabiltzen dituen " +"gehigarriak kontrolatuz." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:83 +msgid "Enable/&Disable plugin" +msgstr "Gaitu/&Desgaitu gehigarria" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:84 +msgid "&Customize plugin" +msgstr "&Pertsonalizatu gehigarria" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:85 +msgid "&Remove plugin" +msgstr "&Ezabatu gehigarria" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:86 +msgid "Add new plugin" +msgstr "Gehitu gehigarri berria" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:87 +msgid "Plugin &file:" +msgstr "Gehigarri &fitxategia:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:89 +msgid "&Add" +msgstr "&Gehitu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:51 +msgid "Invalid template" +msgstr "Baliorik ez duen txantiloia" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:52 +msgid "The template %s is invalid:" +msgstr "%s txantiloiak ez du balio:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:47 +msgid "Save &template" +msgstr "Gorde &txantiloia" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:48 +msgid "" +"By adjusting the template below, you can control what folders the files are " +"saved in and what filenames they are given. You can use the / character to " +"indicate sub-folders. Available metadata variables are described below. If a " +"particular book does not have some metadata, the variable will be replaced " +"by the empty string." +msgstr "" +"Beheko txantiloi hori doituz, zuk kontrola dezakezu zeintzuk karpetetan " +"gordeko dituzun fitxategiak eta zein fitxategi-izen emango diezun fitxategi " +"bakoitzari. Erabil ditzakezu marra bertikal-etzan horiek, hau da / horiek, " +"azpi-karpetak adierazteko. Eskuragarri dauden metadatuen aldaerak hortxe " +"behean deskribatu egiten dira. Liburu jakin batek ez badauka metadaturen " +"bat, aldaera ordeztu egingo da hutsik dagoen katearekin." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:49 +msgid "Available variables:" +msgstr "Eskuragarri dauden aldaerak:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:68 +msgid "" +"Here you can control how calibre will save your books when you click the " +"Save to Disk button:" +msgstr "" +"Hemen kontrola dezakezu calibrek nola gordeko dituen zure liburuak \"Gorde " +"diskoan\" botoia sakatzen duzunean:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:69 +msgid "Save &cover separately" +msgstr "Gorde &liburu-azalak ondo bereiziak, bananduak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:70 +msgid "Replace space with &underscores" +msgstr "Ordeztu espazioak &azpimarrekin" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:71 +msgid "Update &metadata in saved copies" +msgstr "Eguneratu &metadatuak gordetako kopietan" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:72 +msgid "Change paths to &lowercase" +msgstr "Aldatu bideak (paths) &minuskuletara, letra xeheetara" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:73 +msgid "Format &dates as:" +msgstr "Formatua eman, &datak honela:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:74 +msgid "File &formats to save:" +msgstr "Fitxategi &formatuak gordetzeko:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:75 +msgid "Convert non-English characters to &English equivalents" +msgstr "" +"Bihurtu ingelesez erabiltzen ez diren karaktereak &Ingelesez erabiltzen " +"diren pareko" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:76 +msgid "Save metadata in &OPF file" +msgstr "Gorde metadatuak &OPF fitxategi batean" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:63 +msgid "Manual management" +msgstr "Eskuz egindako kudeaketa" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:64 +msgid "Only on send" +msgstr "Igortzerakoan besterik ez" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:65 +msgid "Automatic management" +msgstr "Kudeaketa automatikoa" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:62 +msgid "Metadata &management:" +msgstr "Metadatuen &kudeaketa:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:66 +msgid "" +"
  • Manual management: Calibre updates the metadata and adds " +"collections only when a book is sent. With this option, calibre will never " +"remove a collection.
  • \n" +"
  • Only on send: Calibre updates metadata and adds/removes " +"collections for a book only when it is sent to the device.
  • \n" +"
  • Automatic management: Calibre automatically keeps metadata on the " +"device in sync with the calibre library, on every connect
  • " +msgstr "" +"
  • Eskuzko kudeaketa: Calibrek metadatuak eguneratuko ditu eta " +"gehitu/ezabatu egingo ditu liburu baten bildumak liburua irakurgailura " +"bidali egin denean bakarrik. Aukera honekin calibrek ez du inoiz bildumarik " +"ezabatuko.
  • \n" +"
  • Bidalitakoan soilik: Calibrek metadatuak eguneratuko ditu eta " +"gehitu/ezabatu egingo ditu liburu baten bildumak liburua irakurgailura " +"bidali egin denean bakarrik.
  • \n" +"
  • Kudeaketa automatikoa: Calibrek, konexioa egiten den bakoitzean, " +"modu automatikoan gordeko ditu metadatuak irakurgailuan eta sinkronizatuko " +"ditu calibre liburutegiko metadatuekin .
  • " + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:69 +msgid "" +"Here you can control how calibre will save your books when you click the " +"Send to Device button. This setting can be overriden for individual devices " +"by customizing the device interface plugins in Preferences->Advanced->Plugins" +msgstr "" +"Hemendik kontrola dezakezu nola gordeko dituen calibrek zure liburuak " +"\"Irakurgailura bidali\" botoia sakatzen duzunean. Ezarpen hau alde batera " +"utz daiteke zenbait irakurgailutan gailuaren interfazea pertsonalizatuz " +"honela: Preferences->Advanced->Plugins (Aukerak>Aurreratua>Gehigarriak)" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 +msgid "Failed to start content server" +msgstr "Huts egin du edukien zerbitzaria abiarazten" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:99 +msgid "Error log:" +msgstr "Log errorea:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:106 +msgid "Access log:" +msgstr "Sarbideko log:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:121 +msgid "You need to restart the server for changes to take effect" +msgstr "Zerbitzaria berrabiarazi egin behar aldaketak gauzatzeko" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:124 +msgid "Server &port:" +msgstr "Zerbitzaria &portua:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:127 +msgid "" +"If you leave the password blank, anyone will be able to access your book " +"collection using the web interface." +msgstr "" +"Pasahitzaren eremua zuriz uzten baduzu internetetik edonor sar daiteke zure " +"liburu bilduman" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:128 +msgid "" +"The maximum size (widthxheight) for displayed covers. Larger covers are " +"resized. " +msgstr "" +"Tamaina maximoa (luzexzabal) liburu-azalak erakusteko. Liburu-azal handiak " +"neurri txikiago batera aldatuko dira. " + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:129 +msgid "Max. &cover size:" +msgstr "Maximoa, &libru-azalaren tamaina:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:131 +msgid "Max. &OPDS items per query:" +msgstr "Max. &OPDS kontuak kontsultarako, galdetzeko:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:132 +msgid "Max. OPDS &ungrouped items:" +msgstr "Max. OPDS &multzokatu gabeko kontuak:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:133 +msgid "Restriction (saved search) to apply:" +msgstr "Murrizketak (gordetako bilaketa) aplikatzeko:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:134 +msgid "" +"This restriction (based on a saved search) will restrict the books the " +"content server makes available to those matching the search. This setting is " +"per library (i.e. you can have a different restriction per library)." +msgstr "" +"Gordetako bilaketetan oinarritutako murrizketa honek edukien zerbitzariak " +"gaitzen dituen bilaketarekin bat egiten duten edukiak mugatuko ditu. Ezarpen " +"hau liburutegietarako da (adibeidez, zuk murrizketa bana izan dezakezu " +"liburutegi bakoitzeko)." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:135 +msgid "&Start Server" +msgstr "&Hasi zerbitzaria" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:136 +msgid "St&op Server" +msgstr "St&op zerbitzaria" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:137 +msgid "&Test Server" +msgstr "&Aztertu zerbitzaria" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:138 +msgid "" +"calibre contains a network server that allows you to access your book " +"collection using a browser from anywhere in the world. Any changes to the " +"settings will only take effect after a server restart." +msgstr "" +"calibrek badauka bere baitan sareko zerbitzari bat eta honek aukera ematen " +"dizu zure liburu bildumetara sartzeko munduko edozein tokitatik nabigatzaile " +"bat erabiliz. Ezarpenetan egindako edozein aldaketak ondorioak izango ditu " +"bakar-bakarrik zerbitzaria berrabiarazi eta gero." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:139 +msgid "Run server &automatically on startup" +msgstr "Exekutatu zerbitzaria &automatikoki hasterakoan" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:140 +msgid "View &server logs" +msgstr "Ikusi &zerbitzariko log erregistroak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46 +msgid "" +"

    Remember to leave calibre running as the server only runs as long as " +"calibre is running.\n" +"

    Stanza should see your calibre collection automatically. If not, try " +"adding the URL http://myhostname:8080 as a new catalog in the Stanza reader " +"on your iPhone. Here myhostname should be the fully qualified hostname or " +"the IP address of the computer calibre is running on." +msgstr "" +"

    Gogoratu calibre lanean uztea zeren eta zerbitzariak bere eskaintza " +"egiten du calibre dabilen artean bakarrik.\n" +"

    Stanza horrek begiratuko du modu automatiko batean zure calibre bilduma. " +"Horrela ez balitz, saia zaitez honako URL honekin: http://myhostname:8080 " +"Stanza Reader katalogo berria zeure iPhone horretan sortzeko. Hementxe nire-" +"ostatze-izena izan beharko litzateke erabat hartakoturiko, kualifikaturiko, " +"ostatze-izena edo bestela, calibre exekutatzen ari den ordenagailuko IP " +"helbidea." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/social.py:34 +msgid "Downloading social metadata, please wait..." +msgstr "Deskargatzen gizarte mailako metadatuak, itxaron une batean..." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:36 +msgid "Switch between library and device views" +msgstr "Txandakatu liburutegi ikuspegien eta irakurgailu ikuspegien artean" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:39 +msgid "Separator" +msgstr "Bereizlea" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:52 +msgid "Choose library" +msgstr "Aukeratu liburutegia" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:202 +msgid "The main toolbar" +msgstr "Tresnabarra nagusia" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:203 +msgid "The main toolbar when a device is connected" +msgstr "Tresnabarra nagusia irakurgailua konektaturik dagoenean" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:204 +msgid "The context menu for the books in the calibre library" +msgstr "calibreren liburutegiko liburuetako testuinguruko menua" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:206 +msgid "The context menu for the books on the device" +msgstr "Ez dago testuinguruko menurik irakurgailuko liburuentzat" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:240 +msgid "Cannot add" +msgstr "Ezin da gehitu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:241 +msgid "Cannot add the actions %s to this location" +msgstr "Ezin da ekintza hau %s kokaleku honetara gehitu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:259 +msgid "Cannot remove" +msgstr "Ezin da ezabatu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:260 +msgid "Cannot remove the actions %s from this location" +msgstr "Ezin dira %s ekintzak ezabatu kokaleku honetatik" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:99 +msgid "Customize the actions in:" +msgstr "Pertsonalizatu ekintzak hemen:" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:100 +msgid "A&vailable actions" +msgstr "Egin&daitezkeen ekintzak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:101 +msgid "&Current actions" +msgstr "&Oraingo ekintzak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:102 +msgid "Move selected action up" +msgstr "Mugi ezazu gora hautatutako ekintza" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:104 +msgid "Move selected action down" +msgstr "Mugi ezazu behera hautatutako ekintza" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:107 +msgid "Add selected actions to toolbar" +msgstr "Gehi itzazu hautatutako ekintzak tresnabarrara" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:109 +msgid "Remove selected actions from toolbar" +msgstr "Ezaba itzazu hautatutako ekintzak tresnabarratik" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:43 +msgid "Invalid tweaks" +msgstr "Aldaketa horiek ez dira onartu" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:44 +msgid "" +"The tweaks you entered are invalid, try resetting the tweaks to default and " +"changing them one by one until you find the invalid setting." +msgstr "" +"Egin dituzun aldaketa ez dira onartu, saia zaitez aldaketekin atzera egiten, " +"lehenetsitako balioetara jotzen eta aldatu dituzunak banan-banan aldatzen " +"onartzen ez den aldaketa hori zein den topatu arte." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:50 +msgid "" +"Values for the tweaks are shown below. Edit them to change the behavior of " +"calibre. Your changes will only take effect after a restart of calibre." +msgstr "" +"Doiketen balioak behean erakusten dira. Edita itzazu calibreren jokabidea " +"aldatzeko. Zure aldaketak calibre berrabiarazi eta gero martxan egongo dira." + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:51 +msgid "All available tweaks" +msgstr "Aldaketa posible guztiak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:52 +msgid "&Current tweaks" +msgstr "&Current oraingo aldaketak" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:573 +msgid "Search" +msgstr "Bilatu" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:313 +msgid "The selected search will be permanently deleted. Are you sure?" +msgstr "Aukeratutako bilaketa betiko ezabatu egingo da. Ziur zaude?" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:355 msgid "Search (For Advanced Search click the button to the left)" -msgstr "Search (For Advanced Search click the button to the left)" +msgstr "Bilatu (Bilaketa aurreraturako egin klik ezkerreko botoian)" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:397 msgid "Saved Searches" -msgstr "Saved Searches" +msgstr "Gordetako bilaketak" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:405 msgid "Choose saved search or enter name for new saved search" -msgstr "Choose saved search or enter name for new saved search" +msgstr "" +"Aukeratu gordetako bilaketak edo sartu izena gordetako bilaketa berri " +"baterako" #: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:10 msgid "Restrict to" -msgstr "Restrict to" +msgstr "Honetara murriztuta" #: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:16 #: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:65 msgid "(all books)" -msgstr "(all books)" +msgstr "(liburu guztiak)" #: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:59 msgid "({0} of {1})" -msgstr "({0} of {1})" +msgstr "({0} {1})-tik" #: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:67 msgid "({0} of all)" -msgstr "({0} of all)" +msgstr "({0} guztietatik)" #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:58 msgid "Press a key..." -msgstr "Press a key..." +msgstr "Giltza bat sakatu..." #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:79 msgid "Already assigned" -msgstr "Already assigned" +msgstr "Dagoeneko esleiturik" #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:81 msgid "already assigned to" -msgstr "already assigned to" +msgstr "Dagoeneko esleiturik honi" #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:131 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:223 msgid " or " -msgstr " or " +msgstr " edo " #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:74 msgid "&Default" -msgstr "&Default" +msgstr "&Lehenetsia" #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:135 msgid "Customize shortcuts for" -msgstr "Customize shortcuts for" +msgstr "Pertsonalizatu lasterbideak honetarako" #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:223 msgid "Keys" -msgstr "Keys" +msgstr "Giltzak" #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:225 msgid "Double click to change" -msgstr "Double click to change" +msgstr "Klik bikoitza aldatzeko" -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:73 msgid "Frame" -msgstr "Frame" +msgstr "Markoa" -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:75 msgid "&Custom" -msgstr "&Custom" - -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:71 -msgid "&Shortcut:" -msgstr "&Shortcut:" - -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:77 -msgid "Click to change" -msgstr "Click to change" - -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:79 -msgid "Clear" -msgstr "Clear" +msgstr "&Pertsonalizatu" #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:76 +msgid "&Shortcut:" +msgstr "&Lasterbidea:" + +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:82 +msgid "Click to change" +msgstr "Egin klik aldatzeko" + +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:84 +msgid "Clear" +msgstr "Garbitu" + +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:81 msgid "&Alternate shortcut:" -msgstr "&Alternate shortcut:" +msgstr "&Ordezko lasterbidea:" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:193 msgid "Rename '%s'" -msgstr "Rename '%s'" +msgstr "Berriro izendatu '%s'" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:197 msgid "Edit sort for '%s'" -msgstr "Edit sort for '%s'" +msgstr "Editatu mota (fitxategi mota) '%s' horretarako" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:202 msgid "Hide category %s" -msgstr "Hide category %s" +msgstr "Ezkutatu %s kategoria" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:205 msgid "Show category" -msgstr "Show category" +msgstr "Erakutsi kategoria" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:209 msgid "Show all categories" -msgstr "Show all categories" +msgstr "Erakutsi kategoria guztiak" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:216 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:220 msgid "Manage %s" -msgstr "Manage %s" +msgstr "Kudeatu %s" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:223 msgid "Manage Saved Searches" -msgstr "Manage Saved Searches" +msgstr "Kudeatu gordetako bilaketak" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:230 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:234 msgid "Manage User Categories" -msgstr "Manage User Categories" +msgstr "Kudeatu erabiltzaile kategoriak" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:435 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:294 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:301 msgid "Searches" -msgstr "Searches" +msgstr "Bilaketak" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:513 msgid "Duplicate search name" -msgstr "Duplicate search name" +msgstr "Bilaketa izena bikoiztua" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:514 msgid "The saved search name %s is already used." -msgstr "The saved search name %s is already used." +msgstr "%s bilaketa izen hori dagoeneko erabilia izan da." #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:770 msgid "Sort by name" -msgstr "Sort by name" +msgstr "Izenez ordenatu" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:770 msgid "Sort by popularity" -msgstr "Sort by popularity" +msgstr "Ospearen arabera ordenatu" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:771 msgid "Sort by average rating" -msgstr "Sort by average rating" +msgstr "Ordenatu batezbesteko balorazioen arabera" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:774 msgid "Set the sort order for entries in the Tag Browser" -msgstr "Set the sort order for entries in the Tag Browser" +msgstr "Ezarri etiketen arakatzaileko sarreren ordena" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:780 msgid "Match all" -msgstr "Match all" +msgstr "Bilatu dena" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:780 msgid "Match any" -msgstr "Match any" +msgstr "Bilatu edozein" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:785 msgid "" "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" -"When selecting multiple entries in the Tag Browser match any or all of them" +"Etiketen arakatzailean hainbat sarrera hautatzen direnean bilatu haietako " +"bat edo haiek guztiak" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:789 msgid "Manage &user categories" -msgstr "Manage &user categories" +msgstr "Kudeatu &erabiltzaile kategoriak" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:792 msgid "Add your own categories to the Tag Browser" -msgstr "Add your own categories to the Tag Browser" +msgstr "Gehi ezazu zeuk asmatutako kategoria etiketa arakatzailean" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:183 msgid "Convert book %d of %d (%s)" -msgstr "Convert book %d of %d (%s)" +msgstr "Bihurtu %d liburua hemendik %d (%s)" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:91 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:203 msgid "Could not convert some books" -msgstr "Could not convert some books" +msgstr "Ezin izan dira liburu batzuk bihurtu" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:204 @@ -9274,280 +9529,287 @@ msgid "" "Could not convert %d of %d books, because no suitable source format was " "found." msgstr "" -"Could not convert %d of %d books, because no suitable source format was " -"found." +"Ezin izan dira %d liburuak bihurtu %d liburuetatik, sorburu formatu " +"eskuragarririk ez delako aurkitu." #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:121 msgid "Queueing books for bulk conversion" -msgstr "Queueing books for bulk conversion" +msgstr "Liburuak errenkadan jartzen bihurketa multzoka egiteko" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:182 msgid "Queueing " -msgstr "Queueing " +msgstr "Errenkadan jartzen " #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:239 msgid "Fetch news from " -msgstr "Fetch news from " +msgstr "Eskuratu berriak hemendik " #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:301 msgid "Convert existing" -msgstr "Convert existing" +msgstr "Bihurtu dagoen" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:302 msgid "" "The following books have already been converted to %s format. Do you wish to " "reconvert them?" msgstr "" -"The following books have already been converted to %s format. Do you wish to " -"reconvert them?" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:165 -msgid "&Restore" -msgstr "&Restore" +"Honako liburuak dagoeneko %s formatura bihurtu dira. Nahi dituzu berriro " +"bihurtu?" #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 +msgid "&Restore" +msgstr "&Lehengoratu" + +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169 msgid "&Donate to support calibre" -msgstr "&Donate to support calibre" +msgstr "&Emaitza egin calibre diruz laguntzeko" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 msgid "&Eject connected device" -msgstr "&Eject connected device" +msgstr "&Deskonektatu konektatuta zegoen gailua" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:215 msgid "Calibre Quick Start Guide" -msgstr "Calibre Quick Start Guide" +msgstr "Calibre Quick Start Guide (azkar erabiltzeko gida)" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:413 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:445 msgid "Conversion Error" -msgstr "Conversion Error" +msgstr "Bihurketa akatsa" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 msgid "" "

    Could not convert: %s

    It is a DRMed book. You must " "first remove the DRM using third party tools." msgstr "" -"

    Could not convert: %s

    It is a DRMed book. You must " -"first remove the DRM using third party tools." +"

    Ezin izan da hau bihurtu: %s

    Hau DRMed book bat da " +"(Digital Rights Management, testua modu librean irakurtzea galarazten duen " +"sistema bat). Bihurtu ahal izateko DRM arazo hori konpondu beharko duzu " +"beste batzuen lanabesak erabiliz." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:431 msgid "Recipe Disabled" -msgstr "Recipe Disabled" +msgstr "Formula desgaitua" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 msgid "Failed" -msgstr "Failed" +msgstr "Huts egin du" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:482 msgid "" "is the result of the efforts of many volunteers from all over the world. If " "you find it useful, please consider donating to support its development. " "Your donation helps keep calibre development going." msgstr "" -"is the result of the efforts of many volunteers from all over the world. If " -"you find it useful, please consider donating to support its development. " -"Your donation helps keep calibre development going." +"mundu osoan zehar dauden hainbat boluntarioen ahaleginaren fruitua a. " +"Erabilgarria dela uste baduzu, mesedez hartu kontuan emaitza bat egitearen " +"kontua garapenean laguntzeko. Zure emaitzak lagunduko dio calibreri garatzen " +"jarraitzen." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:508 msgid "There are active jobs. Are you sure you want to quit?" -msgstr "There are active jobs. Are you sure you want to quit?" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:507 -msgid "" -" is communicating with the device!
    \n" -" Quitting may cause corruption on the device.
    \n" -" Are you sure you want to quit?" msgstr "" -" is communicating with the device!
    \n" -" Quitting may cause corruption on the device.
    \n" -" Are you sure you want to quit?" +"Oraintxe bertan lan batzuk egiten ari dira. Ziur zaude irten nahi duzula?" #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511 -msgid "WARNING: Active jobs" -msgstr "WARNING: Active jobs" +msgid "" +" is communicating with the device!
    \n" +" Quitting may cause corruption on the device.
    \n" +" Are you sure you want to quit?" +msgstr "" +" irakurgailurarekin konektatzen!
    \n" +" Orain irteteak irakurgailuren kalterako izan " +"daiteke.
    \n" +" Ziur zaude? Benetan irten nahi duzu?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 +msgid "WARNING: Active jobs" +msgstr "ABISUA: lanean dihardu" + +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:579 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." msgstr "" -"will keep running in the system tray. To close it, choose Quit in the " -"context menu of the system tray." +"sistemaren erretiluan exekutatzen arituko da. Ixteko sakatu Irten " +"sistemaren erretiluaren testuinguruko menuan." #: /home/kovid/work/calibre/src/calibre/gui2/update.py:56 msgid "Update available" -msgstr "Update available" +msgstr "Eskuragarri dago eguneratze berri bat" #: /home/kovid/work/calibre/src/calibre/gui2/update.py:57 msgid "" "%s has been updated to version %s. See the new features. Visit the download page?" msgstr "" -"%s has been updated to version %s. See the new features. Visit the download page?" +"%s eguneratu egin da %s bertsiora. Ikus new features. Visitatu nahi duzu deskarga orria?" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:43 msgid "Edit bookmark" -msgstr "Edit bookmark" +msgstr "Editatu laster-marka" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:43 msgid "New title for bookmark:" -msgstr "New title for bookmark:" +msgstr "Laster-markaren izenburu berria" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:52 msgid "Export Bookmarks" -msgstr "Export Bookmarks" +msgstr "Esportatu laster-markak" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:54 msgid "Saved Bookmarks (*.pickle)" -msgstr "Saved Bookmarks (*.pickle)" +msgstr "Gorde laster-markak (*.pickle)" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:62 msgid "Import Bookmarks" -msgstr "Import Bookmarks" +msgstr "Inportatu laster-markak" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:62 msgid "Pickled Bookmarks (*.pickle)" -msgstr "Pickled Bookmarks (*.pickle)" +msgstr "Pickle horrekin prozesatutako laster-markak (*.pickle)" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 msgid "Name" -msgstr "Name" +msgstr "Izena" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager_ui.py:56 msgid "Bookmark Manager" -msgstr "Bookmark Manager" +msgstr "Laster-marken kudeatzailea" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager_ui.py:57 msgid "Actions" -msgstr "Actions" +msgstr "Ekintzak" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager_ui.py:58 msgid "Edit" -msgstr "Edit" +msgstr "Editatu" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager_ui.py:59 msgid "Delete" -msgstr "Delete" +msgstr "Ezabatu" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager_ui.py:60 msgid "Reset" -msgstr "Reset" +msgstr "Berrezarri" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager_ui.py:61 msgid "Export" -msgstr "Export" +msgstr "Esportatu" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager_ui.py:62 msgid "Import" -msgstr "Import" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:154 -msgid "Configure Ebook viewer" -msgstr "Configure Ebook viewer" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:155 -msgid "&Font options" -msgstr "&Font options" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:156 -msgid "Se&rif family:" -msgstr "Se&rif family:" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:157 -msgid "&Sans family:" -msgstr "&Sans family:" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:158 -msgid "&Monospace family:" -msgstr "&Monospace family:" +msgstr "Inportatu" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:159 -msgid "&Default font size:" -msgstr "&Default font size:" +msgid "Configure Ebook viewer" +msgstr "Liburu irakurgailua konfiguratu" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:160 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:168 -msgid " px" -msgstr " px" +msgid "&Font options" +msgstr "&Letra-tipo aukerak" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:161 -msgid "Monospace &font size:" -msgstr "Monospace &font size:" +msgid "Se&rif family:" +msgstr "Se&rif familia:" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:162 +msgid "&Sans family:" +msgstr "&Sans familia:" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:163 -msgid "S&tandard font:" -msgstr "S&tandard font:" +msgid "&Monospace family:" +msgstr "&Monospace familia:" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:164 +msgid "&Default font size:" +msgstr "&Lehenetsitako letra-tipo tamaina:" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:173 +msgid " px" +msgstr " pixelak" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:166 +msgid "Monospace &font size:" +msgstr "Monospace &letra-tipoaren tamaina:" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:168 +msgid "S&tandard font:" +msgstr "Letra-tipo es&tandarra:" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:169 msgid "Serif" msgstr "Serif" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:170 msgid "Sans-serif" msgstr "Sans-serif" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:171 msgid "Monospace" msgstr "Monospace" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:172 msgid "Remember last used &window size" -msgstr "Remember last used &window size" +msgstr "Gogoratu erabilitako azken &leiho tamaina" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:174 msgid "Maximum &view width:" -msgstr "Maximum &view width:" +msgstr "&bistaratze zabalera maximoa:" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:175 msgid "H&yphenate (break line in the middle of large words)" -msgstr "H&yphenate (break line in the middle of large words)" +msgstr "G&idoia (hitz elkarketetan \" - \"erabiltzen dena)" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:176 msgid "" "The default language to use for hyphenation rules. If the book does not " "specify a language, this will be used." msgstr "" -"The default language to use for hyphenation rules. If the book does not " -"specify a language, this will be used." - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:172 -msgid "Default &language for hyphenation:" -msgstr "Default &language for hyphenation:" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:173 -msgid "&Resize images larger than the viewer window (needs restart)" -msgstr "&Resize images larger than the viewer window (needs restart)" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:174 -msgid "&User stylesheet" -msgstr "&User stylesheet" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:175 -msgid "&General" -msgstr "&General" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:176 -msgid "Double click to change a keyboard shortcut" -msgstr "Double click to change a keyboard shortcut" +"Lehenetsitako hizkuntza gidoi kontuetako arauak izateko. Liburuak ez badu " +"hizkuntzarik zehazten hauxe erabiliko da." #: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:177 +msgid "Default &language for hyphenation:" +msgstr "Lehenetsitako &hizkuntza gidoi kontuetarako:" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:178 +msgid "&Resize images larger than the viewer window (needs restart)" +msgstr "" +"&Berrezarri leiho ikuskatzailea baino handiagoak diren irudiak (berrabiarazi " +"beharko)" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:179 +msgid "&User stylesheet" +msgstr "&Erabiltzailearen estilo-orria" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:180 +msgid "&General" +msgstr "&Orokorra" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:181 +msgid "Double click to change a keyboard shortcut" +msgstr "Egin klik birritan giltza laster-bidea aldatzeko" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:182 msgid "&Keyboard shortcuts" -msgstr "&Keyboard shortcuts" +msgstr "&Gilzadiko laster-bideak" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/dictionary.py:53 msgid "No results found for:" -msgstr "No results found for:" +msgstr "Ez da emaitzik aurkitu honetarako:" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:35 msgid "Options to customize the ebook viewer" -msgstr "Options to customize the ebook viewer" +msgstr "Liburu elektronikoen irakurgailua pertsonalizatzeko aukerak" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:676 msgid "Remember last used window size" -msgstr "Remember last used window size" +msgstr "Gogoratu erabilitako azken leiho tamaina" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:44 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:81 @@ -9555,219 +9817,227 @@ msgid "" "Set the user CSS stylesheet. This can be used to customize the look of all " "books." msgstr "" -"Set the user CSS stylesheet. This can be used to customize the look of all " -"books." +"Ezarri CSS (Cascading Style Sheets) estiloa. Hau liburu guztien itxura " +"pertsonalizatzeko erabil daiteke." #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:46 msgid "Maximum width of the viewer window, in pixels." -msgstr "Maximum width of the viewer window, in pixels." +msgstr "Zabalera maximoa ikustaileko leihoan, pixeletan." #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:48 msgid "Resize images larger than the viewer window to fit inside it" -msgstr "Resize images larger than the viewer window to fit inside it" +msgstr "" +"Ikustaileko leihoa baino handiagoak diren irudien neurriak aldatzen ditu, " +"ikustaileko leihora doitzeko" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49 msgid "Hyphenate text" -msgstr "Hyphenate text" +msgstr "Gidoidun \" - \"hitzak dituen testua" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:51 msgid "Default language for hyphenation rules" -msgstr "Default language for hyphenation rules" +msgstr "" +"Lehenetsitako zein hizkuntzatako gidoiei buruzko arautegia dago ezarrita" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:53 msgid "Font options" -msgstr "Font options" +msgstr "Letra-tipoaren aukerak" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:55 msgid "The serif font family" -msgstr "The serif font family" +msgstr "Serif letra-tipokoen familia" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:57 msgid "The sans-serif font family" -msgstr "The sans-serif font family" +msgstr "Sans-serif letra-tipokoen familia" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:59 msgid "The monospaced font family" -msgstr "The monospaced font family" +msgstr "Monospaced letra-tipokoen familia" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 msgid "The standard font size in px" -msgstr "The standard font size in px" +msgstr "Letra-tipo tamaina estandarra pixeletan" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:61 msgid "The monospaced font size in px" -msgstr "The monospaced font size in px" +msgstr "Monospaced letra-tipo tamaina pixeletan" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62 msgid "The standard font type" -msgstr "The standard font type" +msgstr "Letra-tipo estandarra" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:453 msgid "&Lookup in dictionary" -msgstr "&Lookup in dictionary" +msgstr "&Bilatu hiztegian" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:456 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:138 msgid "Go to..." -msgstr "Go to..." +msgstr "Joan horra..." #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:468 msgid "Next Section" -msgstr "Next Section" +msgstr "Hurrengo atala" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:469 msgid "Previous Section" -msgstr "Previous Section" +msgstr "Aurreko atala" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:471 msgid "Document Start" -msgstr "Document Start" +msgstr "Documentuaren hasiera" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:472 msgid "Document End" -msgstr "Document End" +msgstr "Documentuaren bukaera" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:474 msgid "Section Start" -msgstr "Section Start" +msgstr "Atalaren hasiera" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:475 msgid "Section End" -msgstr "Section End" +msgstr "Atalaren amaiera" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:12 msgid "Scroll to the next page" -msgstr "Scroll to the next page" +msgstr "Lekualdatu hurrengo orrialdera" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:15 msgid "Scroll to the previous page" -msgstr "Scroll to the previous page" +msgstr "Lekualdatu aurreko orrialdera" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:18 msgid "Scroll to the next section" -msgstr "Scroll to the next section" +msgstr "Lekualdatu hurrengo atalera" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:21 msgid "Scroll to the previous section" -msgstr "Scroll to the previous section" +msgstr "Lekualdatu aurrreko atalera" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:24 msgid "Scroll to the bottom of the section" -msgstr "Scroll to the bottom of the section" +msgstr "Lekualdatu atalaren beheko bukaeraraino" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:27 msgid "Scroll to the top of the section" -msgstr "Scroll to the top of the section" +msgstr "Lekualdatu atalaren goiko hasieraraino" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:30 msgid "Scroll to the end of the document" -msgstr "Scroll to the end of the document" +msgstr "Lekualdatu dokumentuaren amaieraraino" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:33 msgid "Scroll to the start of the document" -msgstr "Scroll to the start of the document" +msgstr "Lekualdatu dokumentuaren hasieraraino" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:36 msgid "Scroll down" -msgstr "Scroll down" +msgstr "Lekualdatu beherantz" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:39 msgid "Scroll up" -msgstr "Scroll up" +msgstr "Lekualdatu gorantz" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:42 msgid "Scroll left" -msgstr "Scroll left" +msgstr "Lekualdatu ezkerretara" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:45 msgid "Scroll right" -msgstr "Scroll right" +msgstr "Lekualdatu eskuinetara" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:115 msgid "Book format" -msgstr "Book format" +msgstr "Liburu formatua" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:185 msgid "Position in book" -msgstr "Position in book" +msgstr "Liburuko kokagunea" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:192 msgid "Go to a reference. To get reference numbers, use the reference mode." -msgstr "Go to a reference. To get reference numbers, use the reference mode." +msgstr "" +"Joan erreferentzia batera. Erreferentzia zenbakiak lortzeko, erreferentzia-" +"modua erabili." #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:200 msgid "Search for text in book" -msgstr "Search for text in book" +msgstr "Bilatu testua liburuan" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:269 msgid "Print Preview" -msgstr "Print Preview" +msgstr "Inprimatze-aurrebista" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:300 msgid "Connecting to dict.org to lookup: %s…" -msgstr "Connecting to dict.org to lookup: %s…" +msgstr "Konektatzen dict.org horrekin hauxe bilatzeko: %s…" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:399 msgid "Choose ebook" -msgstr "Choose ebook" +msgstr "Aukeratu liburua" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:400 msgid "Ebooks" -msgstr "Ebooks" +msgstr "Liburu elektronikoak" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:419 msgid "Add bookmark" -msgstr "Add bookmark" +msgstr "Gehitu laster-marka" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:419 msgid "Enter title for bookmark:" -msgstr "Enter title for bookmark:" +msgstr "Sartu laster-markaren izenburua:" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:442 msgid "No matches found for: %s" -msgstr "No matches found for: %s" +msgstr "Ez da bat etortzerik aurkitu %s horretarako" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:479 msgid "Loading flow..." -msgstr "Loading flow..." +msgstr "Jarioa kargatzen..." #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:515 msgid "Laying out %s" -msgstr "Laying out %s" +msgstr "Bistarazten %s" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:544 msgid "Manage Bookmarks" -msgstr "Manage Bookmarks" +msgstr "Kudeatu laster-markak" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:579 msgid "Loading ebook..." -msgstr "Loading ebook..." +msgstr "Liburu elektronikoa kargatzen..." #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:587 msgid "DRM Error" -msgstr "DRM Error" +msgstr "DRM, Digital Rights Management, sistemak eragindako errorea" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:588 msgid "

    This book is protected by DRM" -msgstr "

    This book is protected by DRM" +msgstr "" +"

    Liburu hau irakurtzeko murriztapenak daude: DRM \"Digital " +"Rights Management\"" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:592 msgid "Could not open ebook" -msgstr "Could not open ebook" +msgstr "Ezin izan da liburua zabaldu" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:666 msgid "Options to control the ebook viewer" -msgstr "Options to control the ebook viewer" +msgstr "Liburu elektronikoen irakurgailua kontrolatzeko aukerak" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:673 msgid "" "If specified, viewer window will try to come to the front when started." msgstr "" -"If specified, viewer window will try to come to the front when started." +"Zehazten bada, ikustailearen leihoa saiatuko da aurreko aldera etortzen " +"hasterakoan." #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:678 msgid "Print javascript alert and console messages to the console" -msgstr "Print javascript alert and console messages to the console" +msgstr "Inprimatu javascript alerta eta kontsola mezuak kontsolara" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:684 msgid "" @@ -9775,127 +10045,127 @@ msgid "" "\n" "View an ebook.\n" msgstr "" -"%prog [options] file\n" +"%prog [aukerak] fitxategia\n" "\n" -"View an ebook.\n" +"Ikusi liburu elektroniko bat.\n" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:189 msgid "E-book Viewer" -msgstr "E-book Viewer" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:185 -msgid "Close dictionary" -msgstr "Close dictionary" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:187 -msgid "toolBar" -msgstr "toolBar" +msgstr "Liburu elektronikoa irakurgailua" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:190 -msgid "Next page" -msgstr "Next page" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:191 -msgid "Previous page" -msgstr "Previous page" +msgid "Close dictionary" +msgstr "Itxi hiztegia" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:192 -msgid "Font size larger" -msgstr "Font size larger" +msgid "toolBar" +msgstr "Tresna-barra" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:193 -msgid "Font size smaller" -msgstr "Font size smaller" +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:195 +msgid "Next page" +msgstr "Hurrengo orrialdea" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:196 +msgid "Previous page" +msgstr "Aurreko orrialdea" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:197 -msgid "Find next" -msgstr "Find next" +msgid "Font size larger" +msgstr "Letra-tipoaren tamaina handiagoa" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:198 -msgid "Find next occurrence" -msgstr "Find next occurrence" +msgid "Font size smaller" +msgstr "Letra-tipoaren tamaina txikiiagoa" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:202 +msgid "Find next" +msgstr "Aurkitu hurrengoa" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:203 +msgid "Find next occurrence" +msgstr "Biatu hurrengo gertaera" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:204 msgid "F3" msgstr "F3" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 -msgid "Copy to clipboard" -msgstr "Copy to clipboard" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:202 -msgid "Reference Mode" -msgstr "Reference Mode" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:203 -msgid "Bookmark" -msgstr "Bookmark" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:204 -msgid "Toggle full screen" -msgstr "Toggle full screen" - #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:205 -msgid "Print" -msgstr "Print" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 -msgid "Find previous" -msgstr "Find previous" +msgid "Copy to clipboard" +msgstr "Kopiatu arbelean" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:207 -msgid "Find previous occurrence" -msgstr "Find previous occurrence" +msgid "Reference Mode" +msgstr "Erreferentzia modua" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:208 +msgid "Bookmark" +msgstr "Laster-marka" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:209 +msgid "Toggle full screen" +msgstr "Aldatu pantaila osora" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:210 +msgid "Print" +msgstr "Inprimatu" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:211 +msgid "Find previous" +msgstr "Aurkitu aurrekoa" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:212 +msgid "Find previous occurrence" +msgstr "Aurkitu aurreko gertaera" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:213 msgid "Shift+F3" -msgstr "Shift+F3" +msgstr "Maiusk.+F3" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/printing.py:114 msgid "Print eBook" -msgstr "Print eBook" +msgstr "Inprimatu liburu elektronikoa" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:257 msgid "Copy Image" -msgstr "Copy Image" +msgstr "Kopiatu irudia" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:258 msgid "Paste Image" -msgstr "Paste Image" +msgstr "Itsatsi irudia" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:383 msgid "Change Case" -msgstr "Change Case" +msgstr "Letra larriak/xeheak giltza aldatu" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 msgid "Upper Case" -msgstr "Upper Case" +msgstr "Letra larriak" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 msgid "Lower Case" -msgstr "Lower Case" +msgstr "Letra xeheak" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 msgid "Swap Case" -msgstr "Swap Case" +msgstr "Trukatu leta xehe/larri" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 msgid "Title Case" -msgstr "Title Case" +msgstr "Izenburuaren letra mota (xehe/larri)" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:838 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:857 msgid "Drag to resize" -msgstr "Drag to resize" +msgstr "Herrestan eraman tamaina doitzeko" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:892 msgid "Show" -msgstr "Show" +msgstr "Erakutsi" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:899 msgid "Hide" -msgstr "Hide" +msgstr "Ezkutatu" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:917 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:936 msgid "Toggle" msgstr "Txandakatu" @@ -9905,17 +10175,17 @@ msgid "" "your calibre book collection directly on the device. To do this you have to " "turn on the content server." msgstr "" -"If you use the WordPlayer e-book app on your Android phone, you can access " -"your calibre book collection directly on the device. To do this you have to " -"turn on the content server." +"Zure Android telefonoan WordPlayer e-book app erabiltzen baduzu, irits " +"zaitezke calibre liburu bildumara gailutik beratik. Hau egiteko gaitu egin " +"beharko duzu edukien zerbitzaria." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:374 msgid "" "Remember to leave calibre running as the server only runs as long as calibre " "is running." msgstr "" -"Remember to leave calibre running as the server only runs as long as calibre " -"is running." +"Gogoratu calibre exekutatzen uztea, zerbitzaria ibiliko da calibre dabilen " +"bitartean bakarrik." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:376 msgid "" @@ -9930,93 +10200,95 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:453 msgid "Moving library..." -msgstr "Moving library..." +msgstr "Mugitzen liburutegia..." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:469 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:470 msgid "Failed to move library" -msgstr "Failed to move library" +msgstr "Huts egin du liburutegia mugitzen" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:524 msgid "Invalid database" -msgstr "Invalid database" +msgstr "Datu base balio gabea" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:525 msgid "" "

    An invalid library already exists at %s, delete it before trying to move " "the existing library.
    Error: %s" msgstr "" -"

    An invalid library already exists at %s, delete it before trying to move " -"the existing library.
    Error: %s" +"

    Balio gabeko liburutegia dago %s horretan, ezabatu oraingo liburutegia " +"mugitzen saiatu baino lehen.
    Errorea: %s" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:536 msgid "Could not move library" -msgstr "Could not move library" +msgstr "Ezin izan da liburutegia mugitu" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:590 msgid "Select location for books" -msgstr "Select location for books" +msgstr "Hautatu liburuendako kokagunea" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:665 msgid "welcome wizard" -msgstr "welcome wizard" +msgstr "ongi-etorri laguntzailea" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:42 msgid "Welcome to calibre" -msgstr "Welcome to calibre" +msgstr "Ongi etorri calibrera" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:55 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:43 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:43 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:51 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:43 msgid "The one stop solution to all your e-book needs." -msgstr "The one stop solution to all your e-book needs." +msgstr "" +"Liburu elektronikoekin dauzkazun behar guztiak asebetetzeko irtenbidea" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:56 msgid "" "Choose your book reader. This will set the conversion options to produce " "books optimized for your device." msgstr "" -"Choose your book reader. This will set the conversion options to produce " -"books optimized for your device." +"Hautatu zure irakurgailua. Honek ezarriko ditu bihurketa aukerarik onenak, " +"zure irakurgailurako egokien diren formatuetara bihurketak egiteko." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:57 msgid "&Manufacturers" -msgstr "&Manufacturers" +msgstr "&Fabrikatzaileak" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/device_ui.py:58 msgid "&Devices" -msgstr "&Devices" +msgstr "&Gailuak" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:44 msgid "" "

    Congratulations!

    You have successfully setup calibre. Press the %s " "button to apply your settings." msgstr "" -"

    Congratulations!

    You have successfully setup calibre. Press the %s " -"button to apply your settings." +"

    Zorionak!

    Arrakastaz ezarri duzu calibre. Sakatu %s botoia zure " +"ezarpenak martxan hasteko." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:45 msgid "" "

    Demo videos

    Videos demonstrating the various features of calibre are " "available online." msgstr "" -"

    Demo videos

    Videos demonstrating the various features of calibre are " -"available online." +"

    Demo bideoak

    Bideo hauetan ikus daitezke calibrek eskaintzen dituen " +"hainbat aukeraonline." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:46 msgid "" "

    User Manual

    A User Manual is also available online." msgstr "" -"

    User Manual

    A User Manual is also available online." +"

    User Manual (Erabiltzailearen eskuliburua)

    Badago eskura, oraingoz " +"euskaratu gabe agian, Erabiltzailearen eskulibururik online." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:44 msgid "" @@ -10026,19 +10298,19 @@ msgid "" "button below. You will also have to register your gmail address in your " "Amazon account." msgstr "" -"

    calibre can automatically send books by email to your Kindle. To do that " -"you have to setup email delivery below. The easiest way is to setup a free " -"gmail account and click the Use gmail " -"button below. You will also have to register your gmail address in your " -"Amazon account." +"

    calibrek e-postaren bidez bidali ahal dizkio zure Kindle gailuari " +"liburuak. Hori egiteko zure e-posta bidalketa sistema konfiguratu beharko " +"duzu. Modurik errezena doako gmail kontua " +"eta egin klik Erabili gmail botoia azpian. Zure gmail helbidea zure Amazon " +"kontua erregistratu beharko, ere bai." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:45 msgid "&Kindle email:" -msgstr "&Kindle email:" +msgstr "&Kindle e-posta:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:52 msgid "Choose your &language:" -msgstr "Choose your &language:" +msgstr "Aukeratu zure &hizkuntza:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:53 msgid "" @@ -10058,124 +10330,133 @@ msgid "" "location. If a calibre library already exists at the new location, calibre " "will switch to using it." msgstr "" -"If you have an existing calibre library, it will be copied to the new " -"location. If a calibre library already exists at the new location, calibre " -"will switch to using it." +"Baldin badaukazu dagoeneko calibre liburutegia, kokaleku berrira kopiatuko " +"da. calibre liburutegia existitzen bada dagoeneko kokagune berrian, " +"calibrek aldatuko du hori erabiltzeko." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:32 msgid "Using: %s:%s@%s:%s and %s encryption" -msgstr "Using: %s:%s@%s:%s and %s encryption" +msgstr "Erabiltzen: %s:%s@%s:%s eta %s kodeketa" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:37 msgid "Sending..." -msgstr "Sending..." +msgstr "Bidaltzen..." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:42 msgid "Mail successfully sent" -msgstr "Mail successfully sent" +msgstr "E-posta arrakastaz igorria" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:124 msgid "Finish gmail setup" -msgstr "Finish gmail setup" +msgstr "Bukatu gmail konfiguratzen" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:125 msgid "" "Dont forget to enter your gmail username and password. You can sign up for a " "free gmail account at http://gmail.com" msgstr "" -"Dont forget to enter your gmail username and password. You can sign up for a " -"free gmail account at http://gmail.com" +"Ez ahantzi zure gmail kontuko erabiltzaile izena eta pasahitza sartzen. " +"Doaneko e-posta zerbitzuko kontua eskatzea duzu http://gmail.com horretan." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:140 msgid "Bad configuration" -msgstr "Bad configuration" +msgstr "Konfigurazio okerra" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:134 msgid "You must set the From email address" -msgstr "You must set the From email address" +msgstr "Aukeratu beharko duzu igorle e-posta helbidea" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:141 msgid "You must set the username and password for the mail server." -msgstr "You must set the username and password for the mail server." +msgstr "" +"Zehaztu beharko duzu erabiltzaile izena eta pasahitza e-posta " +"zerbitzariarentzat." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:108 msgid "Send email &from:" -msgstr "Send email &from:" +msgstr "Bidali e-posta &hemendik:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:109 msgid "" "

    This is what will be present in the From: field of emails sent by " "calibre.
    Set it to your email address" msgstr "" -"

    This is what will be present in the From: field of emails sent by " -"calibre.
    Set it to your email address" +"

    Hauxe da Igorlearen eremuan erakutsiko dena: calibrek bidalitako e-posta " +"mezuen igorlea.
    Ezarri ezazu zure e-posta helbidearekin." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:110 msgid "" "

    A mail server is useful if the service you are sending mail to only " "accepts email from well know mail services." msgstr "" -"

    A mail server is useful if the service you are sending mail to only " -"accepts email from well know mail services." +"

    E-posta zerbitzaria erabilgarria da batez ere zure mezua jasotzen ari den " +"zerbitzuak bakarrik onartzen baditu oso ezagunak diren e-posta zerbitzuetako " +"mezuak." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:111 msgid "Mail &Server" -msgstr "Mail &Server" +msgstr "E-posta &Zerbitzaria" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:112 msgid "calibre can optionally use a server to send mail" -msgstr "calibre can optionally use a server to send mail" +msgstr "" +"calibrek erabil dezake, hautazko, horrelako zerbitzari bat mezua " +"bidaltzeko" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:113 msgid "&Hostname:" -msgstr "&Hostname:" +msgstr "&Ostalariaren izena:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:114 msgid "The hostname of your mail server. For e.g. smtp.gmail.com" -msgstr "The hostname of your mail server. For e.g. smtp.gmail.com" +msgstr "" +"Zure e-posta zerbitzariaren ostalariaren izena. Esate baterako smtp.gmail.com" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:115 msgid "&Port:" -msgstr "&Port:" +msgstr "&Portua:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:116 msgid "" "The port your mail server listens for connections on. The default is 25" msgstr "" -"The port your mail server listens for connections on. The default is 25" +"Zure e-posta zerbitzariaren portua konexioen zain egongo da. Lehenetsita 25 " +"da" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:118 msgid "Your username on the mail server" -msgstr "Your username on the mail server" +msgstr "Zire erabiltzaile izena e-posta zerbitzarian" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:120 msgid "Your password on the mail server" -msgstr "Your password on the mail server" +msgstr "Zire pasahitza e-posta zerbitzarian" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:121 msgid "&Show" -msgstr "&Show" +msgstr "&Erakutsi" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:122 msgid "&Encryption:" -msgstr "&Encryption:" +msgstr "&Kodeketa:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:123 msgid "" "Use TLS encryption when connecting to the mail server. This is the most " "common." msgstr "" -"Use TLS encryption when connecting to the mail server. This is the most " -"common." +"Erabil ezazu TLS encryption, Transport Layer Security kodeketa, zure e-" +"postarekiko konexioan. Hauxe da erabiliena." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:124 msgid "&TLS" -msgstr "&TLS" +msgstr "&TLS (Transport Layer Security kodeketa)" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:125 msgid "Use SSL encryption when connecting to the mail server." -msgstr "Use SSL encryption when connecting to the mail server." +msgstr "" +"Erabili SSL encryption, Secure Sockets Layer kodeketa, e-posta " +"zerbitzariarekin konexioa egiterakoan." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126 msgid "&SSL" @@ -10183,11 +10464,11 @@ msgstr "&SSL" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:127 msgid "Use Gmail" -msgstr "Use Gmail" +msgstr "Erabili Gmail" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:128 msgid "&Test email" -msgstr "&Test email" +msgstr "&Aztertu e-posta" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:44 msgid "" @@ -10196,59 +10477,59 @@ msgid "" "directly on the device. To do this you have to turn on the calibre content " "server." msgstr "" -"

    If you use the Stanza e-" -"book app on your iPhone/iTouch, you can access your calibre book collection " -"directly on the device. To do this you have to turn on the calibre content " -"server." +"

    Erabiltzen baduzu Stanza " +"e-book app zure iPhone/iTouch, konekta dezakezu zure calibre liburu " +"bildumarekin zure gailutik zuzenean. Horretarako gaitu egin beharko duzu " +"zure calibreko edukien zerbitzaria." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:45 msgid "Turn on the &content server" -msgstr "Turn on the &content server" +msgstr "Gaitu &edukien zerbitzaria" #: /home/kovid/work/calibre/src/calibre/library/caches.py:230 msgid "today" -msgstr "today" +msgstr "gaur" #: /home/kovid/work/calibre/src/calibre/library/caches.py:233 msgid "yesterday" -msgstr "yesterday" +msgstr "atzo" #: /home/kovid/work/calibre/src/calibre/library/caches.py:236 msgid "thismonth" -msgstr "thismonth" +msgstr "hilabetehonetan" #: /home/kovid/work/calibre/src/calibre/library/caches.py:239 #: /home/kovid/work/calibre/src/calibre/library/caches.py:240 msgid "daysago" -msgstr "daysago" +msgstr "duelaegunbatzuk" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:404 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:414 msgid "no" -msgstr "no" +msgstr "Ez" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:404 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:414 msgid "unchecked" -msgstr "unchecked" +msgstr "aztertu gabea" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:407 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:417 msgid "checked" -msgstr "checked" +msgstr "aztertua" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:407 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:417 msgid "yes" -msgstr "yes" +msgstr "bai" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 msgid "blank" -msgstr "blank" +msgstr "hutsunea, zuriunea" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 msgid "empty" -msgstr "empty" +msgstr "hutsik" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:48 msgid "" @@ -10258,11 +10539,11 @@ msgid "" "Default: '%%default'\n" "Applies to: CSV, XML output formats" msgstr "" -"The fields to output when cataloging books in the database. Should be a " -"comma-separated list of fields.\n" -"Available fields: %s.\n" -"Default: '%%default'\n" -"Applies to: CSV, XML output formats" +"Erakutsiko diren irteera eremuak datu basean liburuak katalogatu eta gero. " +"Izan beharko luke komen bidez bereiziriko eremu zerrenda bat.\n" +"Eremu eskuragarriak: %s.\n" +"Lehenetsita: '%%default'\n" +"Aplikatu hauek: CSV, XML output formatuei" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:58 msgid "" @@ -10271,10 +10552,10 @@ msgid "" "Default: '%default'\n" "Applies to: CSV, XML output formats" msgstr "" -"Output field to sort on.\n" -"Available fields: author_sort, id, rating, size, timestamp, title.\n" -"Default: '%default'\n" -"Applies to: CSV, XML output formats" +"Output eremua sailkatzeko.\n" +"Eremu eskuragarriak: author_sort, id, rating, size, timestamp, title.\n" +"Lehenetsita: '%default'\n" +"Aplikatuko: CSV, XML output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:206 msgid "" @@ -10284,11 +10565,11 @@ msgid "" "Default: '%%default'\n" "Applies to: BIBTEX output format" msgstr "" -"The fields to output when cataloging books in the database. Should be a " -"comma-separated list of fields.\n" -"Available fields: %s.\n" -"Default: '%%default'\n" -"Applies to: BIBTEX output format" +"Erakutsiko diren irteera eremuak datu basean liburuak katalogatu eta gero. " +"Izan beharko luke komen bidez bereiziriko eremu zerrenda bat.\n" +"Eremu eskuragarriak: %s.\n" +"Lehenetsita: '%%default'\n" +"Aplikatu hauek: BIBTEX output formatuei" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:216 msgid "" @@ -10297,10 +10578,10 @@ msgid "" "Default: '%default'\n" "Applies to: BIBTEX output format" msgstr "" -"Output field to sort on.\n" -"Available fields: author_sort, id, rating, size, timestamp, title.\n" -"Default: '%default'\n" -"Applies to: BIBTEX output format" +"Output eremua sailkatzeko.\n" +"Eremu eskuragarriak: author_sort, id, rating, size, timestamp, title.\n" +"Lehenetsita: '%default'\n" +"Aplikatuko: BIBTEX output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:225 msgid "" @@ -10309,10 +10590,10 @@ msgid "" "Default: '%default'\n" "Applies to: BIBTEX output format" msgstr "" -"Create a citation for BibTeX entries.\n" -"Boolean value: True, False\n" -"Default: '%default'\n" -"Applies to: BIBTEX output format" +"BibTeX sarreretarako aipua sortu.\n" +"Boolear balioa: True, False\n" +"Lehenetsita: '%default'\n" +"Aplikatuko da: BIBTEX output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:234 msgid "" @@ -10322,11 +10603,11 @@ msgid "" "Default: '%%default'\n" "Applies to: BIBTEX output format" msgstr "" -"The template for citation creation from database fields.\n" -" Should be a template with {} enclosed fields.\n" -"Available fields: %s.\n" -"Default: '%%default'\n" -"Applies to: BIBTEX output format" +"Datu baseko eremuetatik sortzeko aipuen txantiloia.\n" +" Izan beharko litzateke {} itxitako eremu dituen txantiloia.\n" +"Eskuragarri dauden eremuak: %s.\n" +"Lehenetsita: '%%default'\n" +"Aplikatuko da: BIBTEX output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:244 msgid "" @@ -10335,10 +10616,10 @@ msgid "" "Default: '%default'\n" "Applies to: BIBTEX output format" msgstr "" -"BibTeX file encoding output.\n" -"Available types: utf8, cp1252, ascii.\n" -"Default: '%default'\n" -"Applies to: BIBTEX output format" +"BibTeX fitxategia kodetze outputa.\n" +"Mota eskuragarriak: utf8, cp1252, ascii.\n" +"Lehenetsita: '%default'\n" +"Aplikatuko da: BIBTEX output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:253 msgid "" @@ -10347,10 +10628,10 @@ msgid "" "Default: '%default'\n" "Applies to: BIBTEX output format" msgstr "" -"BibTeX file encoding flag.\n" -"Available types: strict, replace, ignore, backslashreplace.\n" -"Default: '%default'\n" -"Applies to: BIBTEX output format" +"BibTeX fitxategietako kodetze marka.\n" +"Mota eskuragarriak: strict, replace, ignore, backslashreplace.\n" +"Lehenetsita: '%default'\n" +"Aplikatuko da: BIBTEX output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:262 msgid "" @@ -10359,10 +10640,10 @@ msgid "" "Default: '%default'\n" "Applies to: BIBTEX output format" msgstr "" -"Entry type for BibTeX catalog.\n" -"Available types: book, misc, mixed.\n" -"Default: '%default'\n" -"Applies to: BIBTEX output format" +"Sartu mota BibTeX katalogorako.\n" +"Mota eskuragarriak: book, misc, mixed.\n" +"Lehenetsia: '%default'\n" +"Aplikatuko da: BIBTEX output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:530 msgid "" @@ -10370,9 +10651,9 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -"Title of generated catalog used as title in metadata.\n" -"Default: '%default'\n" -"Applies to: ePub, MOBI output formats" +"Sortutako katalogoaren izenburua metadatuetan izenburu bezala erabilia.\n" +"Lehenetsita: '%default'\n" +"Aplikatuko zaie ePub, MOBI irteera formatuei" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:537 msgid "" @@ -10407,11 +10688,13 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -"Comma-separated list of tag words indicating book should be excluded from " -"output. Case-insensitive.\n" -"--exclude-tags=skip will match 'skip this book' and 'Skip will like this'.\n" -"Default: '%default'\n" -"Applies to: ePub, MOBI output formats" +"Komen bidez bereiziriko etiketa hitzen zerrenda zehazten outputetik kendu " +"beharko litzatekeen liburua. Ez da letra xehe eta larrien artean bereiziko.\n" +"--exclude-tags=skip, salto egin, etiketak 'skip this book' liburu hau " +"saltatu etiketarekin bat egingo du eta baita 'Skip will like this' " +"etiketarekin (hau ere saltatuko).\n" +"Lehenetsita: '%default'\n" +"Aplikatuko da: ePub, MOBI output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:561 msgid "" @@ -10419,9 +10702,9 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -"Include 'Titles' section in catalog.\n" -"Default: '%default'\n" -"Applies to: ePub, MOBI output formats" +"Barnean harten du 'Titles' atala katalogoan (Izenburuak).\n" +"Lehenetsia: '%default'\n" +"Aplikatuko: ePub, MOBI output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:568 msgid "" @@ -10429,9 +10712,9 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -"Include 'Recently Added' section in catalog.\n" -"Default: '%default'\n" -"Applies to: ePub, MOBI output formats" +"Barnean dauka 'Recently Added' atala katalogoan (Duela gutxi erantsiak).\n" +"Lehenetsia: '%default'\n" +"Aplikatuko da: ePub, MOBI output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:575 msgid "" @@ -10439,9 +10722,10 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -"Tag prefix for user notes, e.g. '*Jeff might enjoy reading this'.\n" -"Default: '%default'\n" -"Applies to: ePub, MOBI output formats" +"Etiketa aurrizkia erabiltzailearen oharretarako, esate baterako. '*Jonek hau " +"pozik irakurriko luke'.\n" +"Lehenetsita: '%default'\n" +"Applikatuko da: ePub, MOBI output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:582 msgid "" @@ -10451,11 +10735,12 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -"Sort titles with leading numbers as text, e.g.,\n" -"'2001: A Space Odyssey' sorts as \n" -"'Two Thousand One: A Space Odyssey'.\n" -"Default: '%default'\n" -"Applies to: ePub, MOBI output formats" +"Ordenatu hasieran zenbakiak dauzkaten izenburuak baina testu legez , " +"esaterako,\n" +"'2001: Espazio odisea' ordenatuko da \n" +"'Bi mila eta bat: Espazio odisea'.\n" +"Lehentsita: '%default'\n" +"Aplikatuko da: ePub, MOBI output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:589 msgid "" @@ -10466,12 +10751,11 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -"Specifies the output profile. In some cases, an output profile is required " -"to optimize the catalog for the device. For example, 'kindle' or " -"'kindle_dx' creates a structured Table of Contents with Sections and " -"Articles.\n" -"Default: '%default'\n" -"Applies to: ePub, MOBI output formats" +"Zehazten du outputaren profila. Zenbait kasuta, output profila eskatuko da " +"irakurgailuaren katalogoa optimizatzeko. Adibidez, 'kindle' edo 'kindle_dx' " +"sortzen du Aurkibide estrukturatu bat atal eta artikuluekin.\n" +"Lehenetsita: '%default'\n" +"Aplikatuko da: ePub, MOBI output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:596 msgid "" @@ -10479,17 +10763,16 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -"Tag indicating book has been read.\n" -"Default: '%default'\n" -"Applies to: ePub, MOBI output formats" +"Liburua irakurri egin dela adierazten duen etiketa.\n" +"Lehenetsia: '%default'\n" +"Aplikatuko da: ePub, MOBI output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/cli.py:41 msgid "" "Path to the calibre library. Default is to use the path stored in the " "settings." msgstr "" -"Path to the calibre library. Default is to use the path stored in the " -"settings." +"calibre liburutegirako bidea. Lehenetsita hauxe: ezarpenetan gordetako bidea." #: /home/kovid/work/calibre/src/calibre/library/cli.py:120 msgid "" @@ -10497,9 +10780,9 @@ msgid "" "\n" "List the books available in the calibre database.\n" msgstr "" -"%prog list [options]\n" +"%prog list [aukerak]\n" "\n" -"List the books available in the calibre database.\n" +"calibre datu basean eskuragarri dauden liburuen zerrenda.\n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:128 msgid "" @@ -10509,11 +10792,12 @@ msgid "" "Default: %%default. The special field \"all\" can be used to select all " "fields. Only has effect in the text output format." msgstr "" -"The fields to display when listing books in the database. Should be a comma " -"separated list of fields.\n" -"Available fields: %s\n" -"Default: %%default. The special field \"all\" can be used to select all " -"fields. Only has effect in the text output format." +"Liburuak datu basean erakusten direnerako eremuak. Komen bidez bereiziriko " +"eremuen zerrenda izan beharko luke.\n" +"Eskuragarri dauden eremuak: %s\n" +"Lehenetsia: %%default. \"all\" eremu berezia, \"dena\", erabil daiteke " +"eremu guztiak batera hautatzeko. Testu output formatuetan besterik ez du " +"efektua izango." #: /home/kovid/work/calibre/src/calibre/library/cli.py:135 msgid "" @@ -10521,13 +10805,13 @@ msgid "" "Available fields: %s\n" "Default: %%default" msgstr "" -"The field by which to sort the results.\n" -"Available fields: %s\n" -"Default: %%default" +"Emaitzak ordenatzeko eremua.\n" +"Eskuragarri dauden eremuak: %s\n" +"Lehenetsia: %%default" #: /home/kovid/work/calibre/src/calibre/library/cli.py:137 msgid "Sort results in ascending order" -msgstr "Sort results in ascending order" +msgstr "Ordenatu emaitzak goranzka" #: /home/kovid/work/calibre/src/calibre/library/cli.py:139 msgid "" @@ -10544,36 +10828,36 @@ msgid "" "The maximum width of a single line in the output. Defaults to detecting " "screen size." msgstr "" -"The maximum width of a single line in the output. Defaults to detecting " -"screen size." +"Lerro sinple baten zabalera maximoa. Lehenetsitako balioa: pantailaren " +"tamaina detektatzea." #: /home/kovid/work/calibre/src/calibre/library/cli.py:142 msgid "The string used to separate fields. Default is a space." -msgstr "The string used to separate fields. Default is a space." +msgstr "Eremuak bereizteko erabiltzen den testua. Lehenetsia: espazio bat." #: /home/kovid/work/calibre/src/calibre/library/cli.py:143 msgid "" "The prefix for all file paths. Default is the absolute path to the library " "folder." msgstr "" -"The prefix for all file paths. Default is the absolute path to the library " -"folder." +"Fitxategi bide guztietarako aurrizkia. Lehenetsia: liburutegiko karpetarako " +"bide hutsa." #: /home/kovid/work/calibre/src/calibre/library/cli.py:165 msgid "Invalid fields. Available fields:" -msgstr "Invalid fields. Available fields:" +msgstr "Balio gabeko eremuak. Eskuragarri dauden eremuak:" #: /home/kovid/work/calibre/src/calibre/library/cli.py:172 msgid "Invalid sort field. Available fields:" -msgstr "Invalid sort field. Available fields:" +msgstr "Ordenatzeko eremu balio gabea. Eskuragarri dauden eremuak:" #: /home/kovid/work/calibre/src/calibre/library/cli.py:244 msgid "" "The following books were not added as they already exist in the database " "(see --duplicates option):" msgstr "" -"The following books were not added as they already exist in the database " -"(see --duplicates option):" +"Hurrengo liburuak ez dira gehitu zeren dagoeneko datu basean bazeuden (ikus -" +"-duplicates aukera: \"bikoiztuak\"):" #: /home/kovid/work/calibre/src/calibre/library/cli.py:267 msgid "" @@ -10583,23 +10867,23 @@ msgid "" "directories, see\n" "the directory related options below.\n" msgstr "" -"%prog add [options] file1 file2 file3 ...\n" +"%prog add [aukerak] fitxategi1 fitxategi2 fitxategi3 ...\n" "\n" -"Add the specified files as books to the database. You can also specify " -"directories, see\n" -"the directory related options below.\n" +"Gehitu zehaztutako fitxategiak datu basera. Direktorioak ere zehaztu " +"daitezke, ikus itzazu\n" +"direktorioei buruzko aukerak beherago.\n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:276 msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" -"Assume that each directory has only a single logical book and that all files " -"in it are different e-book formats of that book" +"Onartu direktorio bakoitzak liburu bakarra daukala loturik eta beraz " +"karpetako fitxategi guztiak liburu beraren formatu desberdinak direla" #: /home/kovid/work/calibre/src/calibre/library/cli.py:278 msgid "Process directories recursively" -msgstr "Process directories recursively" +msgstr "Prozesatu direktorioak modu errekurtsiboan" #: /home/kovid/work/calibre/src/calibre/library/cli.py:280 msgid "" @@ -10611,25 +10895,25 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "Add an empty book (a book with no formats)" -msgstr "Add an empty book (a book with no formats)" +msgstr "Gehitu liburu huts bat (formaturik gabeko liburu bat)" #: /home/kovid/work/calibre/src/calibre/library/cli.py:284 msgid "Set the title of the added empty book" -msgstr "Set the title of the added empty book" +msgstr "Ezarri hutsik gehitu duzun liburuaren izenburua" #: /home/kovid/work/calibre/src/calibre/library/cli.py:286 msgid "Set the authors of the added empty book" -msgstr "Set the authors of the added empty book" +msgstr "Ezarri hutsik gehitu duzun liburuaren egilearen izena" #: /home/kovid/work/calibre/src/calibre/library/cli.py:288 msgid "Set the ISBN of the added empty book" -msgstr "Set the ISBN of the added empty book" +msgstr "Ezarri hutsik gehitu duzun liburuaren ISBNa" #: /home/kovid/work/calibre/src/calibre/library/cli.py:313 msgid "You must specify at least one file to add" -msgstr "You must specify at least one file to add" +msgstr "Gutxienez fitxategi bat zehaztu beharko duzu gehitzeko" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:330 msgid "" "%prog remove ids\n" "\n" @@ -10643,11 +10927,11 @@ msgstr "" "bereiziriko ID zenbaki zerrenda bat izan beharko lukete ( ID zenbakiak " "eskura ditzakezu \"list\" agindua erabiliz). Adibidez, 23,34,57-85\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:344 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:345 msgid "You must specify at least one book to remove" msgstr "Ezabatzeko gutxienez liburu bat zehaztu beharko duzu" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:363 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:364 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -10662,16 +10946,16 @@ msgstr "" "ditzakezu \"list\" agindua erabiliz. Formatu existitzen bada dagoeneko, " "ordeztu egingo da.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:378 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:379 msgid "You must specify an id and an ebook file" msgstr "" "Zehaztu egin beharko duzu ID bat eta liburu-elektroniko fitxategi bat" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 msgid "ebook file must have an extension" msgstr "liburu elektronikoaren fitxategiak luzapena izan beharko du" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:392 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -10688,11 +10972,11 @@ msgstr "" "du, LRF edo TXT edo EPUB ezagunago horiek bezala. Liburu logikoak ez badu " "fmt eskurakagarririk, ez egin ezer.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:408 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:409 msgid "You must specify an id and a format" msgstr "Zehaztu behar duzu ID bat eta formatu bat" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:426 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:427 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -10708,15 +10992,15 @@ msgstr "" "identifikatutako liburuarentzat.\n" "id zera da, ID zenbakia \"list\" agindurako.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:434 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:435 msgid "Print metadata in OPF form (XML)" msgstr "Inprima itzazu metadatuak OPF formatuarekin (XML)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:443 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:444 msgid "You must specify an id" msgstr "ID bat zehaztu beharko duzu" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:456 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:458 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -10737,11 +11021,11 @@ msgstr "" "ikuspegi azkar bat izan dezakezu OPF formatuarena erabiliz --as-opf legez " "aldatuta show_metadata agindura.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:472 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:474 msgid "You must specify an id and a metadata file" msgstr "Zehazu beharko duzu IDren bat eta metadatuen fitxategiren bat" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:492 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:494 msgid "" "%prog export [options] ids\n" "\n" @@ -10759,28 +11043,28 @@ msgstr "" "eta metadatuak barne (formatu honetan,\n" "OPF fitxategi formatuan). Lor ditzakezu ID zenbakiak \"list\" agindutik.\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:500 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:502 msgid "Export all books in database, ignoring the list of ids." msgstr "" "Esportatu data-baseko liburu guztiak, ID zerrendari ez ikusiarena eginez." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:502 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:504 msgid "Export books to the specified directory. Default is" msgstr "Esportatu liburua zehaztutako direktoriora. Lehenetsita hauxe:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:504 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:506 msgid "Export all books into a single directory" msgstr "Esportatu liburu guztiak direktorio sinple batera" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:511 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:513 msgid "Specifying this switch will turn this behavior off." msgstr "Aldaketa hau zehaztuz jokabide hau bertan behera geratuko da." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:534 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:536 msgid "You must specify some ids or the %s option" msgstr "ID batzuk zehaztu egin beharko dituzu edo %s aukera" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:547 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:549 msgid "" "%prog add_custom_column [options] label name datatype\n" "\n" @@ -10798,7 +11082,7 @@ msgstr "" "goitizena da.\n" "datu-mota hauetako bat da: {0}\n" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:556 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:558 msgid "" "This column stores tag like data (i.e. multiple comma separated values). " "Only applies if datatype is text." @@ -10807,7 +11091,7 @@ msgstr "" "bereiziriko balioak). Aplikatuko da datu-tipoa testua baldin bada, besterik " "ez." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:560 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:562 msgid "" "A dictionary of options to customize how the data in this column will be " "interpreted." @@ -10815,11 +11099,11 @@ msgstr "" "Aukeren glosario bat pertsonalizatzeko nola interpretatuko diren datuak " "zutabe honetan." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:573 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:575 msgid "You must specify label, name and datatype" msgstr "Zehaztu beharko duzu etiketa mota, izena eta datu tipoa" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:631 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:633 msgid "" "\n" " %prog catalog /path/to/destination.(csv|epub|mobi|xml ...) [options]\n" @@ -10839,7 +11123,7 @@ msgstr "" "katalogoaren outputa, helburua.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:645 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:647 msgid "" "Comma-separated list of database IDs to catalog.\n" "If declared, --search is ignored.\n" @@ -10849,7 +11133,7 @@ msgstr "" "Adierazten bada, --search hori baztertu egingo da.\n" "Lehenetsita: dena" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:649 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:651 msgid "" "Filter the results by the search query. For the format of the search query, " "please see the search-related documentation in the User Manual.\n" @@ -10860,18 +11144,18 @@ msgstr "" "Erabiltzailearen eskuliburuan.\n" "Lehenetsita: irazkirik ez" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:655 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:657 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:505 msgid "Show detailed output information. Useful for debugging" msgstr "" "Erakutsi output informazioa, irteera informazioa, ondo zehaztuta. " "Akatsgabetzeko erabilgarria" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:668 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:670 msgid "Error: You must specify a catalog output file" msgstr "Errorea: zehaztu beharko duzu irteera katalogo fitxategi bat" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:710 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:712 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -10893,7 +11177,7 @@ msgstr "" " agindua.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:721 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:723 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." @@ -10901,11 +11185,11 @@ msgstr "" "Zutabeak balio anitz gordetzen baditu, erantsi zehaztutako balioak " "lehenagotik zeuden balioetara, ordeztu beharrean." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:732 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:734 msgid "Error: You must specify a field name, id and value" msgstr "Errorea: zehaztu behar duzu eremu izen bat, ID bat eta balio bat" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:751 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:753 msgid "" "\n" " %prog custom_columns [options]\n" @@ -10920,19 +11204,19 @@ msgstr "" "Erakusten ditu zutabeen etiketak eta IDak.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:758 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:760 msgid "Show details for each column." msgstr "Erakutsi zehaztasunak zutabe bakoitzean." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:770 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:772 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "Galduko dituzu zutabeko datu guztiak: %r. Ziur zaude (bai/ez)? " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:772 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 msgid "y" msgstr "bai" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:778 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:780 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -10949,15 +11233,15 @@ msgstr "" " zutabeak custom_columns aginduarekin, (pertsonalizatu_zutabeak).\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:788 msgid "Do not ask for confirmation" msgstr "Ez eskatu baieztapenik" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:796 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:798 msgid "Error: You must specify a column label" msgstr "Errorea: zutabearen etiketa zehaztu beharko duzu" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:803 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:805 msgid "" "\n" " %prog saved_searches [options] list\n" @@ -10980,41 +11264,41 @@ msgstr "" " ordeztu egingo dela.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:821 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:823 msgid "Error: You must specify an action (add|remove|list)" msgstr "Errorea: ekintza bat zehaztu behar duzu (gehitu|ezabatu|zerrendatu)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:829 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:831 msgid "Name:" msgstr "Izena:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:830 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:832 msgid "Search string:" msgstr "Katea bilatzen:" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:836 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:838 msgid "Error: You must specify a name and a search string" msgstr "Errorea: zehaztu behar duzu izen bat eta bilaketa-kate bat" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:839 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:841 msgid "added" msgstr "gehiturik" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:844 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:846 msgid "Error: You must specify a name" msgstr "Errorea: izen bat zehaztu behar duzu" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:847 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:849 msgid "removed" msgstr "ezabaturik" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:851 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:853 msgid "Error: Action %s not recognized, must be one of: (add|remove|list)" msgstr "" "Errorea: %s ekintza ezezaguntzat hartu da, hauetako bat beharko: " "(gehitu|ezabatu|zerrendatu)" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:865 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:867 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -11050,33 +11334,33 @@ msgstr "" msgid "%sAverage rating is %3.1f" msgstr "%sBatezbesteko balorazioa hauxe: %3.1f" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:596 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:648 msgid "Main" msgstr "Nagusia" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1915 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1981 msgid "

    Migrating old database to ebook library in %s

    " msgstr "" "

    Migrazioa egiten datu base zaharretik liburu elektronikoen liburutegira " "zera honetan: %s

    " -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1944 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2010 msgid "Copying %s" msgstr "Kopiatzen %s" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1961 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2027 msgid "Compacting database" msgstr "Trinkotzen datu basea" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2054 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2120 msgid "Checking SQL integrity..." msgstr "Aztertzen SQL-ren osotasuna..." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2095 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2159 msgid "Checking for missing files." msgstr "Aztertzen fitxategi galduen bila." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2117 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2181 msgid "Checked id" msgstr "Aztertutako ID" @@ -11172,10 +11456,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:63 msgid "" "Comma separated list of formats to save for each book. By default all " -"available books are saved." +"available formats are saved." msgstr "" -"Liburu bakoitzari buruz gordetzeko komen bidez bereiziriko formatuen " -"zerrenda. Lehenetsita hauxe: eskuragarri dauden liburu guztiak gordeko dira." +"Liburu bakoitzaren komen bidez bereizitako formatuen zerrenda gordetzeko. " +"Lehenetsita: eskuragarri dauden formatu guztiak gordeko dira." #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:66 msgid "" @@ -11317,53 +11601,54 @@ msgid "" "overrides any per-library settings specified in the GUI" msgstr "" "Murrizketa bat zehazten du aginte hau ematerakoan. Aukera honek aldera uzten " -"ditu GUI horretan zehazten diren liburutegietako ezarpenak" +"ditu GUI (Graphical User Interface) horretan zehazten diren liburutegietako " +"ezarpenak" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:111 msgid "%d book" msgstr "%d liburua" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:129 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:130 msgid "%d items" msgstr "%d elementuak" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:146 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:147 msgid "RATING: %s
    " msgstr "BALORAZIOA: %s
    " -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:149 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:150 msgid "TAGS: %s
    " msgstr "ETIKETAK: %s
    " -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:153 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:154 msgid "SERIES: %s [%s]
    " msgstr "SERIEAK: %s [%s]
    " -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:233 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:249 msgid "Books in your library" msgstr "Zure liburutegiko liburuak" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:239 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:255 msgid "By " msgstr "Egilea: " -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:240 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:256 msgid "Books sorted by " msgstr "Liburuak honen arabera sailkatuak: " -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 msgid "Newest" msgstr "Berriena" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:34 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:32 msgid "%sUsage%s: %s\n" msgstr "%sErabilera%s: %s\n" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:78 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:76 msgid "Created by " msgstr "Sortzailea: " -#: /home/kovid/work/calibre/src/calibre/utils/config.py:79 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:77 msgid "" "Whenever you pass arguments to %prog that have spaces in them, enclose the " "arguments in quotation marks." @@ -11371,65 +11656,69 @@ msgstr "" "Espazioak dauzkaten argumentuak %prog horretara pasatzen dituzunean, idatzi " "argumentuak aipu marken artean, kakotxen artean." -#: /home/kovid/work/calibre/src/calibre/utils/config.py:663 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:697 msgid "Path to the database in which books are stored" msgstr "Liburuak gordeta dauden datu baserako bidea" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:665 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:699 msgid "Pattern to guess metadata from filenames" msgstr "Fitxategi-izenetatik metadatuak asmatzeko eredua" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:667 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:701 msgid "Access key for isbndb.com" msgstr "isbndb.com horretan sartzeko pasahitza" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:669 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:703 msgid "Default timeout for network operations (seconds)" msgstr "Lehenetsitako denbora-muga interneteko eragiketetarako (segundoak)" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:671 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:705 msgid "Path to directory in which your library of books is stored" msgstr "Zure liburuak gordeta dauden liburutegiko direktoriorako bidea" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:673 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:707 msgid "The language in which to display the user interface" msgstr "Erabiltzailearen interfazean erakutsiko den hizkuntza" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:675 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:709 msgid "The default output format for ebook conversions." msgstr "" "Lehenetsitako irteera formatua liburu elektronikoen formatu bihurketetan." -#: /home/kovid/work/calibre/src/calibre/utils/config.py:679 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:713 msgid "Ordered list of formats to prefer for input." msgstr "" "Sorburu bezala hobesten diren formatuak hobesten diren moduan zerrendatuta." -#: /home/kovid/work/calibre/src/calibre/utils/config.py:681 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:715 msgid "Read metadata from files" msgstr "Irakurri metadatuak fitxategietatik" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:683 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:717 msgid "The priority of worker processes" msgstr "Lanean dauden prozesuen lehentasuna" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:685 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:719 msgid "Swap author first and last names when reading metadata" msgstr "Trukatu egilearen izena eta deitura metadatuak irakurtzerakoan" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:687 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:721 msgid "Add new formats to existing book records" msgstr "Gehitu formatu berriak dagoeneko grabatuta dauden liburuetara" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:692 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:723 +msgid "Tags to apply to books added to the library" +msgstr "Liburutegira gehitutako liburuei eransteko etiketak" + +#: /home/kovid/work/calibre/src/calibre/utils/config.py:727 msgid "List of named saved searches" msgstr "Izenarekin gorde diren bilaketen zerrenda" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:693 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:728 msgid "User-created tag browser categories" msgstr "Erabiltzaileak sortutako arakatzailerako etiketen kategoriak" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:695 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:730 msgid "How and when calibre updates metadata on the device." msgstr "Nola eta noiz eguneratzen ditu calibrek metadatuak irakurgailuan." @@ -11555,7 +11844,7 @@ msgstr "Huts egin du SSH saioa ezartzerakoan: " msgid "Failed to authenticate with server: %s" msgstr "Huts egin du zerbitzariarekin egiaztatzerakon: %s" -#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:234 +#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:230 msgid "Control email delivery" msgstr "Kontrolatu e-posta banaketa" @@ -11709,7 +11998,7 @@ msgstr "Zu" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:82 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:193 msgid "Scheduled" -msgstr "Programatua" +msgstr "Planifikatua" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:84 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:194 @@ -11827,6 +12116,9 @@ msgstr "Ez deskargatu CSS (Cascading Style Sheets) estilo orririk." #~ msgid "Communicate with the BeBook Mini eBook reader." #~ msgstr "Komunikatu BeBook Mini eBook irakurgailuarekin." +#~ msgid "Communicate with the Kindle 2 eBook reader." +#~ msgstr "Komunikatu Kindle 2 eBook irakurgailuarekin." + #~ msgid "Communicate with the Sony PRS-600/700 eBook reader." #~ msgstr "Komunikatu Sony PRS-600/700 eBook irakurgailuarekin." @@ -11838,3 +12130,186 @@ msgstr "Ez deskargatu CSS (Cascading Style Sheets) estilo orririk." #~ msgid "Communicate with the Promedia eBook reader" #~ msgstr "Jar zaitez harremanetan \"Promedia eBook reader\" horrekin." + +#~ msgid "" +#~ "Email\n" +#~ "Delivery" +#~ msgstr "" +#~ "E-posta \n" +#~ "banaketa" + +#~ msgid "Add/Save" +#~ msgstr "Gehitu/Gorde" + +#~ msgid "System port selected" +#~ msgstr "System port selected" + +#~ msgid "TabWidget" +#~ msgstr "TabWidget" + +#~ msgid "General" +#~ msgstr "Orokorra" + +#~ msgid "&Tweaks" +#~ msgstr "&Tweaks Aldaketak" + +#~ msgid "" +#~ "Values for the tweaks are shown below. Edit them to change the behavior of " +#~ "calibre" +#~ msgstr "" +#~ "Aldaketen balioak beherago bistaratzeko prest. Edita itzazu Calibreren " +#~ "jokabidea aldatzeko" + +#~ msgid "&Miscellaneous" +#~ msgstr "&Miscellaneous" + +#~ msgid "&Restore to defaults" +#~ msgstr "&Restore lehenetsitakoak berrezarri" + +#~ msgid "Alt+S" +#~ msgstr "Alt+S" + +#~ msgid "Switch to library..." +#~ msgstr "Aldatu liburutegira..." + +#~ msgid "" +#~ "The selected books will be permanently deleted and the files removed " +#~ "from your computer. Are you sure?" +#~ msgstr "" +#~ "Hautatutako liburuak betiko ezabatuak izango dira eta ezabatutako " +#~ "fitxategiak zure ordenagailutik desagertuko dira betiko. Ziur zaude?" + +#~ msgid "" +#~ "Content\n" +#~ "Server" +#~ msgstr "" +#~ "Edukia\n" +#~ "Zerbitzaria" + +#~ msgid "Invalid size" +#~ msgstr "Onartzen ez den tamaina" + +#~ msgid "The size %s is invalid. must be of the form widthxheight" +#~ msgstr "Tamaina hau %s bai, onartzen da. luzexzabal itxurakoa behar du" + +#~ msgid "Must restart" +#~ msgstr "Berrabiarazi beharko" + +#~ msgid "Read metadata only from &file name" +#~ msgstr "Irakurri metadatuak &fitxategi-izenetik bakarrik" + +#~ msgid "&Saving books" +#~ msgstr "Liburuak &Gordetzen" + +#~ msgid "" +#~ "Here you can control how calibre will save your books when you click the " +#~ "Send to Device button. This setting can be overriden for individual devices " +#~ "by customizing the device interface plugins in Preferences->Plugins" +#~ msgstr "" +#~ "Hemendik kontrola dezakezu calibre aplikazioak nola gordeko dituen zure " +#~ "liburuak \"Bidali irakurgailura\" botoia sakatzen duzunean. Ezarpen hau alde " +#~ "batera utz daiteke irakurgailu pribatuetan trepetaren gehigarrien interfazea " +#~ "pertsonalizatuz honela: Hobespenak->Gehigarriak" + +#~ msgid "Sending to &device" +#~ msgstr "Igortzen &irakurgailura" + +#~ msgid "Use &Roman numerals for series number" +#~ msgstr "Erabili &Erromatar zenbakiak zenbaki segidetan" + +#~ msgid "Show ¬ifications in system tray" +#~ msgstr "Erakutsi &ohartarazpenak sistemaren erretiluan" + +#~ msgid "Select visible &columns in library view" +#~ msgstr "Hautatu ikusiko diren &zutabeak liburutegi-bista moduan" + +#~ msgid "Show &donate button (restart)" +#~ msgstr "Erakutsi &emaitzak egiteko botoia (berrabiarazi)" + +#~ msgid "Create Tag-based Column" +#~ msgstr "Sortu etiketetan oinarritutako zutabea" + +#~ msgid "Column heading" +#~ msgstr "Zutabearen goiburua" + +#~ msgid "Column type" +#~ msgstr "Zutabe mota" + +#~ msgid "Use brackets" +#~ msgstr "Erabil itzazu parentesiak" + +#~ msgid "Values can be edited" +#~ msgstr "Edita daitezkeen balioak" + +#~ msgid "Text" +#~ msgstr "Testua" + +#~ msgid "Tag on book" +#~ msgstr "Liburuaren etiketa" + +#~ msgid "Explanation text added in create_ct_column.py" +#~ msgstr "Azalpen testua gehituta zera honetan: create_ct_column.py" + +#~ msgid "Create and edit tag-based columns" +#~ msgstr "Sortu eta editatu etiketetan oinarrituriko zutabeak" + +#~ msgid "Download &cover" +#~ msgstr "Deskargatu &liburu-azala" + +#~ msgid "" +#~ "The value %d you have chosen for the content server port is a system " +#~ "port. Your operating system may not allow the server to run on this " +#~ "port. To be safe choose a port number larger than 1024." +#~ msgstr "" +#~ "Balio hau %d aukeratu duzu zerbitzariaren portuaren edukia izateko " +#~ "baina sistemaren portua da. Zeure sistema eragileak, behar bada, ez " +#~ "dio baimenduko zerbitzariari portu honetan zerbait exekutatzen. Ziur " +#~ "egoteko, aukera ezazu 1024 baino handiagoa den portu zenbakia." + +#~ msgid "" +#~ "The changes you made require that Calibre be restarted. Please restart as " +#~ "soon as practical." +#~ msgstr "" +#~ "Egindako aldaketek calibre berrabiaraztea eskatzen dute. Mesedez, " +#~ "berrabiarazi ahalik eta lehenen." + +#~ msgid "" +#~ "
  • Manual Management: Calibre updates the metadata and adds " +#~ "collections only when a book is sent. With this option, calibre will never " +#~ "remove a collection.
  • \n" +#~ "
  • Only on send: Calibre updates metadata and adds/removes " +#~ "collections for a book only when it is sent to the device.
  • \n" +#~ "
  • Automatic management: Calibre automatically keeps metadata on the " +#~ "device in sync with the calibre library, on every connect
  • " +#~ msgstr "" +#~ "
  • Eskuz egindako kudeaketa: calibrek eguneratzen ditu metadatuak " +#~ "eta bildumak gehitzen ditu liburu bat igortzen denean bakar-bakarrik. Aukera " +#~ "honekin, calibrek ez du inoiz bilduma bat ezabatuko.
  • \n" +#~ "
  • Igortzeko bakarrik: calibrek liburu batean eguneraturiko " +#~ "metadatuak eta calibrek gehitutako/ezabatutako bildumak irakurgailura igorri " +#~ "egin direnean bakarrik
  • \n" +#~ "
  • Kudeaketa automatikoa: calibrek modu automatikoan gordetzen ditu " +#~ "metadatuak irakurgailuan calibre liburutegiarekin sinkronizaturik, " +#~ "konektatzen den bakoitzean
  • " + +#~ msgid "&Adding books" +#~ msgstr "&Gehitzen liburuak" + +#~ msgid "Lookup name" +#~ msgstr "Bilatu izena" + +#~ msgid "Number" +#~ msgstr "Kopurua" + +#~ msgid "" +#~ "Comma separated list of formats to save for each book. By default all " +#~ "available books are saved." +#~ msgstr "" +#~ "Liburu bakoitzari buruz gordetzeko komen bidez bereiziriko formatuen " +#~ "zerrenda. Lehenetsita hauxe: eskuragarri dauden liburu guztiak gordeko dira." + +#~ msgid "Toolbars/Context menus" +#~ msgstr "Tresna-barra/Testuingura menuak" + +#~ msgid "Restore to &default" +#~ msgstr "Berrezarri &lehenetsia" diff --git a/src/calibre/translations/fi.po b/src/calibre/translations/fi.po index 2768b99aa5..c72ee8e299 100644 --- a/src/calibre/translations/fi.po +++ b/src/calibre/translations/fi.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-08-20 20:19+0000\n" -"PO-Revision-Date: 2010-08-26 22:09+0000\n" +"POT-Creation-Date: 2010-08-27 18:12+0000\n" +"PO-Revision-Date: 2010-08-27 20:19+0000\n" "Last-Translator: Rami Selin \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-08-27 03:36+0000\n" +"X-Launchpad-Export-Date: 2010-08-28 03:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -23,11 +23,11 @@ msgstr "Ei tee mitään" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:72 -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:75 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:507 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:522 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -35,15 +35,15 @@ msgstr "Ei tee mitään" #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:407 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:70 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:72 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:335 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:338 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:336 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:339 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:236 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:279 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:282 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:398 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:240 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:283 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:286 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:20 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:21 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 @@ -100,10 +100,10 @@ msgstr "Ei tee mitään" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:82 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:234 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:236 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:293 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:300 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:247 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:330 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:289 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:292 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:172 @@ -158,23 +158,31 @@ msgstr "Kanta" msgid "File type" msgstr "Tiedostotyyppi" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:206 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:208 msgid "Metadata reader" msgstr "Metatietojen lukija" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:235 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:238 msgid "Metadata writer" msgstr "Metatietojen kirjoittaja" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:263 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:268 msgid "Catalog generator" msgstr "Katalogin luoja" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:359 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:366 msgid "User Interface Action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:16 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 +msgid "Preferences" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -184,7 +192,7 @@ msgstr "" "kaikki linkitetyt tiedostot. Tämä lisäosa ajetaan aina lisätessäsi HTML-" "tiedoston kirjastoon." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:52 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -192,7 +200,7 @@ msgstr "" "HTML-tiedostojen merkkikoodaus. Yleisiä vaihtoehtoja: cp1252, latin1, iso-" "8859-1 ja utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:59 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -202,52 +210,61 @@ msgstr "" "pmlname_img tai images. Tämä lisäosa ajetaan aina lisätessäsi PML-tiedoston " "kirjastoon." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:93 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 msgid "Extract cover from comic files" msgstr "Poimi kansi sarjakuvatiedostosta" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:120 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:131 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:143 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:153 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:163 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:174 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:184 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:204 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:214 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:224 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:235 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:246 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:258 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:279 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:290 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:300 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:310 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:121 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:132 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:144 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:154 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:164 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:175 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:185 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:195 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:205 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:215 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:225 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:236 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:247 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:259 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:280 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:291 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:301 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:311 msgid "Read metadata from %s files" msgstr "Lue metatiedot %s -tiedostoista" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:269 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:270 msgid "Read metadata from ebooks in RAR archives" msgstr "Lue metatiedot RAR-arkiston e-kirjoista" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:321 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:322 msgid "Read metadata from ebooks in ZIP archives" msgstr "Lue metatiedot ZIP-arkiston e-kirjoista" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:334 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:344 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:354 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:376 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:387 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:397 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:335 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:345 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:355 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:377 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:388 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:398 msgid "Set metadata in %s files" msgstr "Aseta metatiedot %s -tiedostoille" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:365 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:366 msgid "Set metadata from %s files" msgstr "Aseta metatiedot %s -tiedostoista" +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:681 +msgid "Look and Feel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199 +msgid "Interface" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102 msgid "Conversion Input" msgstr "Muunnon syöttö" @@ -407,35 +424,35 @@ msgstr "" msgid "This profile is intended for the Amazon Kindle DX." msgstr "Tämä profiili on tarkoitettu Amazon Kindle DX -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:33 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 msgid "Installed plugins" msgstr "Asennetut lisäosat" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 msgid "Mapping for filetype plugins" msgstr "Tiedostotyyppien lisäosan kuvaus" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:36 msgid "Local plugin customization" msgstr "Paikallisten lisäosien säätö" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:36 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:37 msgid "Disabled plugins" msgstr "Käytöstä poistetut lisäosat" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:37 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:38 msgid "Enabled plugins" msgstr "Käytössä olevat pluginit" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:85 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 msgid "No valid plugin found in " msgstr "Sopivaa lisäosaa ei löydetty " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:489 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 msgid "Initialization of plugin %s failed with traceback:" msgstr "%s lisäosan alustaminen epäonnistui:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:522 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 msgid "" " %prog options\n" "\n" @@ -447,17 +464,17 @@ msgstr "" " Säädä calibrea lataamalla ulkoisia lisäosia.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:528 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "Lisää lisäosa määrittämällä sen sisältävän zip-tiedoston polku." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" "Poista valinnainen lisäosa nimen perusteella. Ei vaikuta " "sisäänrakennettuihin lisäosiin" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:532 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." @@ -465,15 +482,15 @@ msgstr "" "Säädä lisäosaa. Määritä lisäosan nimi ja säädöksen käskyjono pilkulla " "erotettuna." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 msgid "List all installed plugins" msgstr "Listaa kaikki asennetut lisäosat" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:536 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 msgid "Enable the named plugin" msgstr "Salli nimetty lisäosa" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:538 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 msgid "Disable the named plugin" msgstr "Poista nimetty lisäosa käytöstä" @@ -689,15 +706,15 @@ msgstr "Kommunikoi JetBook-lukijan kanssa." msgid "Communicate with the MiBuk Wolder reader." msgstr "Kommunikoi MiBuk Wolder -lukijan kanssa" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:42 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 msgid "Communicate with the Kindle eBook reader." msgstr "Kommunikoi Kindle-lukijan kanssa." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:169 -msgid "Communicate with the Kindle 2 eBook reader." -msgstr "Kommunikoi Kindle 2 -lukijan kanssa." +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:170 +msgid "Communicate with the Kindle 2/3 eBook reader." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:210 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:211 msgid "Communicate with the Kindle DX eBook reader." msgstr "Kommunikoi Kindle DX -lukijan kanssa." @@ -708,7 +725,7 @@ msgstr "Kommunikoi Kobo Readerin kanssa" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:53 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:56 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:59 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:161 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:170 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -718,33 +735,33 @@ msgstr "Kommunikoi Kobo Readerin kanssa" msgid "Getting list of books on device..." msgstr "Haetaan listaa laitteella olevista kirjoista..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:221 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:265 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 msgid "Removing books from device..." msgstr "Poistetaan kirjoja laitteelta..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:269 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:276 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:285 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "Poistetaan kirjoja laitteen metatietolistasta..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:281 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:315 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:290 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:324 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "Lisätään kirjoja laitteen metatietolistaan..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:366 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:251 msgid "Not Implemented" msgstr "Ei toteutettu" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:367 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:376 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." @@ -1687,7 +1704,7 @@ msgstr "" msgid "Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:147 #: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:77 msgid "Table of Contents:" @@ -1705,20 +1722,27 @@ msgstr "" msgid "Add Table of Contents to beginning of the book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:248 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:24 +msgid "" +"Try to turn chapters into individual sections. WARNING: This option is " +"experimental. It can cause conversion to fail. It can also produce " +"unexpected output." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:249 msgid "" "Traverse links in HTML files breadth first. Normally, they are traversed " "depth first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:255 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:256 msgid "" "Maximum levels of recursion when following links in HTML files. Must be non-" "negative. 0 implies that no links in the root HTML file are followed. " "Default is %default." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:264 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:265 msgid "" "Normally this input plugin re-arranges all the input files into a standard " "folder hierarchy. Only use this option if you know what you are doing as it " @@ -1726,7 +1750,7 @@ msgid "" "pipeline." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:272 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:273 msgid "" "Average line length for line breaking if the HTML is from a previous partial " "conversion of a PDF file. Default is %default which disables this." @@ -1941,7 +1965,7 @@ msgstr "" msgid "Comic" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:397 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 @@ -1954,7 +1978,7 @@ msgstr "" msgid "Title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:398 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:364 @@ -1962,18 +1986,18 @@ msgstr "" msgid "Author(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:399 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:403 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:400 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:404 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:405 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:210 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:211 @@ -1985,7 +2009,7 @@ msgstr "" msgid "Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:409 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:413 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 @@ -1995,7 +2019,7 @@ msgstr "" msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:411 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:415 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 @@ -2005,22 +2029,22 @@ msgstr "" msgid "Series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:412 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:416 msgid "Language" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:414 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:416 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:420 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:422 msgid "Rights" msgstr "" @@ -2650,7 +2674,7 @@ msgid "" "Specify the character encoding of the output document. The default is cp1252." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:194 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:196 msgid "" "This RTF file has a feature calibre does not support. Convert it to HTML " "first and then try it.\n" @@ -2712,262 +2736,266 @@ msgid "" "allows max-line-length to be below the minimum" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 msgid "Send file to storage card instead of main memory by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Confirm before deleting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 msgid "Main window geometry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Notify when a new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Use Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 msgid "Sort tags list by name, popularity, or rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Number of covers to show in the cover browsing mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Defaults for conversion to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 msgid "Options for the LRF ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:84 msgid "Formats that are viewed using the internal viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 msgid "Columns to be displayed in the book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 msgid "Automatically launch content server on application startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Oldest news kept in database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Show system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 msgid "Upload downloaded news to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Delete books from library after uploading to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "Disable notifications from the system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Default action to perform when send to device button is clicked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:119 msgid "Maximum number of waiting worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 msgid "Download social metadata (tags/rating/etc.)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 msgid "Overwrite author and title with new metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 msgid "tag browser categories not to display" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 msgid "The layout of the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 msgid "Show the average rating per item indication in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Disable UI animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:181 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:479 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:433 msgid "Choose Files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:25 -msgid "A" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:25 msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 -msgid "Add books from a single directory" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:26 +msgid "Add books to the calibre library/device from files on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:27 +msgid "A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 msgid "" "Add books from directories, including sub-directories (One book per " "directory, assumes every ebook file is the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 msgid "" "Add books from directories, including sub directories (Multiple books per " "directory, assumes every ebook file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:42 msgid "Add Empty book. (Book entry with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:44 msgid "Add from ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:83 msgid "How many empty books?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:140 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:200 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 msgid "Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:209 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:210 msgid "" "Some duplicates were found and merged into the following existing books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:55 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 msgid "No book files found" msgstr "" @@ -2975,6 +3003,10 @@ msgstr "" msgid "Add books to library" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add_to_library.py:14 +msgid "Add books to your calibre library from the connected device" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:499 msgid "Fetch annotations (experimental)" @@ -2991,9 +3023,9 @@ msgid "User annotations generated from main library only" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:99 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 @@ -3031,43 +3063,43 @@ msgid "Location %d • %s
    " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:33 msgid "Create catalog of books in your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:32 msgid "No books selected to generate catalog for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:49 msgid "Generating %s catalog..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:264 msgid "No books found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:55 msgid "" "No books to catalog\n" "Check exclude tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:65 msgid "Catalog generated." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 msgid "Export Catalog Directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 msgid "Select destination for %s.%s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110 msgid "%d books" msgstr "" @@ -3076,36 +3108,36 @@ msgstr "" msgid "Choose calibre library to work with" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:83 msgid "Switch to library..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:91 msgid "Quick switch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:149 msgid "No library found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:150 msgid "" "No existing calibre library was found at %s. It will be removed from the " "list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:187 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:540 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:183 msgid "You cannot change libraries when a device is connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:188 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -3117,19 +3149,19 @@ msgstr "" msgid "Convert books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:27 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:29 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:114 msgid "Starting conversion of %d book(s)" msgstr "" @@ -3141,34 +3173,34 @@ msgstr "" msgid "Copy selected books to the specified library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98 msgid "Cannot copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103 msgid "No library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:104 msgid "No library found at %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:111 msgid "Copying" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 msgid "Could not copy books: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:234 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:124 msgid "Copied %d books to %s" msgstr "" @@ -3261,46 +3293,46 @@ msgid "" "you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:26 msgid "Connect to folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:31 msgid "Connect to iTunes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:48 msgid "Start Content Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:50 msgid "Stop Content Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:69 msgid "Email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:69 msgid " and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:81 msgid "Setup email based sharing of books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:98 msgid "D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:98 msgid "Send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:117 msgid "Connect/share" msgstr "" @@ -3308,6 +3340,10 @@ msgstr "" msgid "Manage collections" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_collections.py:14 +msgid "Manage the collections on this device" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 msgid "E" msgstr "" @@ -3390,8 +3426,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:608 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:566 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1001 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "" @@ -3474,27 +3510,20 @@ msgstr "" msgid "Ctrl+P" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 -msgid "Preferences" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 msgid "Run welcome wizard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:32 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:34 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:39 msgid "Cannot configure before calibre is restarted." msgstr "" @@ -3573,11 +3602,11 @@ msgstr "" msgid "I" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 msgid "No detailed information is available for books on the device." msgstr "" @@ -3685,39 +3714,39 @@ msgstr "" msgid "No books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:328 msgid "Added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:341 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:342 msgid "" "The add books process seems to have hung. Try restarting calibre and adding " "the books in smaller increments, until you find the problem book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:358 msgid "" "Books with the same title as the following already exist in the database. " "Add them anyway?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:361 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:428 msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:481 msgid "Saved" msgstr "" @@ -3806,26 +3835,25 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:634 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:635 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:639 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:103 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:156 @@ -3841,6 +3869,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:267 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:269 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:186 @@ -3882,7 +3917,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:100 msgid "Formats" @@ -3908,7 +3943,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:282 msgid "None" msgstr "" @@ -3961,7 +3996,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:31 #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:166 @@ -3980,9 +4015,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 msgid "Form" msgstr "" @@ -4278,13 +4316,17 @@ msgstr "" msgid "FB2 Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:47 msgid "&Inline TOC" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:33 +msgid "Sectionize Chapters (Use with care!)" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:99 msgid "Font rescaling wizard" msgstr "" @@ -4533,7 +4575,7 @@ msgid " is not a valid picture" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 msgid "Book Cover" msgstr "" @@ -4542,28 +4584,27 @@ msgid "Use cover from &source file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 msgid "Change &cover image:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "Browse for an image to use as the cover of this book." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 msgid "&Title: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:362 msgid "Change the title of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 msgid "&Author(s): " msgstr "" @@ -4578,41 +4619,41 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "&Publisher: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid "Ta&gs: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

    They can be any words or phrases, separated by commas." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 msgid "&Series:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:175 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 msgid "List of known series. You can add new series." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid "Book " msgstr "" @@ -5090,7 +5131,7 @@ msgid " index:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 msgid "Automatically number books in this series" msgstr "" @@ -5245,7 +5286,7 @@ msgid "Attached, you will find the e-book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 msgid "by" msgstr "" @@ -5502,257 +5543,265 @@ msgstr "" msgid "Edit Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:173 msgid "%(plugin_type)s %(plugins)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:174 msgid "plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:183 msgid "" "\n" "Customization: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:198 msgid "General" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:198 -msgid "Interface" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 msgid "Conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201 msgid "" "Email\n" "Delivery" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:202 msgid "Add/Save" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:203 msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:204 msgid "" "Content\n" "Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:205 msgid "Plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 msgid "Auto send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 msgid "Email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:234 msgid "Formats to email. The first matching format will be sent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:235 msgid "" "If checked, downloaded news will be automatically mailed
    to this email " "address (provided it is in one of the listed formats)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:308 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:309 msgid "new email address" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 msgid "Wide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:492 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 msgid "Narrow" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 msgid "Medium" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 msgid "Small" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 msgid "Large" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 msgid "Always" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 msgid "Automatic" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 msgid "Never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:529 +msgid "Toolbars/Context menus" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:543 msgid "Done" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:544 msgid "Confirmation dialogs have all been reset" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:549 msgid "System port selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:550 msgid "" "The value %d you have chosen for the content server port is a system " "port. Your operating system may not allow the server to run on this " "port. To be safe choose a port number larger than 1024." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:567 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:570 msgid "Failed to install command line tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:573 msgid "Command line tools installed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:574 msgid "Command line tools installed in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:572 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:575 msgid "" "If you move calibre.app, you have to re-install the command line tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:623 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:626 msgid "No valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:624 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:627 msgid "%s is not a valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:630 msgid "Choose plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:639 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:642 msgid "Plugin cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:643 msgid "The plugin: %s cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:649 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:652 msgid "Plugin not customizable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:650 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:653 msgid "Plugin: %s does not need customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:661 msgid "Customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:696 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:699 msgid "Cannot remove builtin plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:697 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:700 msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:715 msgid "Invalid tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:716 msgid "" "The tweaks you entered are invalid, try resetting the tweaks to default and " "changing them one by one until you find the invalid setting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:746 msgid "You must select a column to delete it" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:751 msgid "The selected column is not a custom column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:749 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:752 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:48 msgid "Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:753 msgid "Do you really want to delete column %s and all its data?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:817 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:820 msgid "Error log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:824 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:827 msgid "Access log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:852 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:855 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 msgid "Failed to start content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:880 msgid "Invalid size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:878 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:881 msgid "The size %s is invalid. must be of the form widthxheight" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:944 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:947 msgid "Must restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:945 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:948 msgid "" "The changes you made require that Calibre be restarted. Please restart as " "soon as practical." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:979 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:982 msgid "Checking database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:999 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1002 msgid "Failed to check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1004 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1007 msgid "Some inconsistencies found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1005 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1008 msgid "" "The following books had formats listed in the database that are not actually " "available. The entries for the formats have been removed. You should check " @@ -5890,323 +5939,355 @@ msgstr "" msgid "Sending to &device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:603 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:128 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:604 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:127 msgid "Download &social metadata (tags/ratings/etc.) by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:126 msgid "&Overwrite author and title by default when fetching metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:131 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:132 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:133 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:100 msgid "Choose &language (requires restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:134 msgid "Normal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:135 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:136 msgid "Low" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:137 msgid "Job &priority:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:138 msgid "Preferred &output format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 msgid "Reset all disabled &confirmation dialogs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:142 msgid "Preferred &input format order:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 -msgid "Use &Roman numerals for series number" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 -msgid "Enable system &tray icon (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 -msgid "Show ¬ifications in system tray" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 -msgid "Show &splash screen at startup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:623 -msgid "Show cover &browser in a separate window (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 -msgid "Show &average ratings in the tags browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:625 -msgid "Search as you type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:626 -msgid "Automatically send downloaded &news to ebook reader" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 -msgid "&Delete news from library when it is automatically sent to reader" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 -msgid "&Number of covers to show in browse mode (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:629 -msgid "Select visible &columns in library view" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 -msgid "Remove a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 -msgid "Add a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:635 -msgid "Edit settings of a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:638 -msgid "Use internal &viewer for:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:639 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:98 msgid "User Interface &layout (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:623 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:99 +msgid "&Number of covers to show in browse mode (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 msgid "Restriction to apply when the current library is opened:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:625 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 msgid "" "Apply this restriction on calibre startup if the current library is being " "used. Also applied when switching to this library. Note that this setting is " "per library. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:626 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:102 msgid "Disable all animations. Useful if you have a slow/old computer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:103 msgid "Disable &animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:644 -msgid "Show &donate button (restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:110 msgid "&Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:629 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:111 msgid "&Icon size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:647 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:112 msgid "Show &text under icons:" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 +msgid "&Delete news from library when it is automatically sent to reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 +msgid "Select visible &columns in library view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:634 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:79 +msgid "Remove a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 +msgid "Add a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:638 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 +msgid "Edit settings of a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:145 +msgid "Use internal &viewer for:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:109 +msgid "Search as you type" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:107 +msgid "Use &Roman numerals for series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:644 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:104 +msgid "Enable system &tray icon (needs restart)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:101 +msgid "Show &average ratings in the tags browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:129 +msgid "Automatically send downloaded &news to ebook reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:647 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 +msgid "Show &splash screen at startup" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:648 -msgid "Add an email address to which to send books" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:108 +msgid "Show cover &browser in a separate window (needs restart)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:649 -msgid "&Add email" +msgid "Show ¬ifications in system tray" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:650 -msgid "Make &default" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:662 +msgid "&Miscellaneous" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:651 -msgid "&Remove email" +msgid "Add an email address to which to send books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:652 +msgid "&Add email" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:653 +msgid "Make &default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654 +msgid "&Remove email" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655 msgid "" "calibre can send your books to you (or your reader) by email. Emails will be " "automatically sent for downloaded news to all email addresses that have Auto-" "send checked." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:653 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:656 msgid "&Maximum number of waiting worker processes (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:657 msgid "Limit the max. simultaneous jobs to the available CPU &cores" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:658 msgid "Debug &device detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:659 msgid "&Check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:657 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:660 msgid "Open calibre &configuration directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:661 msgid "&Install command line tools" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:659 -msgid "&Miscellaneous" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:660 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:663 msgid "" "Values for the tweaks are shown below. Edit them to change the behavior of " "calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:664 msgid "All available tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:665 msgid "&Current tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:663 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:666 msgid "&Restore to defaults" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:664 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:667 msgid "&Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:665 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:668 msgid "" "calibre contains a network server that allows you to access your book " "collection using a browser from anywhere in the world. Any changes to the " "settings will only take effect after a server restart." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:666 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:669 msgid "Server &port:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:667 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:670 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 msgid "&Username:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:668 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:671 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 msgid "&Password:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:672 msgid "" "If you leave the password blank, anyone will be able to access your book " "collection using the web interface." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:673 msgid "" "The maximum size (widthxheight) for displayed covers. Larger covers are " "resized. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:671 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:674 msgid "Max. &cover size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 msgid "&Show password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:673 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676 msgid "Max. &OPDS items per query:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:674 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677 msgid "Max. OPDS &ungrouped items:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:678 msgid "Restriction (saved search) to apply:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:679 msgid "" "This restriction (based on a saved search) will restrict the books the " "content server makes available to those matching the search. This setting is " "per library (i.e. you can have a different restriction per library)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:680 msgid "&Start Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:681 msgid "St&op Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:682 msgid "&Test Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:680 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:683 msgid "Run server &automatically on startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:684 msgid "View &server logs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:685 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46 msgid "" "

    Remember to leave calibre running as the server only runs as long as " @@ -6217,33 +6298,33 @@ msgid "" "the IP address of the computer calibre is running on." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:687 msgid "" "Here you can customize the behavior of Calibre by controlling what plugins " "it uses." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:688 msgid "Enable/&Disable plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:689 msgid "&Customize plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:687 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 msgid "&Remove plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:688 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:691 msgid "Add new plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:689 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:692 msgid "Plugin &file:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:694 msgid "&Add" msgstr "" @@ -6462,63 +6543,87 @@ msgstr "" msgid "Downloading social metadata, please wait..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:35 +msgid "Switch between library and device views" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:38 msgid "Separator" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:51 msgid "Choose library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:201 msgid "The main toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:202 msgid "The main toolbar when a device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:203 msgid "The context menu for the books in the calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:205 msgid "The context menu for the books on the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94 -msgid "Customize the actions in:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:243 +msgid "Cannot add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95 -msgid "A&vailable actions" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:244 +msgid "Cannot add the actions %s to this location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96 -msgid "&Current actions" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:261 +msgid "Cannot remove" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:262 +msgid "Cannot remove the actions %s from this location" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97 -msgid "Move selected action up" +msgid "Customize the actions in:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98 +msgid "A&vailable actions" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99 +msgid "&Current actions" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100 +msgid "Move selected action up" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102 msgid "Move selected action down" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 msgid "Ctrl+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:105 msgid "Add selected actions to toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:107 msgid "Remove selected actions from toolbar" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:109 +msgid "Restore to &default" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50 msgid "&Show this warning again" msgstr "" @@ -6671,78 +6776,86 @@ msgstr "" msgid "Editing meta information for %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:225 msgid "Applying changes to %d books. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160 msgid "Edit Meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:162 msgid "A&utomatically set author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:163 msgid "Author s&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "&Rating:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid "Rating of this book. 0-5 stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid " stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:175 msgid "&Remove tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 msgid "Comma separated list of tags to remove from the books. " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177 -msgid "Remove &format:" +msgid "Remove all" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:178 +msgid "Check this box to remove all tags from the books." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:182 +msgid "Remove &format:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 msgid "&Swap title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -6750,24 +6863,24 @@ msgid "" "Book A will have series number 1 and Book B series number 2." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189 msgid "" "Remove stored conversion settings for the selected books.\n" "\n" "Future conversion of these books will use the default settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:192 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "&Basic metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 msgid "&Custom metadata" msgstr "" @@ -6908,88 +7021,92 @@ msgstr "" msgid "Could not open %s. Is it being used by another program?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:359 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:360 msgid "Meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:363 msgid "Swap the author and title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 msgid "Author S&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 msgid "" "Automatically create the author sort entry based on the current author entry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "IS&BN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 msgid "Publishe&d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "dd MMM yyyy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "&Date:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 msgid "&Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 msgid "&Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "Set the cover for the book from the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 msgid "Update metadata from the metadata in the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +msgid "&Browse" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "Reset cover to default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 msgid "Download &cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Generate a default cover based on the title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 msgid "&Generate cover" msgstr "" @@ -7720,48 +7837,48 @@ msgstr "" msgid "Regular expression (?P)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:97 msgid "Cover Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:102 msgid "Shift+Alt+B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:116 msgid "Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:118 msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:138 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:139 msgid "created by Kovid Goyal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:157 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:218 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:212 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:222 msgid "Shift+Alt+D" msgstr "" @@ -7828,77 +7945,77 @@ msgstr "" msgid " - Jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:53 msgid "Eject this device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:62 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:194 msgid "Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 msgid "Show books in calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 msgid "Reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 msgid "Show books in the main memory of the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 #: /home/kovid/work/calibre/src/calibre/library/database2.py:598 msgid "Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 msgid "Show books in storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 #: /home/kovid/work/calibre/src/calibre/library/database2.py:600 msgid "Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 msgid "Show books in storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:109 msgid "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:140 msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:153 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:162 msgid "" "

    Search the list of books by title, author, publisher, tags, comments, " "etc.

    Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:169 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 msgid "Copy current search text (instead of search name)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 msgid "Save current search under the name shown in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Delete current saved search" msgstr "" @@ -8212,9 +8329,24 @@ msgstr "" msgid "No matches found for this book" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:77 +msgid "" +"Here you can re-arrange the layout of the columns in the calibre library " +"book list. You can hide columns by unchecking them. You can also create your " +"own, custom columns." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:86 +msgid "Add &custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:106 +msgid "Disable ¬ifications in system tray" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:255 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:562 msgid "Search" msgstr "" @@ -8434,64 +8566,64 @@ msgid "" "reconvert them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169 msgid "&Donate to support calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:215 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:413 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:445 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 msgid "" "

    Could not convert: %s

    It is a DRMed book. You must " "first remove the DRM using third party tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:431 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:482 msgid "" "is the result of the efforts of many volunteers from all over the world. If " "you find it useful, please consider donating to support its development. " "Your donation helps keep calibre development going." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:508 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511 msgid "" " is communicating with the device!
    \n" " Quitting may cause corruption on the device.
    \n" " Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:573 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -8968,47 +9100,47 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:246 msgid "Copy Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:247 msgid "Paste Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:372 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:373 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:374 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:375 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:376 msgid "Title Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:838 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:846 msgid "Drag to resize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:881 msgid "Show" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:888 msgid "Hide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:917 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:925 msgid "Toggle" msgstr "" @@ -10163,63 +10295,63 @@ msgid "" "arguments in quotation marks." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:663 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:696 msgid "Path to the database in which books are stored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:665 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:698 msgid "Pattern to guess metadata from filenames" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:667 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:700 msgid "Access key for isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:669 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:702 msgid "Default timeout for network operations (seconds)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:671 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:704 msgid "Path to directory in which your library of books is stored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:673 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:706 msgid "The language in which to display the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:675 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:708 msgid "The default output format for ebook conversions." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:679 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:712 msgid "Ordered list of formats to prefer for input." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:681 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:714 msgid "Read metadata from files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:683 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:716 msgid "The priority of worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:685 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:718 msgid "Swap author first and last names when reading metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:687 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:720 msgid "Add new formats to existing book records" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:692 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:725 msgid "List of named saved searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:693 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:726 msgid "User-created tag browser categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:695 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:728 msgid "How and when calibre updates metadata on the device." msgstr "" @@ -10555,6 +10687,9 @@ msgstr "" msgid "Do not download CSS stylesheets." msgstr "" +#~ msgid "Communicate with the Kindle 2 eBook reader." +#~ msgstr "Kommunikoi Kindle 2 -lukijan kanssa." + #~ msgid "Communicate with the Sony PRS-600/700/900 eBook reader." #~ msgstr "Kommunikoi Sony PRS-600/700/900 -lukijoiden kanssa." diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index 49ab69f2af..ad7068faa4 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -6,14 +6,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-20 20:19+0000\n" -"PO-Revision-Date: 2010-08-22 19:32+0000\n" -"Last-Translator: Kovid Goyal \n" +"POT-Creation-Date: 2010-09-07 19:28+0000\n" +"PO-Revision-Date: 2010-09-08 14:31+0000\n" +"Last-Translator: Pierre-Yves Gillier \n" "Language-Team: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-08-23 03:54+0000\n" +"X-Launchpad-Export-Date: 2010-09-09 04:41+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: 1177,-1,-1,-1,-1,-1,-1,-1,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -23,12 +23,13 @@ msgid "Does absolutely nothing" msgstr "Ne fait strictement rien" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 -#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:72 -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:75 +#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:395 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:507 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:522 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -36,15 +37,15 @@ msgstr "Ne fait strictement rien" #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:407 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:70 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:72 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:335 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:338 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:336 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:339 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:236 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:279 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:282 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:398 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:240 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:283 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:286 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:20 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:21 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 @@ -101,22 +102,22 @@ msgstr "Ne fait strictement rien" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:82 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:234 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:236 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:293 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:300 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:289 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:292 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:247 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1163 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1166 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1155 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1158 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 @@ -131,17 +132,17 @@ msgstr "Ne fait strictement rien" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:186 #: /home/kovid/work/calibre/src/calibre/library/cli.py:213 #: /home/kovid/work/calibre/src/calibre/library/database.py:913 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:362 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:374 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1007 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1076 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1760 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1762 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1889 -#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:201 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139 -#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:70 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:376 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:388 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1059 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1128 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1826 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1828 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1955 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:211 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:140 +#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:71 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:117 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:64 @@ -159,23 +160,33 @@ msgstr "Base" msgid "File type" msgstr "Type de fichier" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:206 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:208 msgid "Metadata reader" msgstr "Lecteur de métadonnées" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:235 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:238 msgid "Metadata writer" msgstr "Éditeur de métadonnées" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:263 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:268 msgid "Catalog generator" msgstr "Générateur de catalogue" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:359 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:366 msgid "User Interface Action" msgstr "Action d'interface utilisateur" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:16 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 +msgid "Preferences" +msgstr "Préférences" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -185,7 +196,7 @@ msgstr "" "contenant tous les fichiers liés. Ce plug-in est lancé chaque fois que vous " "ajoutez un fichier HTML à la bibliothèque." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:52 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -193,7 +204,7 @@ msgstr "" "Encodage des caractères pour les fichiers HTML en entrée. Les choix les plus " "communs incluent : cp1252, latin1, iso-8859-1 et utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:59 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -203,52 +214,210 @@ msgstr "" "le répertoire pmlname_img ou images. Ce plugin est lancé à chaque ajout d'un " "fichier PML dans la bibliothèque." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:93 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 msgid "Extract cover from comic files" msgstr "Extraction de la couverture depuis des fichiers de bandes dessinées" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:120 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:131 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:143 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:153 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:163 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:174 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:184 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:204 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:214 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:224 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:235 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:246 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:258 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:279 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:290 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:300 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:310 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:121 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:132 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:144 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:154 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:164 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:175 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:185 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:195 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:205 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:215 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:225 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:236 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:247 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:259 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:280 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:291 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:301 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:311 msgid "Read metadata from %s files" msgstr "Lecture des métadonnées depuis les fichiers %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:269 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:270 msgid "Read metadata from ebooks in RAR archives" msgstr "Lecture des métadonnées des ebooks contenus dans les archives RAR" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:321 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:322 msgid "Read metadata from ebooks in ZIP archives" msgstr "Lecture des métadonnées des ebooks contenus dans les archives ZIP" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:334 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:344 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:354 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:376 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:387 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:397 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:335 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:345 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:355 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:377 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:388 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:398 msgid "Set metadata in %s files" msgstr "Définir les métadonnées des fichiers %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:365 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:366 msgid "Set metadata from %s files" msgstr "Définir les métadonnées à partir des fichiers %s" +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:682 +msgid "Look and Feel" +msgstr "Apparence" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:684 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:707 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +msgid "Interface" +msgstr "Interface" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 +msgid "Adjust the look and feel of the calibre interface to suit your tastes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 +msgid "Behavior" +msgstr "Comportement" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 +msgid "Change the way calibre behaves" +msgstr "Changer le comportement de calibre" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:705 +msgid "Add your own columns" +msgstr "Ajouter vos colonnes personnalisées" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +msgid "Add/remove your own columns to the calibre book list" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:716 +msgid "Customize the toolbar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 +msgid "" +"Customize the toolbars and context menus, changing which actions are " +"available in each" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 +msgid "Input Options" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +msgid "Conversion" +msgstr "Conversion" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 +msgid "Set conversion options specific to each input format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:739 +msgid "Common Options" +msgstr "Options communes" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +msgid "Set conversion options common to all formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:750 +msgid "Output Options" +msgstr "Formats de sortie" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 +msgid "Set conversion options specific to each output format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:761 +msgid "Adding books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +msgid "Import/Export" +msgstr "Import/Export" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 +msgid "Control how calibre reads metadata from files when adding books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 +msgid "Saving books to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +msgid "" +"Control how calibre exports files from its database to disk when using Save " +"to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +msgid "Sending books to devices" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +msgid "Control how calibre transfers files to your ebook reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +msgid "Sharing books by email" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 +msgid "Sharing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +msgid "" +"Setup sharing of books via email. Can be used for automatic sending of " +"downloaded news to your devices" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +msgid "Sharing over the net" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 +msgid "" +"Setup the calibre Content Server which will give you access to your calibre " +"library from anywhere, on any device, over the internet" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 +msgid "Plugins" +msgstr "Plugins" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 +msgid "Advanced" +msgstr "Mode avancé" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +msgid "Add/remove/customize various bits of calibre functionality" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 +msgid "Tweaks" +msgstr "Ajustements" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +msgid "Fine tune how calibre behaves in various contexts" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +msgid "Miscellaneous" +msgstr "Divers" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +msgid "Miscellaneous advanced configuration" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102 msgid "Conversion Input" msgstr "Conversion (entrée)" @@ -404,35 +573,35 @@ msgstr "" msgid "This profile is intended for the Amazon Kindle DX." msgstr "Ce profil est prévu pour le Kindle DX d'Amazon." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:33 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 msgid "Installed plugins" msgstr "Plugins installés" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 msgid "Mapping for filetype plugins" msgstr "Liaisons pour les plugins d'import/export" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:36 msgid "Local plugin customization" msgstr "Personnalisation des plugins locaux" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:36 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:37 msgid "Disabled plugins" msgstr "Plugins désactivés." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:37 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:38 msgid "Enabled plugins" msgstr "Plugins activés" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:85 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 msgid "No valid plugin found in " msgstr "Absence de plugin compatible dans " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:489 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 msgid "Initialization of plugin %s failed with traceback:" msgstr "L'initialisation du plugin %s a échoué en laissant une trace:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:522 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 msgid "" " %prog options\n" "\n" @@ -444,18 +613,18 @@ msgstr "" " Personnaliser Calibre en chargeant des modules additionnels externes.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:528 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "" "Ajouter un plugin en précisant le chemin vers le fichier zip qui le contient." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" "Suppression d'un plugin personnalisé d'après son nom. Ceci n'a pas d'effet " "sur les plugins intégrés." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:532 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." @@ -463,15 +632,15 @@ msgstr "" "Personnaliser le plugin. Spécifier le nom du plugin et la chaîne de " "personnalisation séparés par une virgule." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 msgid "List all installed plugins" msgstr "Lister tous les plugins installés" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:536 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 msgid "Enable the named plugin" msgstr "Activer le plugin nommé" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:538 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 msgid "Disable the named plugin" msgstr "Désactive le plugin nommé" @@ -550,9 +719,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:823 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:851 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:244 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:190 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:203 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1644 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:193 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:206 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1695 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:132 msgid "News" msgstr "Informations" @@ -683,19 +852,19 @@ msgstr "Communiquer avec le lecteur Iriver Story." msgid "Communicate with the JetBook eBook reader." msgstr "Communiquer avec le lecteur d'ebook JetBook." -#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:86 +#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:88 msgid "Communicate with the MiBuk Wolder reader." msgstr "Communiquer avec le le lecteur MiBuk Wolder." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:42 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 msgid "Communicate with the Kindle eBook reader." msgstr "Communiquer avec le lecteur d'ebook Kindle." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:169 -msgid "Communicate with the Kindle 2 eBook reader." -msgstr "Communiquer avec le lecteur d'ebook Kindle 2." +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:170 +msgid "Communicate with the Kindle 2/3 eBook reader." +msgstr "Communiquer avec le lecteur d'ebooks Kindle 2/3" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:210 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:211 msgid "Communicate with the Kindle DX eBook reader." msgstr "Communiquer avec le lecteur d'ebook Kindle DX." @@ -706,7 +875,7 @@ msgstr "Communiquer avec le lecteur Kobo" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:53 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:56 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:59 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:161 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:170 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -716,33 +885,33 @@ msgstr "Communiquer avec le lecteur Kobo" msgid "Getting list of books on device..." msgstr "Lit la liste des livres de l'appareil..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:221 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:265 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 msgid "Removing books from device..." msgstr "Supprime les livres de l'appareil..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:269 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:276 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:285 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "Supprime les livres de la liste des métadonnées de l'appareil..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:281 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:315 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:290 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:324 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "Ajoute les livres à liste des métadonnées de l'appareil..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:366 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:251 msgid "Not Implemented" msgstr "Non implémenté" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:367 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:376 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." @@ -765,7 +934,7 @@ msgstr "Communiquer avec le Sweex MM300" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:79 msgid "Communicate with the Kogan" -msgstr "" +msgstr "Communiquer avec le Kogan" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:87 msgid "Communicate with the Pandigital Novel" @@ -898,20 +1067,20 @@ msgstr "" "Placer les fichiers dans des sous-répertoires si l'appareil le permet" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:43 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:86 msgid "Read metadata from files on device" msgstr "Lire les métadonnées à partir des fichiers dans l'appareil" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:45 msgid "Use author sort instead of author" -msgstr "Utiliser la clé de tri d'auteur au lieu de l'auteur" +msgstr "Utiliser la clé de tri par auteur au lieu de l'auteur" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:47 msgid "Template to control how books are saved" msgstr "Modèle pour contrôler comment les livres sont sauvegardés" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:89 msgid "Extra customization" msgstr "Personnalisation complémentaire" @@ -1718,7 +1887,7 @@ msgstr "Création" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20 msgid "Failed to parse: %s with error: %s" -msgstr "" +msgstr "Echec de l'analyse de %s retournant l'erreur %s" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26 msgid "ePub Fixer" @@ -1860,7 +2029,7 @@ msgstr "" msgid "Start" msgstr "Démarrer" -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:147 #: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:77 msgid "Table of Contents:" @@ -1878,7 +2047,17 @@ msgstr "Ne pas insérer une Table des Matières au début du livre." msgid "Add Table of Contents to beginning of the book." msgstr "Ajouter la Table des Matières au début du livre." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:248 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:24 +msgid "" +"Try to turn chapters into individual sections. WARNING: This option is " +"experimental. It can cause conversion to fail. It can also produce " +"unexpected output." +msgstr "" +"Essaye de transformer les chapitres en sections individuelles. ATTENTION: " +"cette option est expérimentale. Elle peut causer l'échec de la conversion. " +"Le résultat peut également être non conforme aux attentes." + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:249 msgid "" "Traverse links in HTML files breadth first. Normally, they are traversed " "depth first." @@ -1886,7 +2065,7 @@ msgstr "" "Parcourir les liens dans les fichier HTML en largeur en premier. " "Normalement, ils sont parcourus en profondeur en premier." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:255 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:256 msgid "" "Maximum levels of recursion when following links in HTML files. Must be non-" "negative. 0 implies that no links in the root HTML file are followed. " @@ -1896,7 +2075,7 @@ msgstr "" "HTML. Ne doit pas être négatif. 0 implique qu'aucun lien à la racine du " "fichier HTML ne sera suivi. Par défaut : %default." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:264 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:265 msgid "" "Normally this input plugin re-arranges all the input files into a standard " "folder hierarchy. Only use this option if you know what you are doing as it " @@ -1908,7 +2087,7 @@ msgstr "" "savez ce que vous faîtes car il peut en résulter des effets variés et " "déplaisants dans le reste de le chaine de conversion." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:272 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:273 msgid "" "Average line length for line breaking if the HTML is from a previous partial " "conversion of a PDF file. Default is %default which disables this." @@ -2156,7 +2335,7 @@ msgstr "La famille de police monospace à inclure" msgid "Comic" msgstr "Bande dessinées" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:397 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 @@ -2165,11 +2344,11 @@ msgstr "Bande dessinées" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:887 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 msgid "Title" msgstr "Titre" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:398 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:364 @@ -2177,30 +2356,30 @@ msgstr "Titre" msgid "Author(s)" msgstr "Auteur(s)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:399 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:403 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "Éditeur" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:400 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:404 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "Producteur" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:405 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:210 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:99 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1079 msgid "Comments" msgstr "Commentaires" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:409 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:413 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 @@ -2210,7 +2389,7 @@ msgstr "Commentaires" msgid "Tags" msgstr "Etiquettes" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:411 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:415 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 @@ -2220,22 +2399,22 @@ msgstr "Etiquettes" msgid "Series" msgstr "Séries" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:412 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:416 msgid "Language" msgstr "Langue" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:414 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 msgid "Timestamp" msgstr "Horodatage" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:416 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:420 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 msgid "Published" msgstr "Publié" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:422 msgid "Rights" msgstr "Droits" @@ -2568,7 +2747,7 @@ msgstr "Page de titre" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "Tables des matières" @@ -2997,7 +3176,7 @@ msgstr "" "Spécifier l'encodage de caractères pour le document de sortie. Par défaut: " "cp1252" -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:194 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:196 msgid "" "This RTF file has a feature calibre does not support. Convert it to HTML " "first and then try it.\n" @@ -3085,77 +3264,77 @@ msgstr "" "espace n'est présent. Autorise aussi la valeur maximale de la longueur de " "ligne à être en dessous du minimum" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 msgid "Send file to storage card instead of main memory by default" msgstr "" "Par défaut, envoyer le fichier dans la carte mémoire à la place de la " "mémoire principale" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Confirm before deleting" msgstr "Confirmer avant la suppression" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 msgid "Main window geometry" msgstr "Géométrie de l'écran principal" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Notify when a new version is available" msgstr "Avertir lorsqu'une nouvelle version est disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Use Roman numerals for series number" msgstr "Utiliser les chiffres romains pour les numéros de séries" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 msgid "Sort tags list by name, popularity, or rating" msgstr "Trier la liste d'étiquettes par nom, popularité ou note (classement)" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Number of covers to show in the cover browsing mode" msgstr "" "Nombre de couvertures à afficher dans le mode de navigation par couverture" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Defaults for conversion to LRF" msgstr "Valeurs par défaut pour la conversion vers LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 msgid "Options for the LRF ebook viewer" msgstr "Options pour l'afficheur d'ebook LFR" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:84 msgid "Formats that are viewed using the internal viewer" msgstr "Formats qui sont affichés par l'afficheur interne" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 msgid "Columns to be displayed in the book list" msgstr "Colonnes affichées dans la liste de livres" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 msgid "Automatically launch content server on application startup" msgstr "" "Démarrer automatiquement le serveur de contenu au démarrage de l'application" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Oldest news kept in database" msgstr "Anciennes informations conservées dans la base" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Show system tray icon" msgstr "Afficher l'icône dans la zone de notification" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 msgid "Upload downloaded news to device" msgstr "Envoyer les News téléchargées vers l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Delete books from library after uploading to device" msgstr "" "Supprimer les livres de la bibliothèque après les avoir téléchargés dans " "l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" @@ -3163,78 +3342,84 @@ msgstr "" "Afficher la navigation par couverture dans une fenêtre séparée au lieu de la " "fenêtre principale de Calibre." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "Disable notifications from the system tray icon" msgstr "Désactiver les alertes dans la zone de notification" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Default action to perform when send to device button is clicked" msgstr "" "Action par défaut à réaliser quand le bouton 'envoyer au lecteur' est cliqué" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:119 msgid "Maximum number of waiting worker processes" msgstr "Nombre maximum de processus de travail en attente" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 msgid "Download social metadata (tags/rating/etc.)" msgstr "Télécharger les métadonnés sociales (étiquettes/classement/etc...)" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 msgid "Overwrite author and title with new metadata" msgstr "Remplacer l'auteur et le titreavec de nouvelles metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" "Limiter le nombre maximum de travaux simultanés au nombre de processeurs." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 msgid "tag browser categories not to display" msgstr "catégories du navigateur d'étiquettes à ne pas afficher" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 msgid "The layout of the user interface" msgstr "La présentation de l'interface utilisateur" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 msgid "Show the average rating per item indication in the tag browser" msgstr "Afficher la note moyenne par article dans le navigateur d'étiquettes" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Disable UI animations" msgstr "Désactiver les animations de IU" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:181 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:479 msgid "Copied" msgstr "Copié" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 msgid "Copy" msgstr "Copier" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 msgid "Copy to Clipboard" msgstr "Copier dans le Presse-papiers" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:433 msgid "Choose Files" msgstr "Choisir les fichiers" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:25 -msgid "A" -msgstr "A" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:25 msgid "Add books" msgstr "Ajouter des livres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:26 +msgid "Add books to the calibre library/device from files on your computer" +msgstr "" +"Ajoutez des livres à la bibliothèque Calibre/à l'appareil à partir de " +"fichiers présents sur votre ordinateur" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:27 +msgid "A" +msgstr "A" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 msgid "Add books from a single directory" msgstr "Ajouter des livres à partir d'un répertoire" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 msgid "" "Add books from directories, including sub-directories (One book per " "directory, assumes every ebook file is the same book in a different format)" @@ -3242,7 +3427,7 @@ msgstr "" "Ajouter des livres par répertoires et sous-répertoires. (Un livre par " "répertoire, chaque fichier représente le même livre dans un format différent)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 msgid "" "Add books from directories, including sub directories (Multiple books per " "directory, assumes every ebook file is a different book)" @@ -3250,114 +3435,114 @@ msgstr "" "Ajouter des livres par répertoires et sous-répertoires. (Plusieurs livres " "par répertoire, chaque fichier est un livre différent)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:42 msgid "Add Empty book. (Book entry with no formats)" msgstr "Ajouter un livre vide. (Une entrée sans aucun format)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:44 msgid "Add from ISBN" msgstr "Ajouter à partir de l'ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:83 msgid "How many empty books?" msgstr "Combien de livres vides?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 msgid "How many empty books should be added?" msgstr "Combien de livres vides doivent être ajoutés?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:140 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:200 msgid "Uploading books to device." msgstr "Téléchargement des livres vers l'appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 msgid "Books" msgstr "Livres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 msgid "EPUB Books" msgstr "Livres EPUB" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 msgid "LRF Books" msgstr "Livres LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 msgid "HTML Books" msgstr "Livres HTML" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 msgid "LIT Books" msgstr "Livres LIT" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 msgid "MOBI Books" msgstr "Livres MOBI" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "Topaz books" msgstr "Livres Topaz" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "Text books" msgstr "Livres Texte" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "PDF Books" msgstr "Livres PDF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "Comics" msgstr "Bande Dessinées" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "Archives" msgstr "Archives" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 msgid "Supported books" msgstr "Livres supportés" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:209 msgid "Merged some books" msgstr "Fusionne des livres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:210 msgid "" "Some duplicates were found and merged into the following existing books:" msgstr "" "Des doublons ont été trouvés et fusionnés dans les livres existants suivants:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 msgid "Failed to read metadata" msgstr "Impossible de lire les métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 msgid "Failed to read metadata from the following" msgstr "Impossible de lire les métadonnées à partir de" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 msgid "Add to library" msgstr "Ajouter à la bibliothèqye" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:55 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "No book selected" msgstr "Aucun livre sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "" "Les livres suivants sont virtuels et ne peuvent être ajoutés à la " "bibliothèque Calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 msgid "No book files found" msgstr "Aucun fichier de livres trouvé" @@ -3365,8 +3550,14 @@ msgstr "Aucun fichier de livres trouvé" msgid "Add books to library" msgstr "Ajouter des livres à la bibliothèque" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add_to_library.py:14 +msgid "Add books to your calibre library from the connected device" +msgstr "" +"Ajouter des livres à votre bibliothèque Calibre à partir de l'appareil " +"connecté" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:498 msgid "Fetch annotations (experimental)" msgstr "Récupérer les annotations (expérimental)" @@ -3383,13 +3574,13 @@ msgstr "" "uniquement" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:204 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:91 msgid "No books selected" msgstr "Aucun livre sélectionné" @@ -3424,24 +3615,24 @@ msgid "Location %d • %s
    " msgstr "Position %d • %s
    " #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:33 msgid "Create catalog of books in your calibre library" msgstr "Créer le catalogue des livres dans votre bibliothèque Calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:32 msgid "No books selected to generate catalog for" msgstr "Aucun livre sélectionné pour générer le catalogue pour" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:49 msgid "Generating %s catalog..." msgstr "Génère le catalogue %s..." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 msgid "No books found" msgstr "Aucun livre trouvé" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:55 msgid "" "No books to catalog\n" "Check exclude tags" @@ -3449,41 +3640,82 @@ msgstr "" "Aucun livre vers le catalogue\n" "Vérifier les étiquettes d'exclusion" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:65 msgid "Catalog generated." msgstr "Catalogue généré." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 msgid "Export Catalog Directory" msgstr "Répertoire d'export du catalogue" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 msgid "Select destination for %s.%s" msgstr "Sélectionner la destination pour %s.%s" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:62 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:111 msgid "%d books" msgstr "%d livres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:82 msgid "Choose calibre library to work with" msgstr "Choisissez la bibliothèque Calibre aves laquelle travailler" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81 -msgid "Switch to library..." -msgstr "Basculer vers la bibliothèque..." +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:91 +msgid "Switch/create library..." +msgstr "Créer/Changer de Bibliothèque ..." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:99 msgid "Quick switch" msgstr "Bascule rapide" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:101 +msgid "Rename library" +msgstr "Renommer la bibliothèque" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:103 +msgid "Delete library" +msgstr "Effacer la bibliothèque" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:168 +msgid "Rename" +msgstr "Renommer" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:169 +msgid "Choose a new name for the library %s. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:170 +msgid "Note that the actual library folder will be renamed." +msgstr "Attention le dossier de la bibliothèque va être renommé" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 +msgid "Already exists" +msgstr "Existe déjà" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:178 +msgid "The folder %s already exists. Delete it first." +msgstr "Le dossier %s existe déjà. Effacez le d'abord." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:102 +msgid "Are you sure?" +msgstr "Etes vous sur ?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:187 +msgid "All files from %s will be permanently deleted. Are you sure?" +msgstr "" +"Tout les fichiers de %s% seront effacés définitivement. Êtes vous sûr " +"?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:207 msgid "No library found" msgstr "Aucune bibliothèque n'a été trouvée" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:208 msgid "" "No existing calibre library was found at %s. It will be removed from the " "list of known libraries." @@ -3491,19 +3723,19 @@ msgstr "" "Aucune bibliothèque Calibre existante n'a été trouvée à %s. Celle-ci va être " "effacée de la liste des bibliothèques connues." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:245 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:542 msgid "Not allowed" msgstr "Interdit" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:241 msgid "You cannot change libraries when a device is connected." msgstr "" "Vous ne pouvez pas changer de bibliothèque quand un appareil est connecté" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:246 msgid "You cannot change libraries while jobs are running." msgstr "" "Vous ne pouvez pas changer de bibliothèque pendant que des travaux sont en " @@ -3517,60 +3749,60 @@ msgstr "C" msgid "Convert books" msgstr "Convertir les livres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:27 msgid "Convert individually" msgstr "Convertir individuellement" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:29 msgid "Bulk convert" msgstr "Convertir par lot" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 msgid "Cannot convert" msgstr "Conversion impossible" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:114 msgid "Starting conversion of %d book(s)" msgstr "Démarrer la conversion de %d livre(s)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:79 msgid "Copy to library" msgstr "Copier vers la bibliothèque" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:80 msgid "Copy selected books to the specified library" msgstr "Copier les livres sélectionnés vers la bibliothèque spécifiée" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:114 msgid "Cannot copy" -msgstr "" +msgstr "Impossible de copier" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:119 msgid "No library" -msgstr "" +msgstr "Pas de bibliothèque" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 msgid "No library found at %s" -msgstr "" +msgstr "Aucune bibliothèque n'a été trouvée à %s" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:127 msgid "Copying" -msgstr "" +msgstr "Copie en cours" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137 msgid "Could not copy books: " -msgstr "" +msgstr "IImposible de copier les livres: " -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:671 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:234 msgid "Failed" msgstr "Echec" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:140 msgid "Copied %d books to %s" -msgstr "" +msgstr "%d livres ont été copiés vers %s" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18 msgid "Del" @@ -3626,14 +3858,14 @@ msgid "Main memory" msgstr "Mémoire principale" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:436 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:435 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 msgid "Storage Card A" msgstr "Carte mémoire A" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:438 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:446 msgid "Storage Card B" msgstr "Carte mémoire B" @@ -3653,10 +3885,11 @@ msgstr "Suppression des livres dans l'appareil" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:160 msgid "" "The selected books will be permanently deleted and the files removed " -"from your computer. Are you sure?" +"from your calibre library. Are you sure?" msgstr "" -"Les livres sélectionnés vont être supprimés définitivement et les " -"fichiers seront supprimés de votre ordinateur. Etes-vous sûr ?" +"Les livres sélectionnés seront supprimés définitivement et les " +"fichiers associés seront retirés de votre bibliothèque calibre. Êtes-vous " +"certain?" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:179 msgid "" @@ -3666,46 +3899,46 @@ msgstr "" "Les livres sélectionnés seront effacés de manière permanente de votre " "appareil. Etes vous sûr de votre choix?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:26 msgid "Connect to folder" msgstr "Connecter au dossier" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:31 msgid "Connect to iTunes" msgstr "Connecter à iTunes" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:48 msgid "Start Content Server" msgstr "Démarrer le serveur de contenu" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:50 msgid "Stop Content Server" msgstr "Arrêter le serveur de contenu" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:69 msgid "Email to" msgstr "Email vers" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:69 msgid " and delete from library" msgstr " et efface de la bibliothèque" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:81 msgid "Setup email based sharing of books" msgstr "Configurer le partage des livres par email" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:98 msgid "D" msgstr "D" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:98 msgid "Send to device" msgstr "Envoyer au lecteur" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:117 msgid "Connect/share" msgstr "Connecter/Partager" @@ -3713,6 +3946,10 @@ msgstr "Connecter/Partager" msgid "Manage collections" msgstr "Gérer les collections" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_collections.py:14 +msgid "Manage the collections on this device" +msgstr "Gérer les collections sur cet appareil" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 msgid "E" msgstr "E" @@ -3761,61 +3998,61 @@ msgstr "Fusionner dans le premier livre sélectionné - supprimer les autres" msgid "Merge into first selected book - keep others" msgstr "Fusionner dans le premier livre sélectionné - conserver les autres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74 msgid "Cannot download metadata" msgstr "Impossible de télécharger les métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:97 msgid "social metadata" msgstr "Métadonnées sociales" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:99 msgid "covers" msgstr "couvertures" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:99 msgid "metadata" msgstr "métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:104 msgid "Downloading %s for %d book(s)" msgstr "Télécharge les livres %s sur %d" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:125 msgid "Failed to download some metadata" msgstr "Le téléchargement d'une partie des métadonnées a échoué" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:126 msgid "Failed to download metadata for the following:" msgstr "Le téléchargement des métadonnées a échoué pour :" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:129 msgid "Failed to download metadata:" msgstr "Le téléchargement des métadonnées a échoué:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:608 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:566 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:112 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "Erreur" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 msgid "Cannot edit metadata" msgstr "Impossible d'éditer les métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:202 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:206 msgid "Cannot merge books" msgstr "Impossible de fusionner les livres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:207 msgid "At least two books must be selected for merging" msgstr "Au moins deux livres doivent être séléctionnés avant de fusionner" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:211 msgid "" "All book formats and metadata from the selected books will be added to the " "first selected book.

    The second and subsequently selected " @@ -3827,7 +4064,7 @@ msgstr "" "suivants sélectionnés ne seront ni supprimés ni changés.

    Veuille " "confirmer que vous voulez lancer le traitement." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:222 msgid "" "All book formats and metadata from the selected books will be merged into " "the first selected book.

    After merger the second and " @@ -3844,7 +4081,7 @@ msgstr "" "définitivement supprimés de votre ordinateur.

    Êtes vous " "sûr de vouloir lancer le traitement ?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:234 msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" @@ -3892,27 +4129,20 @@ msgstr "O" msgid "Ctrl+P" msgstr "Ctrl+P" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 -msgid "Preferences" -msgstr "Préférences" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 msgid "Run welcome wizard" msgstr "Démarrer l'assistant de bienvenue" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:32 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38 msgid "Cannot configure" msgstr "Configuration impossible" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:34 msgid "Cannot configure while there are running jobs." msgstr "Impossible de configurer pendant que des travaux sont en cours." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:39 msgid "Cannot configure before calibre is restarted." msgstr "Configuration impossible avant que Calibre n'ait été redémarré." @@ -3966,6 +4196,10 @@ msgid "" "corruption of your library. Save to disk is meant to export files from your " "calibre library elsewhere." msgstr "" +"Vous êtes en train d'essayer de sauvegarder des fichiers dans la " +"bibliothèque Calibre. Ceci peut causer la corruption de votre bibliothèque. " +"Sauvegarder sur le disque est prévu pour exporter des fichiers de la " +"bibliothèque Calibre ailleurs." #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:135 msgid "Error while saving" @@ -3992,11 +4226,11 @@ msgstr "Afficher les détails du livre" msgid "I" msgstr "I" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 msgid "No detailed info available" msgstr "Pas d'information détaillée disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 msgid "No detailed information is available for books on the device." msgstr "" "Pas d'information détaillée disponible pour les livres dans l'appareil." @@ -4013,27 +4247,27 @@ msgstr "Alt+A" msgid "Books by same author" msgstr "Livres du même auteur" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 -msgid "Alt+S" -msgstr "Alt+S" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 msgid "Books in this series" msgstr "Livres dans cette série" #: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 +msgid "Alt+Shift+S" +msgstr "Alt+Maj+S" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 msgid "Alt+P" msgstr "Alt+P" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 msgid "Books by this publisher" msgstr "Livres de cet éditeur" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Alt+T" msgstr "Alt+T" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Books with the same tags" msgstr "Livres avec les mêmes étiquettes" @@ -4088,36 +4322,36 @@ msgstr "%s n'a pas de format disponible." msgid "Searching in" msgstr "Recherche dans" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:197 msgid "Adding..." msgstr "Ajout..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:210 msgid "Searching in all sub-directories..." msgstr "Cherche dans tous les sous-répertoires..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:223 msgid "Path error" msgstr "Chemin de l'erreur" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:224 msgid "The specified directory could not be processed." msgstr "Le chemin spécifié ne peut pas être traité." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:804 msgid "No books" msgstr "Aucun livre" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:293 msgid "Added" msgstr "Ajouté" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:306 msgid "Adding failed" msgstr "L'ajout a échoué" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:307 msgid "" "The add books process seems to have hung. Try restarting calibre and adding " "the books in smaller increments, until you find the problem book." @@ -4126,11 +4360,11 @@ msgstr "" "redémarrer Calibre et ajoutez les livres avec un incrément plus petit, " "jusqu'à ce que vous trouviez le livre problèmatique." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:322 msgid "Duplicates found!" msgstr "Des doublons ont été détectés !" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:323 msgid "" "Books with the same title as the following already exist in the database. " "Add them anyway?" @@ -4138,15 +4372,15 @@ msgstr "" "Des livres avec des titres identiques à ceux qui suivent existent déjà la " "base. Voulez-vous quand-même les ajouter ?" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:326 msgid "Adding duplicates..." msgstr "Ajoute les doublons..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:393 msgid "Saving..." msgstr "Sauvegarde..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:446 msgid "Saved" msgstr "Sauvegardé" @@ -4163,7 +4397,7 @@ msgid "Looking for duplicates based on file hash" msgstr "Recherche de doublons basée sur le condensat (hash) de fichier" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:70 msgid "Choose root folder" msgstr "Choisir le dossier racine" @@ -4180,7 +4414,7 @@ msgid "Add books to calibre" msgstr "Ajouter des livres à Calibre" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:49 @@ -4196,15 +4430,15 @@ msgstr "Parcours le dossier racine à la recherche de livres" msgid "This may take a few minutes" msgstr "Ceci peut prendre quelques minutes" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 msgid "Choose the location to add books from" msgstr "Choisissez l'emplacement à partir duquel ajouter des livres" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64 msgid "Select a folder on your hard disk" msgstr "Sélectionner un dossier de votre disque dur" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:65 msgid "" "

    calibre can scan your computer for existing books automatically. These " "books will then be copied into the calibre library. This wizard will " @@ -4224,11 +4458,11 @@ msgstr "" "

    Assurez vous que le dossier vous avez choisi comme bibliothèque Calibre " "n'est pas inclus dans le dossier racine que vous choisissez.

    " -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 msgid "&Root folder:" msgstr "Dossier &Racine" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:69 msgid "" "This folder and its sub-folders will be scanned for books to import into " "calibre's library" @@ -4236,61 +4470,65 @@ msgstr "" "Ce dossier et ces sous-dossiers vont être parcourus à la recherche de livres " "à importer dans la bibliothèque de Calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:79 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:634 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:103 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:87 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:90 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:156 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:159 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:166 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:269 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:270 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:191 msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:72 msgid "Handle multiple files per book" msgstr "Supporte des fichiers multiples pour un livre" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:73 msgid "" "&One book per folder, assumes every ebook file in a folder is the same book " "in a different format" @@ -4298,7 +4536,7 @@ msgstr "" "&Un livre par dossier, suppose que chaque livre électronique dans un dossier " "est le même livre dans un format différent" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:74 msgid "" "&Multiple books per folder, assumes every ebook file is a different book" msgstr "" @@ -4325,8 +4563,8 @@ msgstr "Chemin" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:100 msgid "Formats" msgstr "Formats" @@ -4349,9 +4587,9 @@ msgstr "Cliquer pour ouvrir" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1074 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:293 msgid "None" msgstr "Aucun" @@ -4401,13 +4639,13 @@ msgstr "sortie" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:88 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:31 @@ -4419,13 +4657,26 @@ msgstr "sortie" #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:55 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 msgid "Form" msgstr "Formulaire" @@ -4515,8 +4766,8 @@ msgstr "Options de l'e-book" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:550 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1607 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1625 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1658 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1676 msgid "Catalog" msgstr "Catalogue" @@ -4545,6 +4796,11 @@ msgid "" "- A regex pattern of a single dot excludes all genre tags, generating no " "Genre Section" msgstr "" +"Aide regex:\n" +"- La regex par défaut - \\[.+\\] - exclue les étiquette de genre de la forme " +"[étiquette], c.a.d. , [Amazon Freebie]\n" +"- Une regex constituée d'un point exclue toutes les étiquettes de genre, " +"produisant une section sans genre" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:76 msgid "Include 'Titles' Section" @@ -4595,52 +4851,52 @@ msgid "input" msgstr "entrée" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:99 msgid "&Number of Colors:" msgstr "&Nombre de couleurs:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:90 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:101 msgid "Disable &normalize" msgstr "Désactiver &normaliser" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:102 msgid "Keep &aspect ratio" msgstr "Conserver les &proportions" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:103 msgid "Disable &Sharpening" msgstr "Désactiver l'&Accentuation" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:109 msgid "Disable &Trimming" msgstr "Désactiver le &Decoupage" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:108 msgid "&Wide" msgstr "&Large" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:104 msgid "&Landscape" msgstr "&Paysage" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:106 msgid "&Right to left" msgstr "De d&roite à gauche" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:105 msgid "Don't so&rt" msgstr "Pas de t&ri" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:107 msgid "De&speckle" msgstr "&Flou" @@ -4649,7 +4905,7 @@ msgid "&Disable comic processing" msgstr "&Désactiver le traitement des bandes dessinées" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:120 msgid "&Output format:" msgstr "Format de s&ortie:" @@ -4666,7 +4922,7 @@ msgid "Debug the conversion process." msgstr "Déboguer le processus de conversion." #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:56 msgid "Choose debug folder" msgstr "Choisir le dossier de débogage" @@ -4678,7 +4934,7 @@ msgstr "Répertoire de débogage incorrect" msgid "Failed to create debug directory" msgstr "La création du répertoire de débogage a échouée" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:55 msgid "" "Choose a folder to put the debug output into. If you specify a folder, " "calibre will place a lot of debug output into it. This will be useful in " @@ -4691,7 +4947,7 @@ msgstr "" "valeurs correctes pour les paramètres de conversion comme les Tables des " "Matières ou la Détection des Chapitres." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:59 msgid "" "The debug process outputs the intermediate HTML generated at various stages " "of the conversion process. This HTML can sometimes serve as a good starting " @@ -4741,18 +4997,22 @@ msgstr "Ne pas insérer une &Table des Matières au début du livre." msgid "FB2 Output" msgstr "Sortie FB2" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:47 msgid "&Inline TOC" msgstr "TDM &intégrée" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:33 +msgid "Sectionize Chapters (Use with care!)" +msgstr "Découper les Chapitres (utiliser avec précaution!)" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:104 msgid "Font rescaling wizard" msgstr "Assistant de redimensionnent de la police" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:105 msgid "" "

    This wizard will help you choose an appropriate font size key for your " "needs. Just enter the base font size of the input document and then enter an " @@ -4781,25 +5041,25 @@ msgstr "" "utilisateur pour plus de précision sur le fonctionnement du " "redimensionnement.

    " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:108 msgid "&Output document" msgstr "D&ocument en sortie" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114 msgid "&Base font size:" msgstr "Taille de &base de la police:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 msgid "Font size &key:" msgstr "Taille de la police &clé:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:117 #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:125 @@ -4810,23 +5070,23 @@ msgstr "Taille de la police &clé:" msgid " pt" msgstr " pt" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:112 msgid "Use &default values" msgstr "Utiliser les valeurs par &défaut" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113 msgid "&Input document" msgstr "Document en &entrée" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:116 msgid "&Font size: " msgstr "Taille de la &police: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:118 msgid " will map to size: " msgstr " correspondra à la taille : " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:119 msgid "0.0 pt" msgstr "0,0 pt" @@ -4850,35 +5110,35 @@ msgstr "Aligner à gauche" msgid "Justify text" msgstr "Justifier le texte" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125 msgid "&Disable font size rescaling" msgstr "&Désactiver le redimensionnement de la taille de la police" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 msgid "Base &font size:" msgstr "Taille de &police par défaut :" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 msgid "Wizard to help you choose an appropriate font size key" msgstr "Assistant pour vous aider à choisir une taille de police" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 msgid "Line &height:" msgstr "&Hauteur de la ligne:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 msgid "Input character &encoding:" msgstr "&Encodage des caractères en entrée:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 msgid "Remove &spacing between paragraphs" msgstr "&Supprimer l'interligne entre les paragraphes" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 msgid "Indent size:" msgstr "Taille de l'indentation:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 msgid "" "

    When calibre removes inter paragraph spacing, it automatically sets a " "paragraph indent, to ensure that paragraphs can be easily distinguished. " @@ -4888,31 +5148,31 @@ msgstr "" "automatiquement une indentation de paragraphe, pour améliorer la distinction " "des paragraphes. Cette option contrôle la largeur de chaque indentation." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 msgid " em" msgstr " em" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 msgid "Text justification:" msgstr "Justification de texte" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:139 msgid "&Linearize tables" msgstr "&Linéariser les tables" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:140 msgid "Extra &CSS" msgstr "&CSS complémentaire" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:141 msgid "&Transliterate unicode characters to ASCII" msgstr "&Translittérer les caractères unicode en représentation ASCII" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:142 msgid "Insert &blank line" msgstr "Insérer une ligne &blanche" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:143 msgid "Keep &ligatures" msgstr "Conserver les &ligatures" @@ -4970,7 +5230,7 @@ msgstr "Famille de police &Monospace:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "Métadonnées" @@ -5013,46 +5273,45 @@ msgstr "

    Il y a eu une erreur à la lecture du fichier :
    " msgid " is not a valid picture" msgstr " n'est pas une image compatible" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 msgid "Book Cover" msgstr "Couverture du livre" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 msgid "Use cover from &source file" msgstr "Utiliser la couverture du fichier &source" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Change &cover image:" msgstr "Modifier l'image de la &couverture:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 msgid "Browse for an image to use as the cover of this book." msgstr "Rechercher une image à utiliser en tant que couverture du livre." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 msgid "&Title: " msgstr "&Titre : " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 msgid "Change the title of this book" msgstr "Modifie le titre du livre" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "&Author(s): " msgstr "&Auteur(s): " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 msgid "Author So&rt:" msgstr "T&ri de l'auteur:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -5060,20 +5319,20 @@ msgstr "" "Modifie le(s) auteur(s) de ce livre. Dans le cas d'auteurs multiples, " "séparer leurs noms par une virgule." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 msgid "&Publisher: " msgstr "&Editeur: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 msgid "Ta&gs: " msgstr "Eti&quettes: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

    They can be any words or phrases, separated by commas." @@ -5082,23 +5341,23 @@ msgstr "" "recherches.

    Celles-ci peuvent être formées de n'importe quels mots " "ou phrases, séparés par des virgules." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "&Series:" msgstr "&Séries:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:175 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid "List of known series. You can add new series." msgstr "Liste de séries connues. Vous pouvez ajouter de nouvelles séries." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 msgid "Book " msgstr "Livre " @@ -5106,7 +5365,7 @@ msgstr "Livre " msgid "MOBI Output" msgstr "Sortie MOBI" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:43 msgid "Default" msgstr "Par défaut" @@ -5271,18 +5530,18 @@ msgstr "Convertir" msgid "Options specific to the input format." msgstr "Options spécifiques au format d'entrée." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:53 msgid "Dialog" msgstr "Boîte de dialogue" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:118 msgid "&Input format:" msgstr "Format d'&entrée:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:119 msgid "Use &saved conversion settings for individual books" msgstr "" "Utiliser et &conserver ces paramètres pour la conversion individuelle des e-" @@ -5320,12 +5579,12 @@ msgid "Footer regular expression:" msgstr "Expression régulière pour le pied de page:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:87 msgid "Invalid regular expression" msgstr "Expression régulière incorrecte" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:88 msgid "Invalid regular expression: %s" msgstr "Expression régulière incorrecte: %s" @@ -5453,18 +5712,18 @@ msgstr "Longueur &maximale de la ligne:" msgid "Force maximum line length" msgstr "Forcer la longueur de ligne maximale" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:51 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:55 msgid "TextLabel" msgstr "Libellé texte" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:57 msgid "Use a wizard to help construct the XPath expression" msgstr "Utiliser un assistant pour aider à construire l'expression XPath" @@ -5573,14 +5832,14 @@ msgid "Undefined" msgstr "Indéfini(e)" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:241 +#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:119 msgid "Yes" msgstr "Oui" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:243 +#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:121 msgid "No" msgstr "Non" @@ -5601,7 +5860,7 @@ msgid " index:" msgstr " index:" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:193 msgid "Automatically number books in this series" msgstr "Numérote automatiquement les livres dans ces séries" @@ -5617,97 +5876,97 @@ msgstr "étiquettes à ajouter" msgid "tags to remove" msgstr "étiquettes à supprimer" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:48 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:136 msgid "No details available." msgstr "Pas de détail disponible." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:165 msgid "Device no longer connected." msgstr "L'appareil n'est plus connecté." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:283 msgid "Get device information" msgstr "Lit les informations de l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:294 msgid "Get list of books on device" msgstr "Lire la liste de livres à partir de l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:304 msgid "Get annotations from device" msgstr "Obtenir les annotations à partir de l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:313 msgid "Send metadata to device" msgstr "Envoie les métadonnées vers l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:318 msgid "Send collections to device" msgstr "Envoyer les collections vers l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:342 msgid "Upload %d books to device" msgstr "Envoie le livre %d dans l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:357 msgid "Delete books from device" msgstr "Supprimer les livres dans l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Download books from device" msgstr "Télécharger les livres à partir de l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:384 msgid "View book on device" msgstr "Afficher le livre sur l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 msgid "Set default send to device action" msgstr "Indiquer l'action par défaut pour 'envoyer au lecteur'" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:425 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 msgid "Send to main memory" msgstr "Envoyer vers la mémoire du lecteur" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:426 msgid "Send to storage card A" msgstr "Envoyer vers la carte mémoire A" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:428 msgid "Send to storage card B" msgstr "Envoyer vers la carte mémoire B" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:442 msgid "Main Memory" msgstr "Mémoire principale" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:454 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:453 msgid "Send and delete from library" msgstr "Envoyer et effacer de la bibliothèque" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:454 msgid "Send specific format" msgstr "Envoyer un format spécifique" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:490 msgid "Eject device" msgstr "Ejecter l'appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:608 msgid "Error communicating with device" msgstr "Erreur pendant la communication avec le lecteur électronique" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:629 msgid "Select folder to open as device" msgstr "Sélectionner le dossier à ouvrir comme appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:677 msgid "Error talking to device" msgstr "Erreur pendant la communication avec le lecteur électronique" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -5716,128 +5975,128 @@ msgstr "" "lecteur électronique. Veuillez déconnecter et reconnecter le lecteur " "électronique et redémarrer." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:717 msgid "Device: " msgstr "Appareil: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719 msgid " detected." msgstr " detecté." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:805 msgid "selected to send" msgstr "sélectionné pour l'envoi" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:817 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:810 msgid "Choose format to send to device" msgstr "Choisir le format à envoyer au lecteur" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:819 msgid "No device" msgstr "Aucun appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:820 msgid "Cannot send: No device is connected" msgstr "Impossible d'envoyer: Aucun appareil connecté" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:834 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 msgid "No card" msgstr "Aucune carte" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:835 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:824 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:828 msgid "Cannot send: Device has no storage card" msgstr "Impossible d'envoyer: L'appareil n'a pas de carte mémoire" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "E-book:" msgstr "E-book:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 msgid "Attached, you will find the e-book" msgstr "En pièce jointe, vous trouverez l'ebook" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "par" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 msgid "in the %s format." msgstr "dans le format %s." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:887 msgid "Sending email to" msgstr "Envoi d'un email à" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:932 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:917 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1080 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1199 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215 msgid "No suitable formats" msgstr "Pas de format convenable" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 msgid "Auto convert the following books before sending via email?" msgstr "" "Convertir automatiquement les livres suivants avant de les envoyer par email " "?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:933 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:926 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" "Impossible d'envoyer par email les livres suivants car aucun format " "convenable n'a été trouvé :" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:944 msgid "Failed to email books" msgstr "L'envoi par email des livres a échoué" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:945 msgid "Failed to email the following books:" msgstr "L'envoi par email des livres suivants a échoué:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:956 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949 msgid "Sent by email:" msgstr "Envoyer par email:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:977 msgid "News:" msgstr "News:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:978 msgid "Attached is the" msgstr "Le fichier attaché est" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:989 msgid "Sent news to" msgstr "Envoi des News vers" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1027 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1019 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1200 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Convertir automatiquement les livres suivants avant de les télécharger dans " "l'appareil ?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1057 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Sending catalogs to device." msgstr "Envoie les catalogues vers l'appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1113 msgid "Sending news to device." msgstr "Envoi les News vers l'appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1166 msgid "Sending books to device." msgstr "Envoie les livres dans l'appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1216 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1208 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." @@ -5846,59 +6105,63 @@ msgstr "" "convenable n'a été trouvé. Convertissez avant le(s) livre(s) vers un format " "supporté par votre appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1278 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1270 msgid "No space on device" msgstr "Le lecteur électronique n'a plus d'espace mémoire disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1279 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1271 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" "

    Impossible d'envoyer les livres sur le lecteur : il n'y a plus assez " "d'espace mémoire disponible " -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 msgid "Select available formats and their order for this device" msgstr "" "Sélectionner les formats disponibles et leurs ordres pour cet appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:87 msgid "Use sub directories" msgstr "Utiliser les sous-répertoires" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:88 msgid "Use author sort for author" -msgstr "Utiliser la clé de tri d'auteur comme auteur" +msgstr "Utiliser la clé de tri par auteur comme auteur" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:90 msgid "Save &template:" msgstr "Sauvegarder le &modèle:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:48 msgid "Add books by ISBN" msgstr "Ajouter les les livres à partir de leur ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:49 msgid "" "

    Enter a list of ISBNs in the box to the left, one per line. calibre will " "automatically create entries for books based on the ISBN and download " "metadata and covers for them.

    Any invalid ISBNs in the list will be " "ignored." msgstr "" +"

    Entrer une liste de numéros ISBN dans la boite de gauche, un par ligne. " +"Calibre va automatiquement créer des entrées pour des livres à partir des " +"numeros ISBN et télécharger les métadonnées et les couvertures " +"correspondates.

    Tout numéro ISBN incorrect de la liste sera ignoré." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:50 msgid "&Paste from clipboard" msgstr "Co&ller à partir du bloc-notes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 msgid "Fit &cover within view" msgstr "Adapte la &couverture à l'emplacement" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 msgid "&Previous" msgstr "&Précédent" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 msgid "&Next" msgstr "Suiva&nt" @@ -5933,7 +6196,7 @@ msgstr "&Envoyer le catalogue automatiquement vers l'appareil" msgid "Catalog options" msgstr "Options du catalogue" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:45 msgid "Choose Format" msgstr "Choisir le format" @@ -5981,27 +6244,27 @@ msgstr "Mauvais emplacement" msgid "%s is not an existing folder" msgstr "%s n'est pas un dossier existant" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 msgid "Choose your calibre library" msgstr "Choisissez votre bibliothèque Calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 msgid "Your calibre library is currently located at {0}" msgstr "Votre bibliothèque Calibre est actuellement situé à {0}" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:73 msgid "New &Location:" msgstr "Nouvel emp&lacement:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:74 msgid "Use &existing library at the new location" msgstr "Utiliser la bibliothèque &existante au nouvel emplacement" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:75 msgid "&Create an empty library at the new location" msgstr "&Créer une bibliothèque vide au nouvel emplacement" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:76 msgid "&Move current library to new location" msgstr "&Déplacer la bibliothèque actuelle vers ce nouvel emplacement" @@ -6014,15 +6277,15 @@ msgstr "" msgid "Set options for converting %s" msgstr "Indiquer les options pour la conversion de %s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 msgid "&Title:" msgstr "&Titre:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:98 msgid "&Author(s):" msgstr "&Auteur(s):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:100 msgid "&Profile:" msgstr "&Profil :" @@ -6030,1146 +6293,11 @@ msgstr "&Profil :" msgid "Edit Comments" msgstr "Editer les commentaires" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:172 -msgid "%(plugin_type)s %(plugins)s" -msgstr "%(plugins)s %(plugin_type)s" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:173 -msgid "plugins" -msgstr "plugins" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:182 -msgid "" -"\n" -"Customization: " -msgstr "" -"\n" -"Personnalisation: " - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:197 -msgid "General" -msgstr "Général" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:198 -msgid "Interface" -msgstr "Interface" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199 -msgid "Conversion" -msgstr "Conversion" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 -msgid "" -"Email\n" -"Delivery" -msgstr "" -"Envoi\n" -"d'Email" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201 -msgid "Add/Save" -msgstr "Ajouter/Sauvegarder" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:202 -msgid "Advanced" -msgstr "Mode avancé" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:203 -msgid "" -"Content\n" -"Server" -msgstr "" -"Serveur de\n" -"contenu" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:204 -msgid "Plugins" -msgstr "Plugins" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 -msgid "Auto send" -msgstr "Envoyer automatiquement" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:228 -msgid "Email" -msgstr "Email" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:233 -msgid "Formats to email. The first matching format will be sent." -msgstr "" -"Formats à envoyer par email. Le premier format qui correspond sera envoyé." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:234 -msgid "" -"If checked, downloaded news will be automatically mailed
    to this email " -"address (provided it is in one of the listed formats)." -msgstr "" -"Si coché, les News téléchargées seront automatiquement envoyées par email " -"
    à cette adresse (à condition qu'il appartienne à un des formats listés)" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:308 -msgid "new email address" -msgstr "Nouvelle adresse email" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 -msgid "Wide" -msgstr "Large" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 -msgid "Narrow" -msgstr "Etroit" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 -msgid "Medium" -msgstr "Moyen" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 -msgid "Small" -msgstr "Petit" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509 -msgid "Large" -msgstr "Large" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 -msgid "Always" -msgstr "Toujours" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 -msgid "Automatic" -msgstr "Automatique" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 -msgid "Never" -msgstr "Jamais" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:540 -msgid "Done" -msgstr "Terminé" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:541 -msgid "Confirmation dialogs have all been reset" -msgstr "Tous les dialogues de confirmation ont été réinitialisés" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:546 -msgid "System port selected" -msgstr "Port système sélectionné" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:547 -msgid "" -"The value %d you have chosen for the content server port is a system " -"port. Your operating system may not allow the server to run on this " -"port. To be safe choose a port number larger than 1024." -msgstr "" -"La valeur %d que vous avez choisi comme port pour le serveur de " -"contenu est un port système. Votre système d'exploitation peut " -"empêcher le serveur de fonctionner sur ce port. Par sécurité choisissez " -"plutôt un numéro de port supérieur à 1024." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:567 -msgid "Failed to install command line tools." -msgstr "L'installation des outils en ligne de commande a échouée." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:570 -msgid "Command line tools installed" -msgstr "Outils en ligne de commande installés." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:571 -msgid "Command line tools installed in" -msgstr "Outils en ligne de commande installés dans" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:572 -msgid "" -"If you move calibre.app, you have to re-install the command line tools." -msgstr "" -"Si vous déplacez calibre.app, vous devez réinstaller les outils en ligne de " -"commande." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:623 -msgid "No valid plugin path" -msgstr "N'est pas un chemin correct pour les plugins" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:624 -msgid "%s is not a valid plugin path" -msgstr "%s n'est pas un répertoire correct pour les plugins" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:627 -msgid "Choose plugin" -msgstr "Choisir le plugin" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:639 -msgid "Plugin cannot be disabled" -msgstr "Le plugin ne peut pas être désactivé" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:640 -msgid "The plugin: %s cannot be disabled" -msgstr "Le plugin %s ne peut pas être désactivé" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:649 -msgid "Plugin not customizable" -msgstr "Le plugin ne peut pas être personnalisé" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:650 -msgid "Plugin: %s does not need customization" -msgstr "Le plugin %s ne peut pas être personnalisé" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:658 -msgid "Customize" -msgstr "Personnaliser" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:696 -msgid "Cannot remove builtin plugin" -msgstr "Impossible de supprimer les plugins natifs" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:697 -msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." -msgstr "" -" ne peut pas être retiré. C'est un plugin natif. Essayer plutôt de le " -"désactiver" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:712 -msgid "Invalid tweaks" -msgstr "Réglages invalides" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:713 -msgid "" -"The tweaks you entered are invalid, try resetting the tweaks to default and " -"changing them one by one until you find the invalid setting." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:743 -msgid "You must select a column to delete it" -msgstr "Vous devez sélectionner une colonne pour pouvoir la supprimer" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:748 -msgid "The selected column is not a custom column" -msgstr "La colonne sélectionnée n'est pas une colonne personnalisée" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:749 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:48 -msgid "Are you sure?" -msgstr "Etes vous sur ?" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:750 -msgid "Do you really want to delete column %s and all its data?" -msgstr "" -"Voulez vous vraiment supprimer la colonne %s et toutes les données qu'elle " -"contient?" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:817 -msgid "Error log:" -msgstr "Journal d'erreur:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:824 -msgid "Access log:" -msgstr "Journal des accès:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:852 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:315 -msgid "Failed to start content server" -msgstr "A échoué lors du démarrage du serveur de contenu" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:877 -msgid "Invalid size" -msgstr "Taille incorrecte" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:878 -msgid "The size %s is invalid. must be of the form widthxheight" -msgstr "La taille %s est incorrecte. Doit être au format largeurxhauteur" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:944 -msgid "Must restart" -msgstr "Redémarrage nécessaire" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:945 -msgid "" -"The changes you made require that Calibre be restarted. Please restart as " -"soon as practical." -msgstr "" -"Les modifications effectuées nécessitent un redémarrage de Calibre. Veuillez " -"redémarrer dès que possible." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:979 -msgid "Checking database integrity" -msgstr "Vérifier l'intégrité de la base de données" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:999 -msgid "Failed to check database integrity" -msgstr "La vérification de l'intégrité de la base de données a échouée" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1004 -msgid "Some inconsistencies found" -msgstr "Des incohérences ont été trouvées" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1005 -msgid "" -"The following books had formats listed in the database that are not actually " -"available. The entries for the formats have been removed. You should check " -"them manually. This can happen if you manipulate the files in the library " -"folder directly." -msgstr "" -"Les livres suivants ont des formats listés dans la base qui ne sont pas " -"disponible actuellement. Les entrées pour les formats ont été supprimés. " -"Vous devrez les vérifier manuellement. Ceci peut arriver si vous avez " -"manipulé les fichiers directement dans le dossier de la bibliothèque." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:133 -msgid "TabWidget" -msgstr "Widget avec onglet" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:134 -msgid "" -"Here you can control how calibre will read metadata from the files you add " -"to it. calibre can either read metadata from the contents of the file, or " -"from the filename." -msgstr "" -"Ici, vous pouvez contrôler la manière dont Calibre lira les métadonnées des " -"fichiers que vous ajoutez. Calibre peut lire les métadonnées à partir du " -"contenu du fichier, ou du nom de fichier." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:135 -msgid "Read metadata only from &file name" -msgstr "Lire les métadonnées uniquement à partir du nom de &fichier" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:136 -msgid "" -"Swap the firstname and lastname of the author. This affects only metadata " -"read from file names." -msgstr "" -"Echanger le prénom et le nom de l'auteur. Ceci affecte seulement les " -"métadonnées lues à partir des noms de fichiers." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:137 -msgid "&Swap author firstname and lastname" -msgstr "&Echanger le prénom et le nom de l'auteur" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:138 -msgid "" -"If an existing book with a similar title and author is found that does not " -"have the format being added, the format is added\n" -"to the existing book, instead of creating a new entry. If the existing book " -"already has the format, then it is silently ignored.\n" -"\n" -"Title match ignores leading indefinite articles (\"the\", \"a\", \"an\"), " -"punctuation, case, etc. Author match is exact." -msgstr "" -"Si un livre existant avec un titre and un auteur identique ne possédant pas " -"le format à ajouter est trouvé, le format est ajouté\n" -"au livre existant au lieu de créer une nouvelle entrée. Si le livre existant " -"posséde déjà ce format, il est ignoré sans notification.\n" -"\n" -"La recherche de correspondance ignore dans le cas du titre les articles " -"indéfinis en début de chaîne (\"the\", \"a\", \"an\"),\n" -"la ponctuation, la casse, etc. La recherche de correspondance est exacte " -"pour l'auteur." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:142 -msgid "" -"If books with similar titles and authors found, &merge the new files " -"automatically" -msgstr "" -"Si des livres avec des titres et des auteurs similaires sont trouvés, " -"&fusionner les nouveaux fichiers automatiquement" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:143 -msgid "&Configure metadata from file name" -msgstr "&Configurer les métadonnées à partir du nom de fichier" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:144 -msgid "&Adding books" -msgstr "&Ajout de livres" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:145 -msgid "" -"Here you can control how calibre will save your books when you click the " -"Save to Disk button:" -msgstr "" -"Ici vous pouvez contrôler comment Calibre va sauvegarder vos livres quand " -"vous cliquez sur le bouton Sauvegarder sur le disque:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:146 -msgid "Save &cover separately" -msgstr "Sauvegarder les &couvertures séparément" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:147 -msgid "Update &metadata in saved copies" -msgstr "Mettre à jour les &métadonnées dans les copies sauvegardées" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:148 -msgid "Save metadata in &OPF file" -msgstr "Sauvegarder les métadonnées dans le fichier &OPF" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:149 -msgid "Convert non-English characters to &English equivalents" -msgstr "Convertir les caractères non-Anglais vers des équivalents &Anglais" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:150 -msgid "Format &dates as:" -msgstr "Format de &dates comme:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:151 -msgid "File &formats to save:" -msgstr "&Formats de fichier à sauvegarder:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:152 -msgid "Replace space with &underscores" -msgstr "Remplacer les espaces par des &underscores" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:153 -msgid "Change paths to &lowercase" -msgstr "Changer les chemins en minuscu&les" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:154 -msgid "&Saving books" -msgstr "&Sauvegarde de livres" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:155 -msgid "Metadata &management:" -msgstr "Métadonnée &management" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:156 -msgid "Manual management" -msgstr "Gestion manuelle" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:157 -msgid "Only on send" -msgstr "Seulement en envoyant" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:158 -msgid "Automatic management" -msgstr "Gestion automatique" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:159 -msgid "" -"

  • Manual Management: Calibre updates the metadata and adds " -"collections only when a book is sent. With this option, calibre will never " -"remove a collection.
  • \n" -"
  • Only on send: Calibre updates metadata and adds/removes " -"collections for a book only when it is sent to the device.
  • \n" -"
  • Automatic management: Calibre automatically keeps metadata on the " -"device in sync with the calibre library, on every connect
  • " -msgstr "" -"
  • Gestion manuelle: Calibre met à jour les métadonnée et ajoute des " -"collections uniquement quand un livre est envoyé. Avec cette option, " -"calibre ne supprimera jamais une collection.
  • \n" -"
  • Seulement en envoyant: Calibre met à jour la métadonnée et " -"ajoute/supprime des collections pour un livre uniquement si elle est envoyée " -"à un appareil.
  • \n" -"
  • Gestion automatique: Calibre synchronise automatiquement les " -"métadonnées sur l’appareil avec celle de la bibliothèque de calibre chaque " -"fois que l'appareil est connecté." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:162 -msgid "" -"Here you can control how calibre will save your books when you click the " -"Send to Device button. This setting can be overriden for individual devices " -"by customizing the device interface plugins in Preferences->Plugins" -msgstr "" -"Ici vous pouvez contrôler la façon dont Calibre sauvegardera vos ebooks " -"quand vous cliquez sur le bouton \"Envoyer au lecteur\". Ces paramètres " -"peuvent être outrepassés par votre lecteur en personnalisant l'interface de " -"gestion des pluggins des lecteurs dans Préférences->Plugins" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:163 -msgid "Sending to &device" -msgstr "Envoi vers l'&appareil" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:603 -msgid "Show notification when &new version is available" -msgstr "Envoyer une notification quand une &nouvelle version est disponible." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:604 -msgid "Download &social metadata (tags/ratings/etc.) by default" -msgstr "" -"Télécharger les métadonnées &sociales (étiquettes/classement/etc...) par " -"défaut" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605 -msgid "&Overwrite author and title by default when fetching metadata" -msgstr "" -"Écraser l'auteur et le titre par défaut l&ors de la récupération des " -"métadonnées" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 -msgid "Default network &timeout:" -msgstr "&Timeout par défaut pour les connexions réseau :" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 -msgid "" -"Set the default timeout for network fetches (i.e. anytime we go out to the " -"internet to get information)" -msgstr "" -"Indiquer le timeout par défaut pour les recherches réseau (c-à-d le temps " -"utilisé pour aller rechercher l'information par internet)" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 -msgid " seconds" -msgstr " secondes" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 -msgid "Choose &language (requires restart):" -msgstr "Choisir la &langue (nécessite un redémarrage):" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 -msgid "Normal" -msgstr "Normale" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 -msgid "High" -msgstr "Haute" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 -msgid "Low" -msgstr "Basse" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 -msgid "Job &priority:" -msgstr "&Priorité du travail:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 -msgid "Preferred &output format:" -msgstr "Format de &sortie préféré:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 -msgid "Reset all disabled &confirmation dialogs" -msgstr "Réinitialiser tous les dialogues de &confirmation" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 -msgid "Preferred &input format order:" -msgstr "Ordre préféré pour le format d'&entrée" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 -msgid "Use &Roman numerals for series number" -msgstr "Utiliser les chiffres &romains pour les numéros de séries" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 -msgid "Enable system &tray icon (needs restart)" -msgstr "" -"&Activer l'affichage dans la zone de notification (redémarrage nécessaire)" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 -msgid "Show ¬ifications in system tray" -msgstr "Afficher les alertes dans la zone de ¬ification" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 -msgid "Show &splash screen at startup" -msgstr "Afficher l'&écran d'accueil au démarrage" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:623 -msgid "Show cover &browser in a separate window (needs restart)" -msgstr "" -"Afficher la &navigation par couverture dans une fenêtre séparée (redémarrage " -"nécessaire)" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 -msgid "Show &average ratings in the tags browser" -msgstr "Afficher la note moyenne dans le navigateur d'étiquettes" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:625 -msgid "Search as you type" -msgstr "Rechercher lors de la saisie" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:626 -msgid "Automatically send downloaded &news to ebook reader" -msgstr "Envoyer automatiquement les i&nformations vers le lecteur d'ebook" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 -msgid "&Delete news from library when it is automatically sent to reader" -msgstr "" -"&Supprimer les News de la bibliothèque lorsque l'envoi est automatique vers " -"l'appareil" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 -msgid "&Number of covers to show in browse mode (needs restart):" -msgstr "" -"&Nombre de couvertures à afficher dans le mode navigation (nécessite un " -"redémarrage):" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:629 -msgid "Select visible &columns in library view" -msgstr "Sélectionner les &colonnes visibles dans la vue bibliothèque" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 -msgid "Remove a user-defined column" -msgstr "Supprimer une colonne définie par l'utilisateur" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 -msgid "Add a user-defined column" -msgstr "Ajouter une colonne définie par l'utilisateur" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:635 -msgid "Edit settings of a user-defined column" -msgstr "Editer les paramètres d'une colonne définie par l'utilisateur" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:638 -msgid "Use internal &viewer for:" -msgstr "Utiliser l'&afficheur interne pour:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:639 -msgid "User Interface &layout (needs restart):" -msgstr "Présentation de &l'interface utilisateur (nécessite un redémarrage):" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640 -msgid "Restriction to apply when the current library is opened:" -msgstr "Restrictions à appliquer quand la bibliothèque actuelle est ouverte:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641 -msgid "" -"Apply this restriction on calibre startup if the current library is being " -"used. Also applied when switching to this library. Note that this setting is " -"per library. " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642 -msgid "Disable all animations. Useful if you have a slow/old computer." -msgstr "" -"Désactiver toutes les animations. Utile si vous avez un vieil ordinateur ou " -"un ordinateur lent" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:643 -msgid "Disable &animations" -msgstr "Désactiver les &animations" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:644 -msgid "Show &donate button (restart)" -msgstr "Afficher le bouton de &donation (redémarrage nécessaire)" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:645 -msgid "&Toolbar" -msgstr "&Barre d'outils" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:646 -msgid "&Icon size:" -msgstr "Taille d'&icone" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:647 -msgid "Show &text under icons:" -msgstr "Afficher le &texte sous les icônes:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:648 -msgid "Add an email address to which to send books" -msgstr "Ajouter une adresse email où les livres seront envoyés" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:649 -msgid "&Add email" -msgstr "&Ajouter un email" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:650 -msgid "Make &default" -msgstr "Par &défaut" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:651 -msgid "&Remove email" -msgstr "&Supprimer un email" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:652 -msgid "" -"calibre can send your books to you (or your reader) by email. Emails will be " -"automatically sent for downloaded news to all email addresses that have Auto-" -"send checked." -msgstr "" -"Calibre peut vous envoyer vos livres (ou à votre lecteur) par email. Les " -"emails seront automatiquement envoyés lors du téléchargement des News à " -"toutes les adresses qui ont 'Envoyer automatiquement' coché." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:653 -msgid "&Maximum number of waiting worker processes (needs restart):" -msgstr "" -"Nombre &maximum de processus de travail en attente (nécessite un " -"redémarrage):" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654 -msgid "Limit the max. simultaneous jobs to the available CPU &cores" -msgstr "" -"Limiter le nombre max de travaux simultanés au nombre de &cœurs de " -"processeurs disponibles" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655 -msgid "Debug &device detection" -msgstr "Déboguer la &détection de l'appareil" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:656 -msgid "&Check database integrity" -msgstr "Vérifier l'&intégrité de la base de données" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:657 -msgid "Open calibre &configuration directory" -msgstr "Ouvrir le répertoire de &configuration de Calibre" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:658 -msgid "&Install command line tools" -msgstr "&Installer les outils en ligne de commande" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:659 -msgid "&Miscellaneous" -msgstr "&Divers" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:660 -msgid "" -"Values for the tweaks are shown below. Edit them to change the behavior of " -"calibre" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:661 -msgid "All available tweaks" -msgstr "Réglages disponibles" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:662 -msgid "&Current tweaks" -msgstr "Réglages a&ctuels" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:663 -msgid "&Restore to defaults" -msgstr "&Restorer les valeurs par défaut" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:664 -msgid "&Tweaks" -msgstr "&Réglages" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:665 -msgid "" -"calibre contains a network server that allows you to access your book " -"collection using a browser from anywhere in the world. Any changes to the " -"settings will only take effect after a server restart." -msgstr "" -"Calibre dispose d'un serveur réseau vous permettant d'accéder à votre " -"collection de livres en utilisant un navigateur à partir de n'importe quel " -"endroit dans le monde. Toute modification des paramètres ne prendra effet " -"qu'après un redémarrage du serveur." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:666 -msgid "Server &port:" -msgstr "&Port du serveur:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:667 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 -msgid "&Username:" -msgstr "Nom d'&utilisateur:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:668 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 -msgid "&Password:" -msgstr "Mot de &passe :" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:669 -msgid "" -"If you leave the password blank, anyone will be able to access your book " -"collection using the web interface." -msgstr "" -"Si vous laisser le mot de passe à vide, tout le monde pourra accéder à votre " -"collection de livres en utilisant une interface web." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:670 -msgid "" -"The maximum size (widthxheight) for displayed covers. Larger covers are " -"resized. " -msgstr "" -"Taille maximale (largeurxhauteur) pour l'affichage des couvertures. Les " -"couvertures plus larges sont redimensionnées. " - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:671 -msgid "Max. &cover size:" -msgstr "Taille max. de la &couverture:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:672 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 -msgid "&Show password" -msgstr "&Montrer le mot de passe" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:673 -msgid "Max. &OPDS items per query:" -msgstr "Nombre d'articles &OPDS max. par requête:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:674 -msgid "Max. OPDS &ungrouped items:" -msgstr "Nombre max. d'articles OPDS &non groupés:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675 -msgid "Restriction (saved search) to apply:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676 -msgid "" -"This restriction (based on a saved search) will restrict the books the " -"content server makes available to those matching the search. This setting is " -"per library (i.e. you can have a different restriction per library)." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677 -msgid "&Start Server" -msgstr "Démarrer le &Serveur" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:678 -msgid "St&op Server" -msgstr "Arrêter le S&erveur" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:679 -msgid "&Test Server" -msgstr "&Tester le serveur" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:680 -msgid "Run server &automatically on startup" -msgstr "Lancer &automatiquement le serveur au démarrage" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:681 -msgid "View &server logs" -msgstr "Afficher les logs du &serveur" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:682 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46 -msgid "" -"

    Remember to leave calibre running as the server only runs as long as " -"calibre is running.\n" -"

    Stanza should see your calibre collection automatically. If not, try " -"adding the URL http://myhostname:8080 as a new catalog in the Stanza reader " -"on your iPhone. Here myhostname should be the fully qualified hostname or " -"the IP address of the computer calibre is running on." -msgstr "" -"

    Pensez à laisser tourner Calibre car le serveur ne fonctionne que si " -"Calibre est démarré.\n" -"

    Stanza doit voir votre collection calibre automatiquement. Sinon, essayer " -"d'ajouter l'URL http://nomhote:8080 comme nouveau catalogue dans le lecteur " -"Stanza de votre iPhone. Ici nomhote doit être le nom d'hôte complet ou " -"l'adresse IP de l'ordinateur sur lequel Calibre est démarré." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:684 -msgid "" -"Here you can customize the behavior of Calibre by controlling what plugins " -"it uses." -msgstr "" -"Ici vous pouvez personnaliser le comportement de Calibre en choisissant les " -"plugins que vous souhaitez utiliser." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:685 -msgid "Enable/&Disable plugin" -msgstr "Activer/&Désactiver le plugin" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:686 -msgid "&Customize plugin" -msgstr "&Personnaliser le plugin" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:687 -msgid "&Remove plugin" -msgstr "Supp&rimer le plugin" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:688 -msgid "Add new plugin" -msgstr "Ajouter un nouveau plugin" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:689 -msgid "Plugin &file:" -msgstr "&Fichier plugin:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:691 -msgid "&Add" -msgstr "&Ajouter" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:125 -msgid "Create Tag-based Column" -msgstr "Créer une colonne basée sur l'étiquette" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:126 -msgid "Lookup name" -msgstr "Recherche le nom" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:127 -msgid "Column heading" -msgstr "En-tête de colonne" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:128 -msgid "Column type" -msgstr "Type de colonne" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:129 -msgid "Use brackets" -msgstr "Utiliser les parenthèses" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:130 -msgid "Values can be edited" -msgstr "Les valeurs peuvent être éditées" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:135 -msgid "Text" -msgstr "Texte" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:136 -msgid "Number" -msgstr "Nombre" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:889 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568 -msgid "Date" -msgstr "Date" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:138 -msgid "Tag on book" -msgstr "Etiquette sur le livre" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:139 -msgid "Explanation text added in create_ct_column.py" -msgstr "Texte explicatif ajouté dans create_ct_column.py" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:140 -msgid "Create and edit tag-based columns" -msgstr "Créer et éditer les colonnes basées sur les étiquettes" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:19 -msgid "Text, column shown in the tag browser" -msgstr "Texte, colonne affichée dans le navigateur d'étiquettes" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:22 -msgid "Comma separated text, like tags, shown in the tag browser" -msgstr "" -"Texte séparé par des virgules, comme les étiquettes, affiché dans le " -"navigateur d'étiquettes" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:25 -msgid "Long text, like comments, not shown in the tag browser" -msgstr "" -"Texte long, comme les commentaires, non affiché dans le navigateur " -"d'étiquettes" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:28 -msgid "Text column for keeping series-like information" -msgstr "" -"Colonne de texte pour conserver des informations semblables aux séries" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:33 -msgid "Floating point numbers" -msgstr "Nombres à virgule flottante" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:35 -msgid "Integers" -msgstr "Entiers" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:37 -msgid "Ratings, shown with stars" -msgstr "Notation, affichée à l'aide d'étoiles" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:40 -msgid "Yes/No" -msgstr "Oui/Non" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:69 -msgid "No column selected" -msgstr "Aucune colonne sélectionnée" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:70 -msgid "No column has been selected" -msgstr "Aucune colonne n'a été sélectionnée" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:74 -msgid "Selected column is not a user-defined column" -msgstr "" -"La colonne sélectionnée n'est pas une colonne définie par l'utilisateur" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:105 -msgid "No lookup name was provided" -msgstr "Aucun nom n'a été fourni pour la recherche" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:107 -msgid "" -"The lookup name must contain only lower case letters, digits and " -"underscores, and start with a letter" -msgstr "" -"Le nom recherché ne doit contenir que des minuscules, des chiffres et des " -"underscores (tirets bas), et commencer par une lettre" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:116 -msgid "No column heading was provided" -msgstr "Aucun en-tête de colonne n'a été fourni" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:122 -msgid "The lookup name %s is already used" -msgstr "Le nom recherché %s est déjà utilisé" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:132 -msgid "The heading %s is already used" -msgstr "L'en-tête %s est déjà utilisé" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:117 -msgid "Create or edit custom columns" -msgstr "Créer ou éditer des colonnes personnalisées" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:102 -msgid "&Lookup name" -msgstr "&Nom recherché" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:103 -msgid "Column &heading" -msgstr "&En-tête de colonne" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:104 -msgid "" -"Used for searching the column. Must contain only digits and lower case " -"letters." -msgstr "" -"Utilisé pour la recherche dans la colonne. Ne doit contenir que des chiffres " -"et des lettres en minuscules." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:105 -msgid "" -"Column heading in the library view and category name in the tag browser" -msgstr "" -"En-tête de colonne dans l'affichage de la bibliothèque et nom de catégorie " -"dans le navigateur d'étiquettes" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:106 -msgid "Column &type" -msgstr "&Type de colonne" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:107 -msgid "What kind of information will be kept in the column." -msgstr "Quel type d'informations sera conservé dans la colonne." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:108 -msgid "" -"

    Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's " -"for year.

    \n" -"

    For example:\n" -"

      \n" -"
    • ddd, d MMM yyyy gives Mon, 5 Jan 2010
    • \n" -"
    • dd MMMM yy gives 05 January 10
    • \n" -"
    " -msgstr "" -"

    Format de date. Utiliser 1-4 'd's pour le jour, 1-4 'M's pour le mois, et " -"2 ou 4 'y's pour l'année.

    \n" -"

    Par exemple:\n" -"

      \n" -"
    • ddd, d MMM yyyy donne Lundi, 5 Jan 2010
    • \n" -"
    • dd MMMM yy donne 05 Janvier 10
    • \n" -"
    " - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:114 -msgid "Use MMM yyyy for month + year, yyyy for year only" -msgstr "Utiliser MMM yyyy pour mois + année, yyyy pour l'année seule" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:115 -msgid "Default: dd MMM yyyy." -msgstr "Par défaut: dd MMM yyyy" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:116 -msgid "Format for &dates" -msgstr "Format des &dates" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:21 -msgid "Getting debug information" -msgstr "Obtenir les informations de débogage." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:22 -msgid "Copy to &clipboard" -msgstr "&Copier vers le presse-papier" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:24 -msgid "Debug device detection" -msgstr "Déboguer la détection de l'appareil" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:44 -msgid "Invalid template" -msgstr "Modèle incorrect" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:45 -msgid "The template %s is invalid:" -msgstr "Le modèle %s est incorrect:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:42 -msgid "Save &template" -msgstr "Sauvegarder le &modèle" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:43 -msgid "" -"By adjusting the template below, you can control what folders the files are " -"saved in and what filenames they are given. You can use the / character to " -"indicate sub-folders. Available metadata variables are described below. If a " -"particular book does not have some metadata, the variable will be replaced " -"by the empty string." -msgstr "" -"En ajustant le modèle ci-dessous, vous pouvez contrôler dans quels " -"répertoires sont sauvegardés les fichiers et quels noms de fichiers sont " -"donnés. Vous pouvez utiliser le caractère / pour indiquer des sous-dossiers. " -"Les variables de métadonnées disponibles sont décrites ci-dessous. Si un " -"livre n'a pas de métadonnées, la variable est remplacée par une chaine vide." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:44 -msgid "Available variables:" -msgstr "Variables disponibles:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/social.py:34 -msgid "Downloading social metadata, please wait..." -msgstr "Téléchargement des métadonnées sociales, veuillez patienter..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50 -msgid "Separator" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:63 -msgid "Choose library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:113 -msgid "The main toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:114 -msgid "The main toolbar when a device is connected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:115 -msgid "The context menu for the books in the calibre library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:117 -msgid "The context menu for the books on the device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94 -msgid "Customize the actions in:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95 -msgid "A&vailable actions" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96 -msgid "&Current actions" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97 -msgid "Move selected action up" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99 -msgid "Move selected action down" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 -msgid "Ctrl+S" -msgstr "Ctrl+S" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102 -msgid "Add selected actions to toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104 -msgid "Remove selected actions from toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:55 msgid "&Show this warning again" msgstr "&Afficher cet avertissement de nouveau" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:47 msgid "ERROR" msgstr "ERREUR" @@ -7185,6 +6313,14 @@ msgstr "" msgid "Location" msgstr "Emplacement" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 +msgid "Date" +msgstr "Date" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1064 msgid "Format" @@ -7196,7 +6332,7 @@ msgstr "Effacer de l'appareil" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:33 msgid "Author sort" -msgstr "Clé de tri d'auteur" +msgstr "Clé de tri par auteur" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:66 msgid "Manage authors" @@ -7208,7 +6344,7 @@ msgstr "Trier par auteur" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:68 msgid "Sort by author sort" -msgstr "Trier par clé de tri d'auteur" +msgstr "Trier par clé de tri par auteur" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:69 msgid "" @@ -7216,10 +6352,14 @@ msgid "" "author. Exactly how this value is automatically generated can be controlled " "via Preferences->Advanced->Tweaks" msgstr "" +"Réinitialiser toutes les valeurs de la clé de tri par auteur à la valeur " +"générée automatiquement à partir de l'auteur. La manière dont cette valeur " +"est calculée automatiquement peut-être controllé via " +"Péférences>Avancées>Réglages" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:70 msgid "Recalculate all author sort values" -msgstr "Recalculer toutes les valeurs de clés de tri d'auteur" +msgstr "Recalculer toutes les valeurs de clés de tri par auteur" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 msgid "Author Sort" @@ -7262,11 +6402,11 @@ msgstr "" "Aucune métadonnée trouvée, essayer en modifiant le titre et l'auteur ou la " "clé ISBN." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 msgid "Fetch metadata" msgstr "Récupérer des métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91 msgid "" "

    calibre can find metadata for your books from two locations: Google " "Books and isbndb.com.

    To use isbndb.com you must sign up for a " @@ -7279,53 +6419,53 @@ msgstr "" "href=\"http://www.isbndb.com\">compte gratuit et entrer votre clef " "d'accès ci-dessous." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92 msgid "&Access Key:" msgstr "Clef d'&accès" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:93 msgid "Fetch" msgstr "Récupérer" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:94 msgid "Matches" msgstr "Résultats correspondants" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:95 msgid "" "Select the book that most closely matches your copy from the list below" msgstr "" "Sélectionnez le livre qui correspond le mieux au votre dans la liste ci-" "dessous." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:96 msgid "Download &social metadata (tags/rating/etc.) for the selected book" msgstr "" "Télécharger les métadonnées &sociales (étiquettes/classement/etc...) pour le " "livre sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:97 msgid "Overwrite author and title with author and title of selected book" msgstr "" "Écraser l'auteur et le titre avec l'auteur et le titre du livre sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:42 msgid "Details of job" msgstr "Détail du travail" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:49 msgid "Active Jobs" msgstr "Exécutions en cours" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:50 msgid "&Stop selected job" msgstr "Arrêter les travaux &sélectionnés" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:51 msgid "Show job &details" msgstr "Afficher les &détails du travail" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:52 msgid "Stop &all non device jobs" msgstr "&Arrêter tous les travaux ne concernant pas les appareils" @@ -7333,25 +6473,25 @@ msgstr "&Arrêter tous les travaux ne concernant pas les appareils" msgid "Editing meta information for %d books" msgstr "Edite les informations des métadonnées pour %d livres" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:225 msgid "Applying changes to %d books. This may take a while." msgstr "" "Application des modifications à %d livres. Ceci peut prendre un moment." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 msgid "Edit Meta information" msgstr "Editer les informations sur les Métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:167 msgid "A&utomatically set author sort" msgstr "Effectuer un tri a&utomatique par auteur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 msgid "Author s&ort: " msgstr "&Tri par auteur: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -7359,56 +6499,64 @@ msgstr "" "Définit comment l'auteur de ce livre doit être classé. Par exemple, Charles " "Dickens peut être classé comme Dickens, Charles." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid "&Rating:" msgstr "&Note :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:164 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Rating of this book. 0-5 stars" msgstr "Note de ce livre. de 0 à 5 étoiles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 msgid "No change" msgstr "Aucune modification" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid " stars" msgstr " étoiles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 msgid "Add ta&gs: " msgstr "Ajouter des &étiquettes: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "Open Tag Editor" msgstr "Ouvre l'éditeur de mots-clefs" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:180 msgid "&Remove tags:" msgstr "&Supprime les étiquettes :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:181 msgid "Comma separated list of tags to remove from the books. " msgstr "" "Liste d'étiquettes séparées par des virgules à supprimer des livres. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:182 +msgid "Remove all" +msgstr "Tout supprimer" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +msgid "Check this box to remove all tags from the books." +msgstr "Cocher cette cas pour supprimer toutes les étiquettes des livres." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:187 msgid "Remove &format:" msgstr "Supprimer le &format:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 msgid "&Swap title and author" msgstr "&Intervertir le titre et l'auteur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -7420,7 +6568,7 @@ msgstr "" "Ainsi si vous avez sélectionné le livre A et puis le livre B,\n" "le livre A aura un numéro de série 1 et le livre B un numéro de série 2." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:194 msgid "" "Remove stored conversion settings for the selected books.\n" "\n" @@ -7430,19 +6578,19 @@ msgstr "" "\n" "Toute conversion future de ces livres utilisera les paramètres par défaut." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:197 msgid "Remove &stored conversion settings for the selected books" msgstr "" "Supprimer les paramètres de conversion &enregistrés pour les livres " "sélectionnés" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "&Basic metadata" msgstr "Metadonnées de &base" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 msgid "&Custom metadata" msgstr "Metadonnées &personnalisées" @@ -7594,99 +6742,123 @@ msgstr "" "Impossible d'ouvrir %s. Est-il en cours d'utilisation par un autre programme " "?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 msgid "Edit Meta Information" msgstr "Editer les métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 msgid "Meta information" msgstr "Informations sur les Métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 msgid "Swap the author and title" msgstr "Inverse l'auteur et le titre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 msgid "Author S&ort: " msgstr "Clé de tr&i d'auteur: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid "" "Automatically create the author sort entry based on the current author entry" msgstr "" "Crée automatiquement la vedette de nom d'auteur à partir du nom d'auteur " "courant." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid "Remove unused series (Series that have no books)" msgstr "" "Supprimer les séries inutilisées (Les séries qui ne possèdent aucun livres)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "IS&BN:" msgstr "I&SBN :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 msgid "Publishe&d:" msgstr "Pu&blié:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 msgid "dd MMM yyyy" msgstr "dd MMM yyyy" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 msgid "&Date:" msgstr "&Date:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "&Comments" msgstr "&Commentaires" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 msgid "&Fetch metadata from server" msgstr "&Récupérer les métadonnées à partir du serveur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "Available Formats" msgstr "Formats disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "Add a new format for this book to the database" msgstr "Ajouter un nouveau format dans la base de données pour ce livre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 msgid "Remove the selected formats for this book from the database." msgstr "Retire les formats sélectionnés de ce livre de la base de données." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "Set the cover for the book from the selected format" msgstr "Indiquer la couverture pour le livre à partir du format sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "Update metadata from the metadata in the selected format" msgstr "" "Mettre à jour les métadonnées à partir des métadonnées du format sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +msgid "&Browse" +msgstr "&Parcourir" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Reset cover to default" msgstr "Revenir à la couverture par défaut" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 -msgid "Download &cover" -msgstr "Télécharger la &couverture" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +msgid "Download co&ver" +msgstr "Télécharger la cou&verture" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 msgid "Generate a default cover based on the title and author" msgstr "Générer une couverture par défaut basée sur le titre et l'auteur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 msgid "&Generate cover" msgstr "&Générer la couverture" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:61 msgid "Password needed" msgstr "Mot de passe nécessaire" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 +msgid "&Username:" +msgstr "Nom d'&utilisateur:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 +msgid "&Password:" +msgstr "Mot de &passe :" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 +msgid "&Show password" +msgstr "&Montrer le mot de passe" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:59 msgid "Aborting..." msgstr "Abandon..." @@ -7702,31 +6874,31 @@ msgstr "" "La recherche sauvegardée actuelle sera définitivement supprimée. Êtes-" "vous sûr ?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 msgid "Saved Search Editor" msgstr "Editeur de recherche sauvegardée" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 msgid "Saved Search: " msgstr "Recherche sauvegardée: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:90 msgid "Select a saved search to edit" msgstr "Sélectionner une recherche sauvegardée à modifier" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 msgid "Delete this selected saved search" msgstr "Supprimer la recherche sauvegardée sélectionnée" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:93 msgid "Enter a new saved search name." msgstr "Entrer un nouveau nom pour la recherche sauvegardée" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:94 msgid "Add the new saved search" msgstr "Ajouter la nouvelle recherche sauvegardée" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:96 msgid "Change the contents of the saved search" msgstr "Modifier le contenu de la recherche sauvegardée" @@ -7757,7 +6929,7 @@ msgid "Last downloaded" msgstr "Dernier téléchargé" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:220 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 msgid "Schedule news download" msgstr "Planifier le téléchargement des News" @@ -7778,69 +6950,69 @@ msgid "Cannot download news as no internet connection is active" msgstr "" "Impossible de télécharger les News car aucune connexion internet active" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:278 msgid "Recipes" msgstr "Recettes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 msgid "Download all scheduled recipes at once" msgstr "Télécharger toutes les recettes en une seule fois" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 msgid "Download &all scheduled" msgstr "Télécharger &toutes les planifications" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 msgid "blurb" msgstr "texte de présentation" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 msgid "&Schedule for download:" msgstr "&Planifier le téléchargement" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 msgid "Every " msgstr "Chaque " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 msgid "day" msgstr "jour" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 msgid "Monday" msgstr "Lundi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 msgid "Tuesday" msgstr "Mardi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 msgid "Wednesday" msgstr "Mercredi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 msgid "Thursday" msgstr "Jeudi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 msgid "Friday" msgstr "Vendredi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 msgid "Saturday" msgstr "Samedi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 msgid "Sunday" msgstr "Dimanche" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 msgid "at" msgstr "à" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 msgid "" "Interval at which to download this recipe. A value of zero means that the " "recipe will be downloaded every hour." @@ -7848,43 +7020,43 @@ msgstr "" "Intervalle pour le téléchargement de cette recette. Une valeur à zéro " "signifie que la recette sera téléchargée toutes les heures." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 msgid " days" msgstr " jours" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 msgid "&Account" msgstr "&Compte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "For the scheduling to work, you must leave calibre running." msgstr "" "Pour que la planification puisse s'exécuter, vous devez laisser Calibre " "fonctionner." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "&Schedule" msgstr "&Planifier" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Add &title as tag" msgstr "Ajouter le &titre comme étiquette" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "&Extra tags:" msgstr "&Etiquettes complémentaires:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "&Advanced" msgstr "&Avancé" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "&Download now" msgstr "&Télécharger maintenant" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "" "Delete downloaded news older than the specified number of days. Set to zero " "to disable." @@ -7892,7 +7064,7 @@ msgstr "" "Supprimer les News téléchargées plus anciennes que le nombre de jours " "spécifiés. Indiquer zéro pour le désactiver." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "Delete downloaded news older than " msgstr "Effacer les News plus anciennes que " @@ -7916,62 +7088,62 @@ msgstr "" msgid "Negate" msgstr "Exclut" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 msgid "Advanced Search" msgstr "Recherche avancée" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 msgid "Find entries that have..." msgstr "Trouver les entrées qui ont..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 msgid "&All these words:" msgstr "&Tous ces mots:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 msgid "This exact &phrase:" msgstr "Cette &phrase exacte:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 msgid "&One or more of these words:" msgstr "&Un ou plus de ces mots:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 msgid "But dont show entries that have..." msgstr "Mais ne montre pas les entrées qui ont..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 msgid "Any of these &unwanted words:" msgstr "A&ucun de ces mots non souhaités:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 msgid "What kind of match to use:" msgstr "Type de correspondance à utiliser" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 msgid "Contains: the word or phrase matches anywhere in the metadata" msgstr "" "Contient: le mot ou la phrase peuvent correspondre à n'importe quel " "élément des métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 msgid "Equals: the word or phrase must match an entire metadata field" msgstr "" "Egal: le mot ou la phrase doivent correspondrent à un champ entier de " "métadonnée" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 msgid "" "Regular expression: the expression must match anywhere in the metadata" msgstr "" "Expression régulière : l'expression doit correspondre quelque part dans les " "métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:129 msgid " " msgstr " " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 msgid "" "See the User Manual for more help" @@ -8004,53 +7176,53 @@ msgstr "" "La catégorie actuelle d'étiquettes sera effacée de manière " "permanente. Etes vous sûr de vouloir continuer?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 msgid "User Categories Editor" msgstr "Editeur de catégories utilisateur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:159 msgid "A&vailable items" msgstr "Articles &disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 msgid "Apply tags to current tag category" msgstr "Appliquer les étiquettes à la catégorie actuelle d'étiquettes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 msgid "A&pplied items" msgstr "Articles a&ppliqués" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:163 msgid "Unapply (remove) tag from current tag category" msgstr "" "Retirer (supprimer) l'étiquette de la catégorie actuelle d'étiquettes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:165 msgid "Category name: " msgstr "Nom de la catégorie: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:166 msgid "Select a category to edit" msgstr "Sélectionner une catégorie à éditer" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 msgid "Delete this selected tag category" msgstr "Supprimer cette catégorie d'étiquette sélectionnée" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:169 msgid "Enter a new category name. Select the kind before adding it." msgstr "" "Entrer un nouveau nom de catégorie. Sélectionner le genre avant de l'ajouter." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:170 msgid "Add the new category" msgstr "Ajouter la nouvelle catégorie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:172 msgid "Category filter: " msgstr "Filtre de catégorie: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:173 msgid "Select the content kind of the new category" msgstr "Sélectionner le type de contenu de la nouvelle catégorie" @@ -8067,15 +7239,15 @@ msgstr "" "Les étiquettes suivantes sont utilisées par un livre ou plus. Êtes-vous " "certain de vouloir les supprimer ?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 msgid "Tag Editor" msgstr "Editeur de Mots-Clefs" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 msgid "A&vailable tags" msgstr "Etiquettes &disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -8083,23 +7255,23 @@ msgstr "" "Supprime un mot-clef de la base de données. Cette opération va retirer ce " "mot-clef de tous les livres et le supprimer de la base de données." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 msgid "Apply tag to current book" msgstr "Applique le mot-clef au livre en cours." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 msgid "A&pplied tags" msgstr "Etiquettes a&ppliquées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 msgid "Unapply (remove) tag from current book" msgstr "Enlève le mot-clef du livre en cours" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:137 msgid "&Add tag:" msgstr "&Ajouter une étiquette:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:138 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -8108,7 +7280,7 @@ msgstr "" "pouvez l'ajouter ici. Accepte une liste d'étiquettes séparées par des " "virgules." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:139 msgid "Add tag to available tags and apply it to current book" msgstr "" "Ajoute l'étiquette à la liste des étiquettes et l'applique au livre en cours" @@ -8149,15 +7321,15 @@ msgstr "Vous devez sélectionner au moins un article de la liste." msgid "Are you certain you want to delete the following items?" msgstr "Etes vous sûr de vouloir supprimer les articles suivants?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 msgid "Category Editor" msgstr "Éditeur de catégories" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 msgid "Items in use" msgstr "Articles en cours d'utlisation" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:79 msgid "" "Delete item from database. This will unapply the item from all books and " "then remove it from the database." @@ -8165,19 +7337,24 @@ msgstr "" "Supprimer l'article de la base de données. Ceci desactivera l'article pour " "tous les livres et le supprimera ensuite de la base de données." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:81 msgid "Rename the item in every book where it is used." msgstr "Renommer l'article" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:106 +msgid "Ctrl+S" +msgstr "Ctrl+S" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:56 msgid "Test email settings" msgstr "Tester le paramétrage email" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:57 msgid "Send test mail from %s to:" msgstr "Envoyer un email de test de %s vers:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115 msgid "&Test" msgstr "&Test" @@ -8196,7 +7373,7 @@ msgstr "Recette pour " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:150 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:260 msgid "Switch to Advanced mode" msgstr "Basculer vers le mode Avancé" @@ -8221,10 +7398,6 @@ msgstr "Le flux doit avoir une URL" msgid "The feed %s must have a URL" msgstr "Le flux %s doit avoir une URL" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 -msgid "Already exists" -msgstr "Existe déjà" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:186 msgid "This feed has already been added to the recipe" msgstr "Ce flux a déjà été ajouté à la recette" @@ -8266,35 +7439,35 @@ msgstr "Choisir une recette à personnaliser" msgid "Choose a recipe file" msgstr "Choisir un fichier de recette" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:253 msgid "Add custom news source" msgstr "Ajouter une nouvelle source d'informations" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:254 msgid "Available user recipes" msgstr "Recettes utilisateur disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:255 msgid "Add/Update &recipe" msgstr "Ajouter/Mettre à jour la &recette" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:256 msgid "&Remove recipe" msgstr "Supp&rimer la recette" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:257 msgid "&Share recipe" msgstr "&Partager une recette" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:258 msgid "Customize &builtin recipe" msgstr "Personnaliser les recettes &intégrées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:259 msgid "&Load recipe from file" msgstr "&Charger une recette à partir d'un fichier" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:261 msgid "" "