diff --git a/Changelog.yaml b/Changelog.yaml index 4997cca255..8efb7317d7 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -4,6 +4,391 @@ # for important features/bug fixes. # Also, each release can have new and improved recipes. +- version: 0.7.8 + date: 2010-07-09 + + new features: + - title: "New tool to help prepare EPUBs for publication" + type: major + description: > + "calibre now contains a new command line tool called epub-fix that can automatically fix + common problems in EPUB files that cause them to be rejected by poorly designed publishing services. + The tool is plugin based for extensible functionality in the future. Currently, it can fix unmanifested files + and workaround the date and svg preserveaspectratio bugs of epubcheck." + + - title: "New icons for the toolbar buttons by Kamil Tatara" + + - title: "Display rating (when available) in cover browser" + + - title: "Clicking on the central cover int the cover browser now opens that book in the viewer" + + - title: "Use the status bar instead of the area to the right of the location view to display status information" + + - title: "Driver for the Pandigital Novel e-book reader" + + bug fixes: + - title: "News download: Don not specify a font family for article descriptions" + + - title: "News download: Fix regression introduced in 0.7.0 that broke download of some embedded content feeds" + + - title: "MOBI Output: Partial support for nested superscript and subscripts." + tickets: [6132] + + - title: "CHM Input: Fix handling of buggy CHM files with no .hhc" + tickets: [6087] + + - title: "EPUB Input: Fix bug in unzipping EPUB files that have been zipped in depth first order." + tickets: [6127] + + - title: "TXT Input: Convert HTML entities to characters." + tickets: [6114] + + - title: "LRF Input: Handle LRF files with random null bytes in the text" + tickets: [6097] + + - title: "Kobo driver: Fix detection of txt/html files on the device" + + - title: "Fix opening of books when calibre library is on an unmapped network share in windows" + + - title: "SONY driver: Only update the timestamp in the XML db for newly added books" + + - title: "Cover browser: Fix rendering of center cover when width of cover browser is less than the width of a single cover" + + - title: "Cover browser: Correct fix for setPixel out of bounds warning causing UI slowdown in calibre" + + new recipes: + - title: "evz.ro" + author: Darko Miletic + + - title: "Anchorage Daily News, China Economic Net, BBC Chinese and Singtao Daily" + author: rty + + - title: Big Oven + author: Starson17 + + improved recipes: + - Haaretz + - Editor and Publisher + - Estadao + + +- version: 0.7.7 + date: 2010-07-02 + + new features: + - title: "Support for the Nokia E52" + + - title: "Searching on the size column" + + - title: "iTunes driver: Add option to disable cover fetching for speeding up the fetching of large book collections" + + bug fixes: + - title: "SONY driver: Only update metadata when books are sent to device." + + - title: "TXT Input: Ensure the generated html is splittable" + tickets: [5904] + + - title: "Fix infinite loop in default cover generation." + tickets: [6061] + + - title: "HTML Input: Fix a parsing bug that was triggered in rare conditions" + tickets: [6064] + + - title: "HTML2Zip plugin: Do not replace ligatures" + tickets: [6019] + + - title: "iTunes driver: Fix transmission of non integral series numbers" + tickets: [6046] + + - title: "Simplify implementation of cover caching and ensure cover browser is updated when covers are changed" + + - title: "PDF metadata: Fix last character corrupted when setting metadata in encrypted files." + + - title: "PDF metadata: Update the version of PoDoFo used to set metadata to 0.8.1. Hopefully that means more PDF files will work" + + - title: "Device drivers: Speedup for dumping metadata cache to devices on Windows XP" + + - title: "EPUB Output: Ensure that language setting is conformant to the specs" + + - title: "MOBI Output: Fix a memory leak and a crash in the palmdoc compression routine" + + - title: "Metadata download: Fix a regression that resulted in a failed download for some books" + + new recipes: + - title: "Foreign Policy and Alo!" + author: Darko Miletic + + - title: Statesman and ifzm + author: rty + + improved recipes: + - Akter + - The Old New Thing + + + +- version: 0.7.6 + date: 2010-06-28 + + new features: + - title: "Add support for the new firmware of the Azbooka" + tickets: [5994] + + - title: "A few speedups for calibre startup, should add up to a few seconds of startup time on slower machines" + + - title: "Support for the Sweem MM300" + + - title: "Add keyboard shorcut for Download metadata and covers" + + bug fixes: + - title: "Fix regression in 0.7.5 that broke conversion of malformed HTML files (like those Microsoft Word outputs)" + type: major + tickets: [5991] + + - title: "Don't download tags from librarything, as the tagging there is not very good" + + - title: "Add mimetype for FB2 so that it can be served by the content server" + tickets: [6011] + + - title: "Ensure cover is not resized to less than the available space in the Edit Meta Information dialog" + tickets: [6001] + + - title: "SONY driver: Only update collections when sending book to device for the first time" + + - title: "calibre should now work on windows when the location for the library contains non-ascii characters" + tickets: [5983] + + - title: "Cover browser once again distorts instead of cropping covers that have an incorrect aspect ratio" + + - title: "ISBNDb metadata plugin: Fix bug causing only first page of results to be fetched" + + - title: "Move iTunes driver to the bottom so that it doesn't interfere with device detection for people that have iphones and an ereader plugged in" + + improved recipes: + - Houston Chronicle + - Hindu + - Times of India + - New York Times + + new recipes: + - title: Winnipeg Sun + author: rty + +- version: 0.7.5 + date: 2010-06-25 + + new features: + - title: "New driver for the Kobo featuring closer integration with the device." + + - title: "Support for the Dell Streak, Eken Android tablet and the Astak Mentor EB600" + + - title: "New series type custom column" + + - title: "Add option in Send to device menu to connect to iTunes without any iDevice (experimental)" + + - title: "iPad driver: Make setting iTunes Category from series optional. News download now optimizations for iPad output." + + - title: "Add option to disable book cover animation" + tickets: [5909] + + - title: "Edit meta information dialog: Remember last used size and splitter position." + tickets: [5908] + + - title: "Metadata download: If any results have a published date, ensure they all do" + + - title: "SONY driver: Add a preference setting in Preferences->Add/Save->Send to device to control how colelctions are managed on the device by calibre" + + - title: "Metadata download: Filter out non book results. Also sort results by availability of covers for the isbn" + tickets: [5946] + + - title: "Bulk editing for device collections in the device view via the context menu" + + bug fixes: + - title: "When converting books using the calibre GUI, set the language of the output book to be the same as the language of the User Interface, instead of undefined. Fixes use of dictionary in iBooks" + + - title: "PDF Output: Fix setting top/bottom margnis has no effect" + + - title: "Conversion pipeline: Fix typo causing remove footer regex to always fail" + + - title: "Handle device being yanked with queued device jobs gracefully" + + - title: "Conversion pipeline: Handle deeply nested XML structures" + tickets: [5931] + + - title: "Conversion pipeline: Fix handling of lists with a specified left margin" + tickets: [5877] + + - title: "Restore workaround for ADE buggy rendering of anchors as links. However, make it overridable by extra CSS" + + - title: "Fix LibraryThing metadata download plugin" + + - title: "Fix multiple ratings displayed in Tag Browser for some legacy databases" + + - title: "Fix invocation of postprocess file type plugins plugins" + + - title: "HTML Input: Handle @import directives in linked css files." + tickets: [5135] + + - title: "HTML Input: Handle absolute paths in resource links on windows correctly." + tickets: [3031] + + - title: "E-book viewer: Handle font-face rules specify multiple families to be substituted" + + - title: "Cover browser: Set aspect ratio of covers to 3:4 instead of 2:3. Crop rather than distort covers whoose aspect ratio is different from this. Antialias the rendering of the central cover" + + - title: "Reset Tag browser if the text in the search box is edited" + + - title: "Fix detection of SD card in Samsung Galaxy windows driver" + + new recipes: + - title: "L'Osservatore Romano" + author: Darko Miletic + + - title: China Press, London Free Press, People Daily + author: rty + + improved recipes: + - Zaobao + - New Scientist + - National Post + - London review of books + +- version: 0.7.4 + date: 2010-06-19 + + bug fixes: + - title: "Fix regression in 0.7.3 that broke creating custom columns of rating or text types" + + - title: "Fix cover browser breaking if you click on a book in the book list while cover browser is animated" + + - title: "Fix a bug that could be triggered with the new book details pane if a book has a zero size cover" + tickets: [5889] + + - title: "SONY driver: Fix bug preventing the editing of collections in the device view" + + new recipes: + - title: Auto Prove + author: Gabriele Marini + + - title: Forbes India, Maximum PC, Today Online + author: rty + + improved recipes: + - WSJ + - Psychology Today + + +- version: 0.7.3 + date: 2010-06-18 + + new features: + - title: "The Tag Browser now display an average rating for each item" + type: major + description: > + " + The icons of each individual item in the Tag Browser are now partially colored to indicate the average rating of + all books belonging to that category. For example, the icon next to each author is partially colored based on the + averagerating of all books by that author in your calibre library. You can also hover your mouse over the item to + see the average rating in a tooltip. Can be turned off via Preferences->Interface + " + + - title: "Editable author sort for each author" + type: major + description: > + "calibre has always allowed you to specify the author sort for each bookin your collection. Now you + can also specify the way the name of each individual author should be sorted. This is used to display the list + of authors in the Tag Browser and OPDS feeds in the Content Server" + + - title: "When downloading metadata, also get series information from librarything.com" + type: major + tickets: [5148] + + - title: "Redesign of the Book Details pane" + type: major + description: > + "The Book details pane now display covers with animation. Also instead of showing the full path to the book, you now have + clickable links to open the containing folder or individual formats. The path information is still accessible via a tooltip" + + - title: "New User Interface layouts" + type: major + description: > + "calibre now has two user interface layouts selectable from Preferences->Interface. The 'wide' layout has the book details pane on the side + and the 'narrow' layout has it on the bottom. The default layout is now wide." + + - title: "You can now add books directly from the device to the calibre library by right clicking on the books in the device views" + + - title: "iPad driver: Create category from series preferentially, also handle series sorting" + + - title: "SONY driver: Add an option to use author_sort instead of author when sending to device" + + - title: "Hitting Enter in the search box now causes the search to be re-run" + tickets: [5856] + + - title: "Boox driver: Make destination directory for books customizable" + + - title: "Add plugin to download metadata from douban.com. Disabled by default." + + - title: "OS X/linux driver for PocketBook 301" + + - title: "Support for the Samsung Galaxy and Sigmatek EBK52" + + - title: "On startup do not focus the search bar. Instead you can acces the search bar easily by pressing the / key or the standard search keyboard shortcut for your operating system" + + bug fixes: + - title: "iPad driver: Various bug fixes" + + - title: "Kobo Output profile: Adjust the screen dimensions when converting comics" + + - title: "Fix using Preferences when a device is connected causes items in device menu to be disabled" + + - title: "CHM Input: Skip files whoose names are too long for windows" + + - title: "Brighten up calibre icon on dark backgrounds" + + - title: "Ignore 'Unknown' in title/autors when downloading metadata" + tickets: [5633] + + - title: "Fix regression that broke various entries in the menus - Preferences, Open containing folder and Edit metadata individually" + + - title: "EPUB metadata: Handle comma separated entries in tags correctly" + tickets: [5855] + + - title: "MOBI Output: Fix underlines not being rendered" + tickets: [5830] + + - title: "EPUB Output: Remove workaround for old versions of Adobe Digital Editions' faulty rendering of links in html. calibre no longer forces links to be blue and underlined" + + - title: "Fix a bug that could cause the show pane buttons to not show hidden panes" + + - title: "Fix Tag Editor does not reflect recently changed data in Tag Catagory Text Box" + tickets: [5809] + + - title: "Content server: Fix sorting of books by authors instead of author_sort in the main and mobile views" + + - title: "Cover cache: Resize covers larger than 600x800 in the cover cache to reduce memory consumption in the GUI" + + - title: "EPUB Output: Default cover is generated is now generated as a JPEG instead of PNG32, reducing size by an order of magnitude." + tickets: [5810] + + - title: "Cover Browser: Scale text size with height of cover browser. Only show a reflection of half the cover. Also restore rendering quality after regression in 0.7.1" + tickets: [5808] + + - title: "Book list: Do not let the default layout have any column wider than 350 pixels" + + new recipes: + - title: Akter + author: Darko Miletic + + - title: Thai Rath and The Nation (Thailand) + author: Anat Ruangrassamee + + improved recipes: + - Wall Street Journal + - New York Times + - Slashdot + - Publico + - Danas + - version: 0.7.2 date: 2010-06-11 diff --git a/resources/images/add_book.svg b/resources/images/add_book.svg index b0633d48d3..54a9f05b68 100644 --- a/resources/images/add_book.svg +++ b/resources/images/add_book.svg @@ -1,2404 +1,111 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="149.5" + height="201" + viewBox="0 0 149.49999 201" + enable-background="new 0 0 595.28 841.89" + xml:space="preserve" + inkscape:version="0.47 r22583" + sodipodi:docname="add_book.svg">image/svg+xml + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/config.svg b/resources/images/config.svg index d631d36aa4..28660a4eea 100644 --- a/resources/images/config.svg +++ b/resources/images/config.svg @@ -1,1523 +1,208 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="149.86" + height="195.22701" + viewBox="0 0 149.85999 195.227" + enable-background="new 0 0 595.28 841.89" + xml:space="preserve" + inkscape:version="0.47 r22583" + sodipodi:docname="config.svg">image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/convert.svg b/resources/images/convert.svg index cd18d49cf9..f318fc9c75 100644 --- a/resources/images/convert.svg +++ b/resources/images/convert.svg @@ -1,834 +1,142 @@ - + + image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + inkscape:zoom="0.28032165" + inkscape:cx="75.583001" + inkscape:cy="99.722002" + inkscape:window-x="0" + inkscape:window-y="41" + inkscape:window-maximized="0" + inkscape:current-layer="Isolation_Mode" /> + + - - - - - - - - - - - - - - - - - -image/svg+xml - - - + - - - - - - - - - - - - - - - - - - - - - - + - - - + + + + + + + + + + - + - + - - - + + + - + - + - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + style="stop-color:#000000" + id="stop36" /> + + + + + \ No newline at end of file diff --git a/resources/images/default_cover.svg b/resources/images/default_cover.svg new file mode 100644 index 0000000000..3faf04f61d --- /dev/null +++ b/resources/images/default_cover.svg @@ -0,0 +1,3191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/devices/ipad.png b/resources/images/devices/ipad.png index 119d53dc9a..823109194f 100644 Binary files a/resources/images/devices/ipad.png and b/resources/images/devices/ipad.png differ diff --git a/resources/images/devices/itunes.png b/resources/images/devices/itunes.png new file mode 100644 index 0000000000..cd8579d492 Binary files /dev/null and b/resources/images/devices/itunes.png differ diff --git a/resources/images/dialog_information.svg b/resources/images/dialog_information.svg index 995f74cd78..1c3d34add1 100644 --- a/resources/images/dialog_information.svg +++ b/resources/images/dialog_information.svg @@ -1752,7 +1752,7 @@ sodipodi:cy="93.331604" sodipodi:cx="-166.53223" id="path6082" - style="opacity:1;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter6074)" + style="opacity:1;fill:url(#radialGradient6084);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter6074)" sodipodi:type="arc" /> - - + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/edit_copy.svg b/resources/images/edit_copy.svg new file mode 100644 index 0000000000..86e1adbc3f --- /dev/null +++ b/resources/images/edit_copy.svg @@ -0,0 +1,4298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/edit_input.svg b/resources/images/edit_input.svg index a2d8bc96e2..54200503e2 100644 --- a/resources/images/edit_input.svg +++ b/resources/images/edit_input.svg @@ -1,1071 +1,77 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - Oxygen team - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="249.46899" + height="257.47101" + viewBox="0 0 249.469 257.471" + enable-background="new 0 0 595.279 841.89" + xml:space="preserve" + inkscape:version="0.47 r22583" + sodipodi:docname="edit_input.svg">image/svg+xml + + + + + + + \ No newline at end of file diff --git a/resources/images/help.svg b/resources/images/help.svg new file mode 100644 index 0000000000..be41385b7d --- /dev/null +++ b/resources/images/help.svg @@ -0,0 +1,269 @@ + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/news.svg b/resources/images/news.svg index 38016738f5..e4a1b1832a 100644 --- a/resources/images/news.svg +++ b/resources/images/news.svg @@ -1,2826 +1,94 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - Oxygen team - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="134.77701" + height="199.99901" + viewBox="0 0 134.777 199.999" + enable-background="new 0 0 595.28 841.89" + xml:space="preserve" + inkscape:version="0.47 r22583" + sodipodi:docname="news.svg">image/svg+xml + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/news/alo_novine.png b/resources/images/news/alo_novine.png new file mode 100644 index 0000000000..569ea16fce Binary files /dev/null and b/resources/images/news/alo_novine.png differ diff --git a/resources/images/news/evz.ro.png b/resources/images/news/evz.ro.png new file mode 100644 index 0000000000..c0549185bc Binary files /dev/null and b/resources/images/news/evz.ro.png differ diff --git a/resources/images/news/haaretz.png b/resources/images/news/haaretz.png new file mode 100644 index 0000000000..e6cb02c3b6 Binary files /dev/null and b/resources/images/news/haaretz.png differ diff --git a/resources/images/news/lrb.png b/resources/images/news/lrb.png new file mode 100644 index 0000000000..da966d6a1a Binary files /dev/null and b/resources/images/news/lrb.png differ diff --git a/resources/images/news/lrb_payed.png b/resources/images/news/lrb_payed.png new file mode 100644 index 0000000000..da966d6a1a Binary files /dev/null and b/resources/images/news/lrb_payed.png differ diff --git a/resources/images/save.svg b/resources/images/save.svg index af62235cfc..14a431e60a 100644 --- a/resources/images/save.svg +++ b/resources/images/save.svg @@ -1,1961 +1,124 @@ - + + image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + inkscape:window-y="41" + inkscape:window-maximized="0" + inkscape:current-layer="Layer_1" /> + + - - - - - - - - - - - - - - - - - - - - - - - - - - + d="m 355.763,325.697 h -116.49 c -4.664,0 -8.445,3.782 -8.445,8.446 V 512.22 c 0,4.664 3.781,8.446 8.445,8.446 h 116.489 c 4.665,0 8.446,-3.782 8.446,-8.446 V 334.144 c 10e-4,-4.665 -3.78,-8.447 -8.445,-8.447 z m -106.283,19.004 59.827,-2.111 c 0,39.416 -58.068,57.364 -59.827,57.364 -1.759,0 0,-55.253 0,-55.253 z m -7.742,166.112 c -1.945,0 -3.521,-1.576 -3.521,-3.52 0,-1.944 1.575,-3.52 3.521,-3.52 1.942,0 3.519,1.575 3.519,3.52 0,1.944 -1.576,3.52 -3.519,3.52 z m 0,-84.112 c -1.945,0 -3.521,-1.575 -3.521,-3.519 0,-1.944 1.575,-3.52 3.521,-3.52 1.942,0 3.519,1.575 3.519,3.52 0,1.944 -1.576,3.519 -3.519,3.519 z m 0,-84.111 c -1.945,0 -3.521,-1.576 -3.521,-3.519 0,-1.944 1.575,-3.52 3.521,-3.52 1.942,0 3.519,1.576 3.519,3.52 0,1.943 -1.576,3.519 -3.519,3.519 z m 56.23,164.704 c -27.212,0 -49.271,-22.06 -49.271,-49.271 0,-26.822 21.438,-48.623 48.112,-49.241 24.819,-21.405 30.446,-63.729 30.446,-63.729 h 14.43 v 90.254 c 3.54,6.799 5.553,14.521 5.553,22.716 0,27.211 -22.058,49.271 -49.27,49.271 z m 55.332,3.519 c -1.944,0 -3.521,-1.576 -3.521,-3.52 0,-1.944 1.576,-3.52 3.521,-3.52 1.943,0 3.519,1.575 3.519,3.52 -0.001,1.944 -1.576,3.52 -3.519,3.52 z m 0,-84.112 c -1.944,0 -3.521,-1.575 -3.521,-3.519 0,-1.944 1.576,-3.52 3.521,-3.52 1.943,0 3.519,1.575 3.519,3.52 -0.001,1.944 -1.576,3.519 -3.519,3.519 z m 0,-84.111 c -1.944,0 -3.521,-1.576 -3.521,-3.519 0,-1.944 1.576,-3.52 3.521,-3.52 1.943,0 3.519,1.576 3.519,3.52 -0.001,1.943 -1.576,3.519 -3.519,3.519 z" + id="path7" + style="fill:#ffffff" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - + cx="297.96799" + cy="458.02301" + r="19.356001" + id="circle9" + sodipodi:cx="297.96799" + sodipodi:cy="458.02301" + sodipodi:rx="19.356001" + sodipodi:ry="19.356001" + style="fill:#ffffff" + d="m 317.32399,458.02301 c 0,10.69002 -8.66598,19.356 -19.356,19.356 -10.69003,0 -19.356,-8.66598 -19.356,-19.356 0,-10.69002 8.66597,-19.356 19.356,-19.356 10.69002,0 19.356,8.66598 19.356,19.356 z" /> + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/sync.svg b/resources/images/sync.svg index 93dc8ef5fb..5055d530ea 100644 --- a/resources/images/sync.svg +++ b/resources/images/sync.svg @@ -1,1515 +1,77 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="148.90399" + height="202.65399" + viewBox="0 0 148.90399 202.65399" + enable-background="new 0 0 595.279 841.89" + xml:space="preserve" + inkscape:version="0.47 r22583" + sodipodi:docname="sync.svg">image/svg+xml + + + + + + + \ No newline at end of file diff --git a/resources/images/trash.svg b/resources/images/trash.svg index 1ff9c4d874..15e10441fd 100644 --- a/resources/images/trash.svg +++ b/resources/images/trash.svg @@ -1,2442 +1,215 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="192.6368" + height="199.16716" + viewBox="0 0 192.63679 199.16716" + enable-background="new 0 0 595.28 841.89" + xml:space="preserve" + inkscape:version="0.47 r22583" + sodipodi:docname="trash.svg">image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/view.svg b/resources/images/view.svg index 7bdbb392dc..f0b0e1ef6c 100644 --- a/resources/images/view.svg +++ b/resources/images/view.svg @@ -1,2071 +1,32 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - Oxygen team - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/quick_start.epub b/resources/quick_start.epub index 7dd8d7e91c..589fd1d0dc 100644 Binary files a/resources/quick_start.epub and b/resources/quick_start.epub differ diff --git a/resources/recipes/akter.recipe b/resources/recipes/akter.recipe index 3959fff717..0f2fb05640 100644 --- a/resources/recipes/akter.recipe +++ b/resources/recipes/akter.recipe @@ -15,7 +15,7 @@ class Akter(BasicNewsRecipe): category = 'vesti, online vesti, najnovije vesti, politika, sport, ekonomija, biznis, finansije, berza, kultura, zivot, putovanja, auto, automobili, tehnologija, politicki magazin, dogadjaji, desavanja, lifestyle, zdravlje, zdravstvo, vest, novine, nedeljnik, srbija, novi sad, vojvodina, svet, drustvo, zabava, republika srpska, beograd, intervju, komentar, reportaza, arhiva vesti, news, serbia, politics' oldest_article = 8 max_articles_per_feed = 100 - no_stylesheets = False + no_stylesheets = True use_embedded_content = False encoding = 'utf-8' masthead_url = 'http://www.akter.co.rs/templates/gk_thenews2/images/style2/logo.png' @@ -23,9 +23,9 @@ class Akter(BasicNewsRecipe): publication_type = 'magazine' remove_empty_feeds = True PREFIX = 'http://www.akter.co.rs' - extra_css = """ @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} + extra_css = """ @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} - .article_description,body,.lokacija{font-family: Arial,Helvetica,sans1,sans-serif} + .article_description,body{font-family: Arial,Helvetica,sans1,sans-serif} .color-2{display:block; margin-bottom: 10px; padding: 5px, 10px; border-left: 1px solid #D00000; color: #D00000} img{margin-bottom: 0.8em} """ diff --git a/resources/recipes/alo_novine.recipe b/resources/recipes/alo_novine.recipe new file mode 100644 index 0000000000..45e53e99e8 --- /dev/null +++ b/resources/recipes/alo_novine.recipe @@ -0,0 +1,65 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' + +''' +www.alo.rs +''' + +import re +from calibre.web.feeds.recipes import BasicNewsRecipe + +class Alo_Novine(BasicNewsRecipe): + title = 'Alo!' + __author__ = 'Darko Miletic' + description = "News Portal from Serbia" + publisher = 'Alo novine d.o.o.' + category = 'news, politics, Serbia' + oldest_article = 2 + max_articles_per_feed = 100 + delay = 4 + no_stylesheets = True + encoding = 'utf-8' + use_embedded_content = False + language = 'sr' + extra_css = """ + @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} + .article_description,body{font-family: Arial,Helvetica,sans1,sans-serif} + .lead {font-size: 1.3em} + h1{color: #DB0700} + .article_uvod{font-style: italic; font-size: 1.2em} + img{margin-bottom: 0.8em} """ + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher': publisher + , 'language' : language + } + + preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')] + + remove_tags = [dict(name=['object','link','embed'])] + remove_attributes = ['height','width'] + + feeds = [ + (u'Najnovije Vijesti', u'http://www.alo.rs/rss/danasnje_vesti') + ,(u'Politika' , u'http://www.alo.rs/rss/politika') + ,(u'Vesti' , u'http://www.alo.rs/rss/vesti') + ,(u'Sport' , u'http://www.alo.rs/rss/sport') + ,(u'Ljudi' , u'http://www.alo.rs/rss/ljudi') + ,(u'Saveti' , u'http://www.alo.rs/rss/saveti') + ] + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + return soup + + def print_version(self, url): + artl = url.rpartition('/')[0] + artid = artl.rpartition('/')[2] + return 'http://www.alo.rs/resources/templates/tools/print.php?id=' + artid + + def image_url_processor(self, baseurl, url): + return url.replace('alo.rs//','alo.rs/') + diff --git a/resources/recipes/anchorage_daily.recipe b/resources/recipes/anchorage_daily.recipe new file mode 100644 index 0000000000..4ce2f13a14 --- /dev/null +++ b/resources/recipes/anchorage_daily.recipe @@ -0,0 +1,40 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1278347258(BasicNewsRecipe): + title = u'Anchorage Daily News' + __author__ = 'rty' + oldest_article = 7 + max_articles_per_feed = 100 + + feeds = [(u'Alaska News', u'http://www.adn.com/news/alaska/index.xml'), + (u'Business', u'http://www.adn.com/money/index.xml'), + (u'Sports', u'http://www.adn.com/sports/index.xml'), + (u'Politics', u'http://www.adn.com/politics/index.xml'), + (u'Lifestyles', u'http://www.adn.com/life/index.xml'), + (u'Iditarod', u'http://www.adn.com/iditarod/index.xml') + ] + description = ''''Alaska's Newspaper''' + publisher = 'http://www.adn.com' + category = 'news, Alaska, Anchorage' + language = 'en' + extra_css = ''' + p{font-weight: normal;text-align: justify} + ''' + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + language = 'en' + encoding = 'latin-1' + conversion_options = {'linearize_tables':True} + masthead_url = 'http://media.adn.com/includes/assets/images/adn_logo.2.gif' + + keep_only_tags = [ + dict(name='div', attrs={'class':'left_col story_mainbar'}), + ] + remove_tags = [ + dict(name='div', attrs={'class':'story_tools'}), + dict(name='p', attrs={'class':'ad_label'}), + ] + remove_tags_after = [ + dict(name='div', attrs={'class':'advertisement'}), + ] diff --git a/resources/recipes/auto_prove.recipe b/resources/recipes/auto_prove.recipe new file mode 100644 index 0000000000..109f104206 --- /dev/null +++ b/resources/recipes/auto_prove.recipe @@ -0,0 +1,90 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__author__ = 'GabrieleMarini, based on Darko Miletic' +__copyright__ = '2009, Darko Miletic , Gabriele Marini' +__version__ = 'v1.02 Marini Gabriele ' +__date__ = '10, January 2010' +__description__ = 'Italian daily newspaper' + +''' +http://www.corrieredellosport.it/ +''' +from calibre.web.feeds.news import BasicNewsRecipe + +class AutoPR(BasicNewsRecipe): + __author__ = 'Gabriele Marini' + description = 'Auto and Formula 1' + + cover_url = 'http://www.auto.it/res/imgs/logo_Auto.png' + + + title = u'Auto Prove' + publisher = 'CONTE Editore' + category = 'Sport' + + language = 'it' + timefmt = '[%a, %d %b, %Y]' + + oldest_article = 60 + max_articles_per_feed = 20 + use_embedded_content = False + recursion = 100 + + remove_javascript = True + no_stylesheets = True + + #html2lrf_options = [ + # '--comment', description + # , '--category', category + # , '--publisher', publisher + # , '--ignore-tables' + # ] + + #html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"\nlinearize_tables=True' + + keep_only_tags = [ + dict(name='h2', attrs={'class':['tit_Article y_Txt']}), + dict(name='h2', attrs={'class':['tit_Article']}), + dict(name='div', attrs={'class':['box_Img newsdet_new ']}), + dict(name='div', attrs={'class':['box_Img newsdet_as ']}), + dict(name='table', attrs={'class':['table_A']}), + dict(name='div', attrs={'class':['txt_Article txtBox_cms']}), + dict(name='testoscheda')] + + def parse_index(self): + feeds = [] + for title, url in [ + ("Prove su Strada" , "http://www.auto.it/rss/prove+6.xml") + ]: + soup = self.index_to_soup(url) + soup = soup.find('channel') + print soup + + for article in soup.findAllNext('item'): + title = self.tag_to_string(article.title) + date = self.tag_to_string(article.pubDate) + description = self.tag_to_string(article.description) + link = self.tag_to_string(article.guid) +# print article + articles = self.create_links_append(link, date, description) + if articles: + feeds.append((title, articles)) + return feeds + + def create_links_append(self, link, date, description): + current_articles = [] + + current_articles.append({'title': 'Generale', 'url': link,'description':description, 'date':date}), + current_articles.append({'title': 'Design', 'url': link.replace('scheda','design'),'description':'scheda', 'date':''}), + current_articles.append({'title': 'Interni', 'url': link.replace('scheda','interni'),'description':'Interni', 'date':''}), + current_articles.append({'title': 'Tecnica', 'url': link.replace('scheda','tecnica'),'description':'Tecnica', 'date':''}), + current_articles.append({'title': 'Su Strada', 'url': link.replace('scheda','su_strada'),'description':'Su Strada', 'date':''}), + current_articles.append({'title': 'Pagella', 'url': link.replace('scheda','pagella'),'description':'Pagella', 'date':''}), + current_articles.append({'title': 'Rilevamenti', 'url': link.replace('scheda','telemetria'),'description':'Rilevamenti', 'date':''}) + + return current_articles + + + + + diff --git a/resources/recipes/bbc_chinese.recipe b/resources/recipes/bbc_chinese.recipe new file mode 100644 index 0000000000..e2bff81b90 --- /dev/null +++ b/resources/recipes/bbc_chinese.recipe @@ -0,0 +1,39 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1277443634(BasicNewsRecipe): + title = u'BBC Chinese' + oldest_article = 7 + max_articles_per_feed = 100 + + feeds = [ + (u'\u4e3b\u9875', u'http://www.bbc.co.uk/zhongwen/simp/index.xml'), + (u'\u56fd\u9645\u65b0\u95fb', u'http://www.bbc.co.uk/zhongwen/simp/world/index.xml'), + (u'\u4e24\u5cb8\u4e09\u5730', u'http://www.bbc.co.uk/zhongwen/simp/china/index.xml'), + (u'\u91d1\u878d\u8d22\u7ecf', u'http://www.bbc.co.uk/zhongwen/simp/business/index.xml'), + (u'\u7f51\u4e0a\u4e92\u52a8', u'http://www.bbc.co.uk/zhongwen/simp/interactive/index.xml'), + (u'\u97f3\u89c6\u56fe\u7247', u'http://www.bbc.co.uk/zhongwen/simp/multimedia/index.xml'), + (u'\u5206\u6790\u8bc4\u8bba', u'http://www.bbc.co.uk/zhongwen/simp/indepth/index.xml') + ] + extra_css = ''' + @font-face {font-family: "DroidFont", serif, sans-serif; src: url(res:///system/fonts/DroidSansFallback.ttf); }\n + body {margin-right: 8pt; font-family: 'DroidFont', serif;}\n + h1 {font-family: 'DroidFont', serif;}\n + .articledescription {font-family: 'DroidFont', serif;} + ''' + __author__ = 'rty' + __version__ = '1.0' + language = 'zh' + pubisher = 'British Broadcasting Corporation' + description = 'BBC news in Chinese' + category = 'News, Chinese' + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + encoding = 'UTF-8' + conversion_options = {'linearize_tables':True} + masthead_url = 'http://wscdn.bbc.co.uk/zhongwen/simp/images/1024/brand.jpg' + keep_only_tags = [ + dict(name='h1'), + dict(name='p', attrs={'class':['primary-topic','summary']}), + dict(name='div', attrs={'class':['bodytext','datestamp']}), + ] diff --git a/resources/recipes/big_oven.recipe b/resources/recipes/big_oven.recipe new file mode 100644 index 0000000000..e1636daf72 --- /dev/null +++ b/resources/recipes/big_oven.recipe @@ -0,0 +1,64 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class BigOven(BasicNewsRecipe): + title = 'BigOven' + __author__ = 'Starson17' + description = 'Recipes for the Foodie in us all. Registration is free. A fake username and password just gives smaller photos.' + language = 'en' + category = 'news, food, recipes, gourmet' + publisher = 'Starson17' + use_embedded_content= False + no_stylesheets = True + oldest_article = 24 + remove_javascript = True + remove_empty_feeds = True + cover_url = 'http://www.software.com/images/products/BigOven%20Logo_177_216.JPG' + max_articles_per_feed = 30 + needs_subscription = True + + conversion_options = {'linearize_tables' : True + , 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + + def get_browser(self): + br = BasicNewsRecipe.get_browser() + if self.username is not None and self.password is not None: + br.open('http://www.bigoven.com/') + br.select_form(name='form1') + br['TopMenu_bo1$email'] = self.username + br['TopMenu_bo1$password'] = self.password + br.submit() + return br + + remove_attributes = ['style', 'font'] + + keep_only_tags = [dict(name='h1') + ,dict(name='div', attrs={'class':'img'}) + ,dict(name='div', attrs={'id':'intro'}) + ] + + remove_tags = [dict(name='div', attrs={'style':["overflow: visible;"]}) + ,dict(name='div', attrs={'class':['ctas']}) + #,dict(name='a', attrs={'class':['edit']}) + ,dict(name='p', attrs={'class':['byline']}) + ] + + feeds = [(u'4 & 5 Star Rated Recipes', u'http://feeds.feedburner.com/Bigovencom-RecipeRaves?format=xml')] + + def preprocess_html(self, soup): + for tag in soup.findAll(name='a', attrs={'class':['edit']}): + tag.parent.extract() + for tag in soup.findAll(name='a', attrs={'class':['deflink']}): + tag.replaceWith(tag.string) + return soup + + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:medium;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + diff --git a/resources/recipes/china_economic_net.recipe b/resources/recipes/china_economic_net.recipe new file mode 100644 index 0000000000..825ea007c2 --- /dev/null +++ b/resources/recipes/china_economic_net.recipe @@ -0,0 +1,39 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1278162597(BasicNewsRecipe): + __author__ = 'rty' + title = u'China Economic Net' + oldest_article = 7 + max_articles_per_feed = 100 + + pubisher = 'www.ce.cn - China Economic net - Beijing' + description = 'China Economic Net Magazine' + category = 'Economic News Magazine, Chinese, China' + feeds = [ + (u'Stock Market 股市', u'http://finance.ce.cn/stock/index_6304.xml'), + (u'Money 理财', u'http://finance.ce.cn/money/index_6301.xml'), + (u'Health 健康', u'http://www.ce.cn/health/index_6294.xml'), + (u'Technology 科技', u'http://sci.ce.cn/mainpage/index_6307.xml'), + (u'Domestic Politics 国内时政', u'http://www.ce.cn/xwzx/gnsz/index_6273.xml') + ] + masthead_url = 'http://finance.ce.cn/images/08mdy_logo.gif' + extra_css = ''' + @font-face {font-family: "DroidFont", serif, sans-serif; src: url(res:///system/fonts/DroidSansFallback.ttf); }\n + body {margin-right: 8pt; font-family: 'DroidFont', serif;}\n + h1 {font-family: 'DroidFont', serif;}\n + .articledescription {font-family: 'DroidFont', serif;} + ''' + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + language = 'zh-cn' + encoding = 'gb2312' + conversion_options = {'linearize_tables':True} + + + keep_only_tags = [ + + dict(name='h1', attrs={'id':'articleTitle'}), + dict(name='div', attrs={'class':'laiyuan'}), + dict(name='div', attrs={'id':'articleText'}), + ] diff --git a/resources/recipes/china_press.recipe b/resources/recipes/china_press.recipe new file mode 100644 index 0000000000..502ebfd41c --- /dev/null +++ b/resources/recipes/china_press.recipe @@ -0,0 +1,71 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1277228948(BasicNewsRecipe): + title = u'China Press USA' + oldest_article = 7 + max_articles_per_feed = 100 + + __author__ = 'rty' + __version__ = '1.0' + language = 'zh' + pubisher = 'www.chinapressusa.com' + description = 'Overseas Chinese Network Newspaper in the USA' + category = 'News in Chinese, USA' + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + #encoding = 'GB2312' + encoding = 'UTF-8' + conversion_options = {'linearize_tables':True} + masthead_url ='http://www.chinapressusa.com/common/images/logo.gif' + extra_css = ''' + @font-face { font-family: "DroidFont", serif, sans-serif; src: url(res:///system/fonts/DroidSansFallback.ttf); }\n + body { + margin-right: 8pt; + font-family: 'DroidFont', serif;} + h1 {font-family: 'DroidFont', serif, sans-serif} + .show {font-family: 'DroidFont', serif, sans-serif} + ''' + feeds = [ + (u'\u65b0\u95fb\u9891\u9053', u'http://news.uschinapress.com/news.xml'), + (u'\u534e\u4eba\u9891\u9053', u'http://chinese.uschinapress.com/chinese.xml'), + (u'\u8bc4\u8bba\u9891\u9053', u'http://review.uschinapress.com/review.xml'), + ] + keep_only_tags = [ + dict(name='div', attrs={'class':'show'}), + ] + remove_tags = [ + # dict(name='table', attrs={'class':'xle'}), + dict(name='div', attrs={'class':'time'}), + ] + remove_tags_after = [ + dict(name='div', attrs={'class':'bank17'}), + # dict(name='a', attrs={'class':'ab12'}), + ] + + + def append_page(self, soup, appendtag, position): + pager = soup.find('div',attrs={'id':'displaypagenum'}) + if pager: + nexturl = self.INDEX + pager.a['href'] + soup2 = self.index_to_soup(nexturl) + texttag = soup2.find('div', attrs={'class':'show'}) + for it in texttag.findAll(style=True): + del it['style'] + newpos = len(texttag.contents) + self.append_page(soup2,texttag,newpos) + texttag.extract() + appendtag.insert(position,texttag) + + + def preprocess_html(self, soup): + mtag = '\n' + soup.head.insert(0,mtag) + + for item in soup.findAll(style=True): + del item['style'] + self.append_page(soup, soup.body, 3) + pager = soup.find('div',attrs={'id':'displaypagenum'}) + if pager: + pager.extract() + return soup diff --git a/resources/recipes/editor_and_publisher.recipe b/resources/recipes/editor_and_publisher.recipe index c8f287a0c7..0ec5c59d74 100644 --- a/resources/recipes/editor_and_publisher.recipe +++ b/resources/recipes/editor_and_publisher.recipe @@ -1,14 +1,29 @@ -import re +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2010 elsuave' + from calibre.web.feeds.news import BasicNewsRecipe class EandP(BasicNewsRecipe): title = u'Editor and Publisher' - __author__ = u'Xanthan Gum' + __author__ = u'elsuave (modified from Xanthan Gum)' description = 'News about newspapers and journalism.' + publisher = 'Editor and Publisher' + category = 'news, journalism, industry' language = 'en' - no_stylesheets = True + max_articles_per_feed = 25 + no_stylesheets = True + use_embedded_content = False + encoding = 'utf8' + cover_url = 'http://www.editorandpublisher.com/images/EP_main_logo.gif' + remove_javascript = True - oldest_article = 7 - max_articles_per_feed = 100 + html2lrf_options = [ + '--comment', description + , '--category', category + , '--publisher', publisher + ] + + html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"' # Font formatting code borrowed from kwetal @@ -18,17 +33,21 @@ class EandP(BasicNewsRecipe): h2{font-size: large;} ''' - # Delete everything before the article + # Keep only div:itemmgap - remove_tags_before = dict(name='font', attrs={'class':'titlebar_black'}) + keep_only_tags = [ + dict(name='div', attrs={'class':'itemmgap'}) + ] - # Delete everything after the article + # Remove commenting/social media lins - preprocess_regexps = [(re.compile(r'.*', re.DOTALL|re.IGNORECASE), - lambda match: ''),] + remove_tags_after = [dict(name='div', attrs={'class':'clear'})] + + + feeds = [(u'Breaking News', u'http://www.editorandpublisher.com/GenerateRssFeed.aspx'), + (u'Business News', u'http://www.editorandpublisher.com/GenerateRssFeed.aspx?CategoryId=2'), + (u'Ad/Circ News', u'http://www.editorandpublisher.com/GenerateRssFeed.aspx?CategoryId=3'), + (u'Newsroom', u'http://www.editorandpublisher.com/GenerateRssFeed.aspx?CategoryId=4'), + (u'Technology News', u'http://www.editorandpublisher.com/GenerateRssFeed.aspx?CategoryId=5'), + (u'Syndicates News', u'http://www.editorandpublisher.com/GenerateRssFeed.aspx?CategoryId=7')] - feeds = [(u'Breaking News', u'http://feeds.feedburner.com/EditorAndPublisher-BreakingNews'), - (u'Business News', u'http://feeds.feedburner.com/EditorAndPublisher-BusinessNews'), - (u'Newsroom', u'http://feeds.feedburner.com/EditorAndPublisher-Newsroom'), - (u'Technology News', u'http://feeds.feedburner.com/EditorAndPublisher-Technology'), - (u'Syndicates News', u'http://feeds.feedburner.com/EditorAndPublisher-Syndicates')] diff --git a/resources/recipes/estadao.recipe b/resources/recipes/estadao.recipe index e42eb0574d..4e520c1135 100644 --- a/resources/recipes/estadao.recipe +++ b/resources/recipes/estadao.recipe @@ -1,7 +1,7 @@ #!/usr/bin/env python __license__ = 'GPL v3' -__copyright__ = '2009, Darko Miletic ' +__copyright__ = '2010, elsuave' ''' estadao.com.br ''' @@ -10,12 +10,12 @@ from calibre.web.feeds.news import BasicNewsRecipe class Estadao(BasicNewsRecipe): title = 'O Estado de S. Paulo' - __author__ = 'Darko Miletic' + __author__ = 'elsuave (modified from Darko Miletic)' description = 'News from Brasil in Portuguese' publisher = 'O Estado de S. Paulo' category = 'news, politics, Brasil' oldest_article = 2 - max_articles_per_feed = 100 + max_articles_per_feed = 25 no_stylesheets = True use_embedded_content = False encoding = 'utf8' @@ -30,13 +30,14 @@ class Estadao(BasicNewsRecipe): html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"' - keep_only_tags = [dict(name='div', attrs={'id':'c1'})] + keep_only_tags = [ + dict(name='div', attrs={'class':['bb-md-noticia','c5']}) + ] remove_tags = [ dict(name=['script','object','form','ul']) - ,dict(name='div', attrs={'id':['votacao','estadaohoje']}) - ,dict(name='p', attrs={'id':'ctrl_texto'}) - ,dict(name='p', attrs={'class':'texto'}) + ,dict(name='div', attrs={'class':['fnt2 Color_04 bold','right fnt2 innerTop15 dvTmFont','™_01 right outerLeft15','tituloBox','tags']}) + ,dict(name='div', attrs={'id':['bb-md-noticia-subcom']}) ] feeds = [ @@ -51,13 +52,12 @@ class Estadao(BasicNewsRecipe): ,(u'Vida &', u'http://www.estadao.com.br/rss/vidae.xml') ] - def preprocess_html(self, soup): - ifr = soup.find('iframe') - if ifr: - ifr.extract() - for item in soup.findAll(style=True): - del item['style'] - return soup + language = 'pt' + def get_article_url(self, article): + url = BasicNewsRecipe.get_article_url(self, article) + if '/Multimidia/' not in url: + return url + diff --git a/resources/recipes/evz.ro.recipe b/resources/recipes/evz.ro.recipe new file mode 100644 index 0000000000..bce151d1fc --- /dev/null +++ b/resources/recipes/evz.ro.recipe @@ -0,0 +1,52 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +evz.ro +''' + +import re +from calibre.web.feeds.news import BasicNewsRecipe + +class EVZ_Ro(BasicNewsRecipe): + title = 'evz.ro' + __author__ = 'Darko Miletic' + description = 'News from Romania' + publisher = 'evz.ro' + category = 'news, politics, Romania' + oldest_article = 2 + max_articles_per_feed = 200 + no_stylesheets = True + encoding = 'utf8' + use_embedded_content = False + language = 'ro' + masthead_url = 'http://www.evz.ro/fileadmin/images/logo.gif' + extra_css = ' body{font-family: Georgia,Arial,Helvetica,sans-serif } .firstP{font-size: 1.125em} .author,.articleInfo{font-size: small} ' + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + + preprocess_regexps = [ + (re.compile(r'.*?', re.DOTALL|re.IGNORECASE),lambda match: '<head><title>') + ,(re.compile(r'.*?', re.DOTALL|re.IGNORECASE),lambda match: '') + ] + + remove_tags = [ + dict(name=['form','embed','iframe','object','base','link','script','noscript']) + ,dict(attrs={'class':['section','statsInfo','email il']}) + ,dict(attrs={'id' :'gallery'}) + ] + + remove_tags_after = dict(attrs={'class':'section'}) + keep_only_tags = [dict(attrs={'class':'single'})] + remove_attributes = ['height','width'] + + feeds = [(u'Articles', u'http://www.evz.ro/rss.xml')] + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + return soup diff --git a/resources/recipes/forbes_india.recipe b/resources/recipes/forbes_india.recipe new file mode 100644 index 0000000000..8567f896b5 --- /dev/null +++ b/resources/recipes/forbes_india.recipe @@ -0,0 +1,55 @@ +from calibre.ptempfile import PersistentTemporaryFile +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1276934715(BasicNewsRecipe): + title = u'Forbes India' + __author__ = 'rty' + description = 'India Edition Forbes' + publisher = 'Forbes India' + category = 'Business News, Economy, India' + oldest_article = 7 + max_articles_per_feed = 100 + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + language = 'en_IN' + temp_files = [] + articles_are_obfuscated = True + conversion_options = {'linearize_tables':True} + feeds = [ + (u'Contents', u'http://business.in.com/rssfeed/rss_all.xml'), + ] + extra_css = ''' + .t-10-gy-l{font-style: italic; font-size: small} + .t-30-b-d{font-weight: bold; font-size: xx-large} + .t-16-gy-l{font-weight: bold; font-size: x-large; font-syle: italic} + .storycontent{font-size: 4px;font-family: Times New Roman;} + ''' + + remove_tags_before = dict(name='div', attrs={'class':'pdl10 pdr15'}) + + + def get_obfuscated_article(self, url): + br = self.get_browser() + br.open(url) + response = br.follow_link(url_regex = r'/printcontent/[0-9]+', nr = 0) + html = response.read() + self.temp_files.append(PersistentTemporaryFile('_fa.html')) + self.temp_files[-1].write(html) + self.temp_files[-1].close() + return self.temp_files[-1].name + + def get_cover_url(self): + index = 'http://business.in.com/magazine/' + soup = self.index_to_soup(index) + for image in soup.findAll('a',{ "class" : "lbOn a-9-b-d" }): + return image['href'] + #return image['href'] + '.jpg' + return None + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + for item in soup.findAll(width=True): + del item['width'] + return soup diff --git a/resources/recipes/foreign_policy.recipe b/resources/recipes/foreign_policy.recipe new file mode 100644 index 0000000000..0d6f9984fd --- /dev/null +++ b/resources/recipes/foreign_policy.recipe @@ -0,0 +1,45 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +www.foreignpolicy.com +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class ForeignPolicy(BasicNewsRecipe): + title = 'Foreign Policy' + __author__ = 'Darko Miletic' + description = 'International News' + publisher = 'Washingtonpost.Newsweek Interactive, LLC' + category = 'news, politics, USA' + oldest_article = 31 + max_articles_per_feed = 200 + no_stylesheets = True + encoding = 'utf8' + use_embedded_content = False + language = 'en' + remove_empty_feeds = True + extra_css = ' body{font-family: Georgia,"Times New Roman",Times,serif } img{margin-bottom: 0.4em} h1,h2,h3,h4,h5,h6{font-family: Arial,Helvetica,sans-serif} ' + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + + keep_only_tags = [dict(attrs={'id':['art-mast','art-body','auth-bio']})] + remove_tags = [dict(name='iframe'),dict(attrs={'id':['share-box','base-ad']})] + remove_attributes = ['height','width'] + + + feeds = [(u'Articles', u'http://www.foreignpolicy.com/node/feed')] + + def print_version(self, url): + return url + '?print=yes&page=full' + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + return soup + diff --git a/resources/recipes/haaretz_en.recipe b/resources/recipes/haaretz_en.recipe index 4df6b45a3e..4404624aff 100644 --- a/resources/recipes/haaretz_en.recipe +++ b/resources/recipes/haaretz_en.recipe @@ -1,56 +1,95 @@ __license__ = 'GPL v3' __copyright__ = '2010, Darko Miletic ' ''' -haaretz.com +www.haaretz.com ''' +import re +from calibre import strftime +from time import gmtime from calibre.web.feeds.news import BasicNewsRecipe -class Haaretz_en(BasicNewsRecipe): - title = 'Haaretz in English' +class HaaretzPrint_en(BasicNewsRecipe): + title = 'Haaretz - print edition' __author__ = 'Darko Miletic' - description = 'Haaretz.com, the online edition of Haaretz Newspaper in Israel, and analysis from Israel and the Middle East. Haaretz.com provides extensive and in-depth coverage of Israel, the Jewish World and the Middle East, including defense, diplomacy, the Arab-Israeli conflict, the peace process, Israeli politics, Jerusalem affairs, international relations, Iran, Iraq, Syria, Lebanon, the Palestinian Authority, the West Bank and the Gaza Strip, the Israeli business world and Jewish life in Israel and the Diaspora. ' - publisher = 'haaretz.com' - category = 'news, politics, Israel' + description = "Haaretz.com is the world's leading English-language Website for real-time news and analysis of Israel and the Middle East." + publisher = 'Haaretz' + category = "news, Haaretz, Israel news, Israel newspapers, Israel business news, Israel financial news, Israeli news,Israeli newspaper, Israeli newspapers, news from Israel, news in Israel, news Israel, news on Israel, newspaper Israel, Israel sports news, Israel diplomacy news" oldest_article = 2 max_articles_per_feed = 200 no_stylesheets = True - encoding = 'cp1252' + encoding = 'utf8' use_embedded_content = False language = 'en_IL' publication_type = 'newspaper' - remove_empty_feeds = True - masthead_url = 'http://www.haaretz.com/images/logos/logoGrey.gif' + PREFIX = 'http://www.haaretz.com' + masthead_url = PREFIX + '/images/logos/logoGrey.gif' extra_css = ' body{font-family: Verdana,Arial,Helvetica,sans-serif } ' + preprocess_regexps = [(re.compile(r'.*?', re.DOTALL|re.IGNORECASE),lambda match: '')] + conversion_options = { - 'comment' : description - , 'tags' : category - , 'publisher' : publisher - , 'language' : language + 'comment' : description + , 'tags' : category + , 'publisher': publisher + , 'language' : language } - remove_tags = [dict(name='div', attrs={'class':['rightcol']}),dict(name='table')] - remove_tags_before = dict(name='h1') - remove_tags_after = dict(attrs={'id':'innerArticle'}) - keep_only_tags = [dict(attrs={'id':'content'})] + keep_only_tags = [dict(attrs={'id':'threecolumns'})] + remove_attributes = ['width','height'] + remove_tags = [ + dict(name=['iframe','link','object','embed']) + ,dict(name='div',attrs={'class':'rightcol'}) + ] feeds = [ - (u'Opinion' , u'http://www.haaretz.com/cmlink/opinion-rss-1.209234?localLinksEnabled=false' ) - ,(u'Defense and diplomacy' , u'http://www.haaretz.com/cmlink/defense-and-diplomacy-rss-1.208894?localLinksEnabled=false') - ,(u'National' , u'http://www.haaretz.com/cmlink/national-rss-1.208896?localLinksEnabled=false' ) - ,(u'International' , u'http://www.haaretz.com/cmlink/international-rss-1.208898?localLinksEnabled=false' ) - ,(u'Jewish World' , u'http://www.haaretz.com/cmlink/jewish-world-rss-1.209085?localLinksEnabled=false' ) - ,(u'Business' , u'http://www.haaretz.com/cmlink/business-print-rss-1.264904?localLinksEnabled=false' ) - ,(u'Real Estate' , u'http://www.haaretz.com/cmlink/real-estate-print-rss-1.264977?localLinksEnabled=false' ) - ,(u'Features' , u'http://www.haaretz.com/cmlink/features-print-rss-1.264912?localLinksEnabled=false' ) - ,(u'Arts and leisure' , u'http://www.haaretz.com/cmlink/arts-and-leisure-rss-1.286090?localLinksEnabled=false' ) - ,(u'Books' , u'http://www.haaretz.com/cmlink/books-rss-1.264947?localLinksEnabled=false' ) - ,(u'Food and Wine' , u'http://www.haaretz.com/cmlink/food-and-wine-print-rss-1.265034?localLinksEnabled=false' ) - ,(u'Sports' , u'http://www.haaretz.com/cmlink/sports-rss-1.286092?localLinksEnabled=false' ) + (u'News' , PREFIX + u'/print-edition/news' ) + ,(u'Opinion' , PREFIX + u'/print-edition/opinion' ) + ,(u'Business' , PREFIX + u'/print-edition/business' ) + ,(u'Real estate' , PREFIX + u'/print-edition/real-estate' ) + ,(u'Sports' , PREFIX + u'/print-edition/sports' ) + ,(u'Travel' , PREFIX + u'/print-edition/travel' ) + ,(u'Books' , PREFIX + u'/print-edition/books' ) + ,(u'Food & Wine' , PREFIX + u'/print-edition/food-wine' ) + ,(u'Arts & Leisure', PREFIX + u'/print-edition/arts-leisure' ) + ,(u'Features' , PREFIX + u'/print-edition/features' ) ] + + def print_version(self, url): + article = url.rpartition('/')[2] + return 'http://www.haaretz.com/misc/article-print-page/' + article + + def parse_index(self): + totalfeeds = [] + lfeeds = self.get_feeds() + for feedobj in lfeeds: + feedtitle, feedurl = feedobj + self.report_progress(0, _('Fetching feed')+' %s...'%(feedtitle if feedtitle else feedurl)) + articles = [] + soup = self.index_to_soup(feedurl) + for item in soup.findAll(attrs={'class':'text'}): + sp = item.find('span',attrs={'class':'h3 font-weight-normal'}) + desc = item.find('p') + description = '' + if sp: + if desc: + description = self.tag_to_string(desc) + link = sp.a + url = self.PREFIX + link['href'] + title = self.tag_to_string(link) + times = strftime('%a, %d %b %Y %H:%M:%S +0000',gmtime()) + articles.append({ + 'title' :title + ,'date' :times + ,'url' :url + ,'description':description + }) + totalfeeds.append((feedtitle, articles)) + return totalfeeds + + def preprocess_html(self, soup): for item in soup.findAll(style=True): del item['style'] diff --git a/resources/recipes/hindu.recipe b/resources/recipes/hindu.recipe index 6c0d42660b..cc5305eb77 100644 --- a/resources/recipes/hindu.recipe +++ b/resources/recipes/hindu.recipe @@ -2,7 +2,7 @@ from __future__ import with_statement __license__ = 'GPL 3' __copyright__ = '2009, Kovid Goyal ' -import re +import time from calibre.web.feeds.news import BasicNewsRecipe class TheHindu(BasicNewsRecipe): @@ -10,45 +10,41 @@ class TheHindu(BasicNewsRecipe): language = 'en_IN' oldest_article = 7 - __author__ = 'Kovid Goyal and Sujata Raman' + __author__ = 'Kovid Goyal' max_articles_per_feed = 100 no_stylesheets = True - remove_tags_before = {'name':'font', 'class':'storyhead'} - preprocess_regexps = [ - (re.compile(r'.*', re.DOTALL), - lambda match: ''), - ] - extra_css = ''' - .storyhead{font-family:Arial,Helvetica,sans-serif; font-size:large; color:#000099;} - body{font-family:Verdana,Arial,Helvetica,sans-serif; font-size:x-small; text-align:left;} - ''' - feeds = [ - (u'Main - Front Page', u'http://www.hindu.com/rss/01hdline.xml'), - (u'Main - National', u'http://www.hindu.com/rss/02hdline.xml'), - (u'Main - International', u'http://www.hindu.com/rss/03hdline.xml'), - (u'Main - Opinion', u'http://www.hindu.com/rss/05hdline.xml'), - (u'Main - Business', u'http://www.hindu.com/rss/06hdline.xml'), - (u'Main - Sport', u'http://www.hindu.com/rss/07hdline.xml'), - (u'Main - Weather / Religion / Crossword / Cartoon', - u'http://www.hindu.com/rss/10hdline.xml'), - (u'Main - Engagements', u'http://www.hindu.com/rss/26hdline.xml'), - (u'Supplement - Literary Review', - u'http://www.hindu.com/rss/lrhdline.xml'), - (u'Supplement - Sunday Magazine', - u'http://www.hindu.com/rss/maghdline.xml'), - (u'Supplement - Open Page', u'http://www.hindu.com/rss/ophdline.xml'), - (u'Supplement - Business Review', - u'http://www.hindu.com/rss/bizhdline.xml'), - (u'Supplement - Book Review', - u'http://www.hindu.com/rss/brhdline.xml'), - (u'Supplement - Science & Technology', - u'http://www.hindu.com/rss/setahdline.xml') - ] + keep_only_tags = [dict(id='content')] + remove_tags = [dict(attrs={'class':['article-links', 'breadcr']}), + dict(id=['email-section', 'right-column', 'printfooter'])] + + extra_css = '.photo-caption { font-size: smaller }' def postprocess_html(self, soup, first_fetch): for t in soup.findAll(['table', 'tr', 'td','center']): t.name = 'div' - - return soup + + def parse_index(self): + today = time.strftime('%Y-%m-%d') + soup = self.index_to_soup( + 'http://www.thehindu.com/todays-paper/tp-index/?date=' + today) + div = soup.find(id='left-column') + feeds = [] + current_section = None + current_articles = [] + for x in div.findAll(['h3', 'div']): + if current_section and x.get('class', '') == 'tpaper': + a = x.find('a', href=True) + if a is not None: + current_articles.append({'url':a['href']+'?css=print', + 'title':self.tag_to_string(a), 'date': '', + 'description':''}) + if x.name == 'h3': + if current_section and current_articles: + feeds.append((current_section, current_articles)) + current_section = self.tag_to_string(x) + current_articles = [] + return feeds + + diff --git a/resources/recipes/houston_chronicle.recipe b/resources/recipes/houston_chronicle.recipe index 3ec1abbf0f..3390228455 100644 --- a/resources/recipes/houston_chronicle.recipe +++ b/resources/recipes/houston_chronicle.recipe @@ -1,12 +1,15 @@ #!/usr/bin/env python # vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +import string, pprint + from calibre.web.feeds.news import BasicNewsRecipe class HoustonChronicle(BasicNewsRecipe): title = u'The Houston Chronicle' description = 'News from Houston, Texas' - __author__ = 'Kovid Goyal and Sujata Raman' + __author__ = 'Kovid Goyal' language = 'en' timefmt = ' [%a, %d %b, %Y]' no_stylesheets = True @@ -38,54 +41,23 @@ class HoustonChronicle(BasicNewsRecipe): def parse_index(self): - soup = self.index_to_soup('http://www.chron.com/news/') - container = soup.find('table', attrs={'class':'body-columns'}) - + categories = ['news', 'sports', 'business', 'entertainment', 'life', + 'travel'] feeds = [] - current_section = 'Top Stories' - current_articles = [] - - self.log('\tFound section:', current_section) - - for div in container.findAll('div'): - if div.get('class', None) == 'module-mast': - t = self.tag_to_string(div).replace(u'\xbb', '').strip() - if t and 'interactives' not in t: - if current_section and current_articles: - feeds.append((current_section, current_articles)) - current_section = t - current_articles = [] - self.log('\tFound section:', current_section) - elif div.get('storyid', False): - a = div.find('a', href=True) - if a: - title = self.tag_to_string(a) - url = a.get('href') - if title and url: - if url.startswith('/'): - url = 'http://www.chron.com'+url - self.log('\t\tFound article:', title) - self.log('\t\t\t', url) - current_articles.append({'title':title, 'url':url, - 'date':'', 'description':''}) - elif div.get('class', None) == 'columnbox' and \ - 'special' in current_section.lower(): - a = div.find('a') - if a: - title = self.tag_to_string(a) - url = a.get('href') - if title and url: - if not url.startswith('/'): continue - url = 'http://www.chron.com'+url - self.log('\t\tFound article:', title) - self.log('\t\t\t', url) - a.extract() - desc = self.tag_to_string(div) - current_articles.append({'title':title, 'url':url, - 'date':'', 'description':desc}) - - if current_section and current_articles: - feeds.append((current_section, current_articles)) + for cat in categories: + articles = [] + soup = self.index_to_soup('http://www.chron.com/%s/'%cat) + for elem in soup.findAll(comptype='story', storyid=True): + a = elem.find('a', href=True) + if a is None: continue + url = a['href'] + if not url.startswith('http://'): + url = 'http://www.chron.com'+url + articles.append({'title':self.tag_to_string(a), 'url':url, + 'description':'', 'date':''}) + pprint.pprint(articles[-1]) + if articles: + feeds.append((string.capwords(cat), articles)) return feeds diff --git a/resources/recipes/ifzm.recipe b/resources/recipes/ifzm.recipe new file mode 100644 index 0000000000..407acefdd4 --- /dev/null +++ b/resources/recipes/ifzm.recipe @@ -0,0 +1,50 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1277305250(BasicNewsRecipe): + title = u'infzm - China Southern Weekly' + oldest_article = 14 + max_articles_per_feed = 100 + + feeds = [(u'\u5357\u65b9\u5468\u672b-\u70ed\u70b9\u65b0\u95fb', u'http://www.infzm.com/rss/home/rss2.0.xml'), + (u'\u5357\u65b9\u5468\u672b-\u7ecf\u6d4e\u65b0\u95fb', u'http://www.infzm.com/rss/economic.xml'), + (u'\u5357\u65b9\u5468\u672b-\u6587\u5316\u65b0\u95fb', u'http://www.infzm.com/rss/culture.xml'), + (u'\u5357\u65b9\u5468\u672b-\u751f\u6d3b\u65f6\u5c1a', u'http://www.infzm.com/rss/lifestyle.xml'), + (u'\u5357\u65b9\u5468\u672b-\u89c2\u70b9', u'http://www.infzm.com/rss/opinion.xml') + ] + __author__ = 'rty' + __version__ = '1.0' + language = 'zh' + pubisher = 'http://www.infzm.com' + description = 'Chinese Weekly Tabloid' + category = 'News, China' + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + #encoding = 'GB2312' + encoding = 'UTF-8' + conversion_options = {'linearize_tables':True} + masthead_url = 'http://i50.tinypic.com/2qmfb7l.jpg' + + extra_css = ''' + @font-face { font-family: "DroidFont", serif, sans-serif; src: url(res:///system/fonts/DroidSansFallback.ttf); }\n + body { + margin-right: 8pt; + font-family: 'DroidFont', serif;} + .detailContent {font-family: 'DroidFont', serif, sans-serif} + ''' + + keep_only_tags = [ + dict(name='div', attrs={'id':'detailContent'}), + ] + remove_tags = [ + dict(name='div', attrs={'id':['detailTools', 'detailSideL', 'pageNum']}), + ] + remove_tags_after = [ + dict(name='div', attrs={'id':'pageNum'}), + ] + def preprocess_html(self, soup): + for item in soup.findAll(color=True): + del item['font'] + for item in soup.findAll(style=True): + del item['style'] + return soup diff --git a/resources/recipes/london_free_press.recipe b/resources/recipes/london_free_press.recipe new file mode 100644 index 0000000000..82f6a2abc9 --- /dev/null +++ b/resources/recipes/london_free_press.recipe @@ -0,0 +1,38 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class LondonFreePress(BasicNewsRecipe): + title = u'London Free Press' + __author__ = 'rty' + oldest_article = 4 + max_articles_per_feed = 100 + + pubisher = 'lfpress.com' + description = 'Ontario Canada Newspaper' + category = 'News, Ontario, Canada' + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + language = 'en_CA' + encoding = 'utf-8' + conversion_options = {'linearize_tables':True} + + feeds = [ + (u'News', u'http://www.lfpress.com/news/rss.xml'), + (u'Comment', u'http://www.lfpress.com/comment/rss.xml'), + (u'Entertainment', u'http://www.lfpress.com/entertainment/rss.xml '), + (u'Money', u'http://www.lfpress.com/money/rss.xml '), + (u'Life', u'http://www.lfpress.com/life/rss.xml '), + (u'Sports', u'http://www.lfpress.com/sports/rss.xml ') + ] + + keep_only_tags = [ + dict(name='div', attrs={'id':'article'}), + ] + remove_tags = [ + dict(name='div', attrs={'id':'commentsBottom'}), + dict(name='div', attrs={'class':['leftBox','bottomBox clear']}), + dict(name='ul', attrs={'class':'tabs dl contentSwap'}), + ] + remove_tags_after = [ + dict(name='div', attrs={'class':'bottomBox clear'}), + ] diff --git a/resources/recipes/losservatoreromano_it.recipe b/resources/recipes/losservatoreromano_it.recipe new file mode 100644 index 0000000000..19a579d3ff --- /dev/null +++ b/resources/recipes/losservatoreromano_it.recipe @@ -0,0 +1,48 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +www.vatican.va/news_services/or/or_quo +''' + + +from calibre.web.feeds.news import BasicNewsRecipe + +class LOsservatoreRomano_it(BasicNewsRecipe): + title = "L'Osservatore Romano" + __author__ = 'Darko Miletic' + description = 'Quiornale quotidiano, politico, religioso del Vaticano' + publisher = 'La Santa Sede' + category = 'news, politics, religion, Vatican' + no_stylesheets = True + INDEX = 'http://www.vatican.va' + FEEDPAGE = INDEX + '/news_services/or/or_quo/index.html' + CONTENTPAGE = INDEX + '/news_services/or/or_quo/text.html' + use_embedded_content = False + encoding = 'cp1252' + language = 'it' + publication_type = 'newspaper' + + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + , 'linearize_tables' : True + } + + def parse_index(self): + articles = [] + articles.append({ + 'title' :self.title + ,'date' :'' + ,'url' :self.CONTENTPAGE + ,'description':'' + }) + return [(self.title, articles)] + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + return self.adeify_images(soup) + diff --git a/resources/recipes/lrb.recipe b/resources/recipes/lrb.recipe index 0076b3e697..4a203c80ae 100644 --- a/resources/recipes/lrb.recipe +++ b/resources/recipes/lrb.recipe @@ -1,6 +1,6 @@ __license__ = 'GPL v3' -__copyright__ = '2008, Darko Miletic ' +__copyright__ = '2008-2010, Darko Miletic ' ''' lrb.co.uk ''' @@ -8,32 +8,38 @@ lrb.co.uk from calibre.web.feeds.news import BasicNewsRecipe class LondonReviewOfBooks(BasicNewsRecipe): - title = u'London Review of Books' - __author__ = u'Darko Miletic' - description = u'Literary review publishing essay-length book reviews and topical articles on politics, literature, history, philosophy, science and the arts by leading writers and thinkers' - category = 'news, literature, England' - publisher = 'London Review of Books' - oldest_article = 7 + title = 'London Review of Books (free)' + __author__ = 'Darko Miletic' + description = 'Literary review publishing essay-length book reviews and topical articles on politics, literature, history, philosophy, science and the arts by leading writers and thinkers' + category = 'news, literature, UK' + publisher = 'LRB ltd.' + oldest_article = 15 max_articles_per_feed = 100 language = 'en_GB' no_stylesheets = True use_embedded_content = False encoding = 'utf-8' + publication_type = 'magazine' + masthead_url = 'http://www.lrb.co.uk/assets/images/lrb_logo_big.gif' + extra_css = ' body{font-family: Georgia,Palatino,"Palatino Linotype",serif} ' - conversion_options = { + conversion_options = { 'comments' : description ,'tags' : category ,'language' : language ,'publisher' : publisher } - - keep_only_tags = [dict(name='div' , attrs={'id' :'main'})] - remove_tags = [ - dict(name='div' , attrs={'class':['pagetools','issue-nav-controls','nocss']}) - ,dict(name='div' , attrs={'id' :['mainmenu','precontent','otherarticles'] }) - ,dict(name='span', attrs={'class':['inlineright','article-icons']}) - ,dict(name='ul' , attrs={'class':'article-controls'}) - ,dict(name='p' , attrs={'class':'meta-info' }) - ] + + keep_only_tags = [dict(attrs={'class':['article-body indent','letters','article-list']})] + remove_attributes = ['width','height'] feeds = [(u'London Review of Books', u'http://www.lrb.co.uk/lrbrss.xml')] + + def get_cover_url(self): + cover_url = None + soup = self.index_to_soup('http://www.lrb.co.uk/') + cover_item = soup.find('p',attrs={'class':'cover'}) + if cover_item: + cover_url = 'http://www.lrb.co.uk' + cover_item.a.img['src'] + return cover_url + diff --git a/resources/recipes/lrb_payed.recipe b/resources/recipes/lrb_payed.recipe new file mode 100644 index 0000000000..4888f61cb6 --- /dev/null +++ b/resources/recipes/lrb_payed.recipe @@ -0,0 +1,75 @@ + +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +lrb.co.uk +''' +from calibre import strftime +from calibre.web.feeds.news import BasicNewsRecipe + +class LondonReviewOfBooksPayed(BasicNewsRecipe): + title = 'London Review of Books' + __author__ = 'Darko Miletic' + description = 'Subscription content. Literary review publishing essay-length book reviews and topical articles on politics, literature, history, philosophy, science and the arts by leading writers and thinkers' + category = 'news, literature, UK' + publisher = 'LRB Ltd.' + max_articles_per_feed = 100 + language = 'en_GB' + no_stylesheets = True + delay = 1 + use_embedded_content = False + encoding = 'utf-8' + INDEX = 'http://www.lrb.co.uk' + LOGIN = INDEX + '/login' + masthead_url = INDEX + '/assets/images/lrb_logo_big.gif' + needs_subscription = True + publication_type = 'magazine' + extra_css = ' body{font-family: Georgia,Palatino,"Palatino Linotype",serif} ' + + + def get_browser(self): + br = BasicNewsRecipe.get_browser() + if self.username is not None and self.password is not None: + br.open(self.LOGIN) + br.select_form(nr=1) + br['username'] = self.username + br['password'] = self.password + br.submit() + return br + + def parse_index(self): + articles = [] + soup = self.index_to_soup(self.INDEX) + cover_item = soup.find('p',attrs={'class':'cover'}) + lrbtitle = self.title + if cover_item: + self.cover_url = self.INDEX + cover_item.a.img['src'] + content = self.INDEX + cover_item.a['href'] + soup2 = self.index_to_soup(content) + sitem = soup2.find(attrs={'class':'article-list'}) + lrbtitle = soup2.head.title.string + for item in sitem.findAll('a',attrs={'class':'title'}): + description = u'' + title_prefix = u'' + feed_link = item + if feed_link.has_key('href'): + url = self.INDEX + feed_link['href'] + title = title_prefix + self.tag_to_string(feed_link) + date = strftime(self.timefmt) + articles.append({ + 'title' :title + ,'date' :date + ,'url' :url + ,'description':description + }) + return [(lrbtitle, articles)] + + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + } + + keep_only_tags = [dict(name='div' , attrs={'class':['article-body indent','letters']})] + remove_attributes = ['width','height'] diff --git a/resources/recipes/maximum_pc.recipe b/resources/recipes/maximum_pc.recipe new file mode 100644 index 0000000000..3e4d8a58d9 --- /dev/null +++ b/resources/recipes/maximum_pc.recipe @@ -0,0 +1,43 @@ +from calibre.ptempfile import PersistentTemporaryFile +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1276930924(BasicNewsRecipe): + title = u'Maximum PC' + __author__ = 'rty' + description = 'Maximum PC' + publisher = 'http://www.maximumpc.com' + category = 'news, computer, technology' + language = 'en' + oldest_article = 30 + max_articles_per_feed = 100 + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + language = 'en' + temp_files = [] + articles_are_obfuscated = True + feeds = [(u'News', u'http://www.maximumpc.com/articles/4/feed'), + (u'Reviews', u'http://www.maximumpc.com/articles/40/feed'), + (u'Editors Blog', u'http://www.maximumpc.com/articles/6/feed'), + (u'How-to', u'http://www.maximumpc.com/articles/32/feed'), + (u'Features', u'http://www.maximumpc.com/articles/31/feed'), + (u'From the Magazine', u'http://www.maximumpc.com/articles/72/feed') + ] + keep_only_tags = [ + dict(name='div', attrs={'class':['print-title','article_body']}), + ] + remove_tags = [ + dict(name='div', attrs={'class':'comments-tags-actions'}), + ] + remove_tags_before = dict(name='div', attrs={'class':'print-title'}) + remove_tags_after = dict(name='div', attrs={'class':'meta-content'}) + + def get_obfuscated_article(self, url): + br = self.get_browser() + br.open(url) + response = br.follow_link(url_regex = r'/print/[0-9]+', nr = 0) + html = response.read() + self.temp_files.append(PersistentTemporaryFile('_fa.html')) + self.temp_files[-1].write(html) + self.temp_files[-1].close() + return self.temp_files[-1].name diff --git a/resources/recipes/national_post.recipe b/resources/recipes/national_post.recipe index 4fe188934c..00eb918d02 100644 --- a/resources/recipes/national_post.recipe +++ b/resources/recipes/national_post.recipe @@ -7,18 +7,18 @@ class NYTimes(BasicNewsRecipe): __author__ = 'Krittika Goyal' description = 'Canadian national newspaper' timefmt = ' [%d %b, %Y]' - needs_subscription = False language = 'en_CA' + needs_subscription = False no_stylesheets = True #remove_tags_before = dict(name='h1', attrs={'class':'heading'}) - #remove_tags_after = dict(name='td', attrs={'class':'newptool1'}) + remove_tags_after = dict(name='div', attrs={'class':'npStoryTools npWidth1-6 npRight npTxtStrong'}) remove_tags = [ dict(name='iframe'), - dict(name='div', attrs={'class':'story-tools'}), + dict(name='div', attrs={'class':['story-tools', 'npStoryTools npWidth1-6 npRight npTxtStrong']}), #dict(name='div', attrs={'id':['qrformdiv', 'inSection', 'alpha-inner']}), #dict(name='form', attrs={'onsubmit':''}), - #dict(name='table', attrs={'cellspacing':'0'}), + dict(name='ul', attrs={'class':'npTxtAlt npGroup npTxtCentre npStoryShare npTxtStrong npTxtDim'}), ] # def preprocess_html(self, soup): @@ -37,7 +37,7 @@ class NYTimes(BasicNewsRecipe): def parse_index(self): soup = self.nejm_get_index() - div = soup.find(id='LegoText4') + div = soup.find(id='npContentMain') current_section = None current_articles = [] @@ -50,7 +50,7 @@ class NYTimes(BasicNewsRecipe): current_section = self.tag_to_string(x) current_articles = [] self.log('\tFound section:', current_section) - if current_section is not None and x.name == 'h3': + if current_section is not None and x.name == 'h5': # Article found title = self.tag_to_string(x) a = x.find('a', href=lambda x: x and 'story' in x) @@ -59,8 +59,8 @@ class NYTimes(BasicNewsRecipe): url = a.get('href', False) if not url or not title: continue - if url.startswith('story'): - url = 'http://www.nationalpost.com/todays-paper/'+url + #if url.startswith('story'): + url = 'http://www.nationalpost.com/todays-paper/'+url self.log('\t\tFound article:', title) self.log('\t\t\t', url) current_articles.append({'title': title, 'url':url, @@ -70,28 +70,11 @@ class NYTimes(BasicNewsRecipe): feeds.append((current_section, current_articles)) return feeds - def preprocess_html(self, soup): - story = soup.find(name='div', attrs={'class':'triline'}) - page2_link = soup.find('p','pagenav') - if page2_link: - atag = page2_link.find('a',href=True) - if atag: - page2_url = atag['href'] - if page2_url.startswith('story'): - page2_url = 'http://www.nationalpost.com/todays-paper/'+page2_url - elif page2_url.startswith( '/todays-paper/story.html'): - page2_url = 'http://www.nationalpost.com/'+page2_url - page2_soup = self.index_to_soup(page2_url) - if page2_soup: - page2_content = page2_soup.find('div','story-content') - if page2_content: - full_story = BeautifulSoup('
') - full_story.insert(0,story) - full_story.insert(1,page2_content) - story = full_story + story = soup.find(name='div', attrs={'id':'npContentMain'}) + ##td = heading.findParent(name='td') + ##td.extract() soup = BeautifulSoup('t') body = soup.find(name='body') body.insert(0, story) return soup - diff --git a/resources/recipes/new_scientist.recipe b/resources/recipes/new_scientist.recipe index 1727a926ed..b40be458bc 100644 --- a/resources/recipes/new_scientist.recipe +++ b/resources/recipes/new_scientist.recipe @@ -32,15 +32,16 @@ class NewScientist(BasicNewsRecipe): } preprocess_regexps = [(re.compile(r'.*?', re.DOTALL|re.IGNORECASE),lambda match: '')] - keep_only_tags = [dict(name='div', attrs={'id':['pgtop','maincol','nsblgposts','hldgalcols']})] + keep_only_tags = [dict(name='div', attrs={'id':['pgtop','maincol','blgmaincol','nsblgposts','hldgalcols']})] remove_tags = [ dict(name='div' , attrs={'class':['hldBd','adline','pnl','infotext' ]}) - ,dict(name='div' , attrs={'id' :['compnl','artIssueInfo','artTools']}) + ,dict(name='div' , attrs={'id' :['compnl','artIssueInfo','artTools','comments','blgsocial']}) ,dict(name='p' , attrs={'class':['marker','infotext' ]}) ,dict(name='meta' , attrs={'name' :'description' }) + ,dict(name='a' , attrs={'rel' :'tag' }) ] - remove_tags_after = dict(attrs={'class':'nbpcopy'}) + remove_tags_after = dict(attrs={'class':['nbpcopy','comments']}) remove_attributes = ['height','width'] feeds = [ diff --git a/resources/recipes/nytimes.recipe b/resources/recipes/nytimes.recipe index ec546569e5..a2d5135045 100644 --- a/resources/recipes/nytimes.recipe +++ b/resources/recipes/nytimes.recipe @@ -17,6 +17,7 @@ class NYTimes(BasicNewsRecipe): title = 'New York Times Top Stories' __author__ = 'GRiker' language = 'en' + requires_version = (0, 7, 5) description = 'Top Stories from the New York Times' # List of sections typically included in Top Stories. Use a keyword from the @@ -64,6 +65,7 @@ class NYTimes(BasicNewsRecipe): timefmt = '' needs_subscription = True masthead_url = 'http://graphics8.nytimes.com/images/misc/nytlogo379x64.gif' + cover_margins = (18,18,'grey99') remove_tags_before = dict(id='article') remove_tags_after = dict(id='article') @@ -77,6 +79,7 @@ class NYTimes(BasicNewsRecipe): 'doubleRule', 'dottedLine', 'entry-meta', + 'entry-response module', 'icon enlargeThis', 'leftNavTabs', 'module box nav', @@ -86,6 +89,7 @@ class NYTimes(BasicNewsRecipe): 'relatedSearchesModule', 'side_tool', 'singleAd', + 'subNavigation clearfix', 'subNavigation tabContent active', 'subNavigation tabContent active clearfix', ]}), @@ -108,6 +112,7 @@ class NYTimes(BasicNewsRecipe): 'navigation', 'portfolioInline', 'relatedArticles', + 'respond', 'side_search', 'side_index', 'side_tool', @@ -183,6 +188,16 @@ class NYTimes(BasicNewsRecipe): self.log("\nFailed to login") return br + def skip_ad_pages(self, soup): + # Skip ad pages served before actual article + skip_tag = soup.find(True, {'name':'skip'}) + if skip_tag is not None: + self.log.warn("Found forwarding link: %s" % skip_tag.parent['href']) + url = 'http://www.nytimes.com' + re.sub(r'\?.*', '', skip_tag.parent['href']) + url += '?pagewanted=all' + self.log.warn("Skipping ad to article at '%s'" % url) + return self.index_to_soup(url, raw=True) + def get_cover_url(self): cover = None st = time.localtime() @@ -391,14 +406,6 @@ class NYTimes(BasicNewsRecipe): return ans def preprocess_html(self, soup): - # Skip ad pages served before actual article - skip_tag = soup.find(True, {'name':'skip'}) - if skip_tag is not None: - self.log.error("Found forwarding link: %s" % skip_tag.parent['href']) - url = 'http://www.nytimes.com' + re.sub(r'\?.*', '', skip_tag.parent['href']) - url += '?pagewanted=all' - self.log.error("Skipping ad to article at '%s'" % url) - soup = self.index_to_soup(url) return self.strip_anchors(soup) def postprocess_html(self,soup, True): @@ -454,8 +461,10 @@ class NYTimes(BasicNewsRecipe): if mp_off >= 0: c = c[:mp_off] emTag.insert(0, c) - hrTag = Tag(soup, 'hr') - #hrTag['style'] = "margin-top:0em;margin-bottom:0em" + #hrTag = Tag(soup, 'hr') + #hrTag['class'] = 'caption_divider' + hrTag = Tag(soup, 'div') + hrTag['class'] = 'divider' emTag.insert(1, hrTag) caption.replaceWith(emTag) diff --git a/resources/recipes/nytimes_sub.recipe b/resources/recipes/nytimes_sub.recipe index c08b06572d..1814132667 100644 --- a/resources/recipes/nytimes_sub.recipe +++ b/resources/recipes/nytimes_sub.recipe @@ -13,13 +13,14 @@ Story import re, string, time from calibre import strftime from calibre.web.feeds.recipes import BasicNewsRecipe -from calibre.ebooks.BeautifulSoup import BeautifulSoup, BeautifulStoneSoup, NavigableString, Tag +from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup, NavigableString, Tag class NYTimes(BasicNewsRecipe): title = 'The New York Times' __author__ = 'GRiker' language = 'en' + requires_version = (0, 7, 5) description = 'Daily news from the New York Times (subscription version)' allSectionKeywords = ['The Front Page', 'International','National','Obituaries','Editorials', @@ -65,6 +66,7 @@ class NYTimes(BasicNewsRecipe): 'doubleRule', 'dottedLine', 'entry-meta', + 'entry-response module', 'icon enlargeThis', 'leftNavTabs', 'module box nav', @@ -74,6 +76,7 @@ class NYTimes(BasicNewsRecipe): 'relatedSearchesModule', 'side_tool', 'singleAd', + 'subNavigation clearfix', 'subNavigation tabContent active', 'subNavigation tabContent active clearfix', ]}), @@ -96,6 +99,7 @@ class NYTimes(BasicNewsRecipe): 'navigation', 'portfolioInline', 'relatedArticles', + 'respond', 'side_search', 'side_index', 'side_tool', @@ -103,6 +107,7 @@ class NYTimes(BasicNewsRecipe): ]), dict(name=['script', 'noscript', 'style'])] masthead_url = 'http://graphics8.nytimes.com/images/misc/nytlogo379x64.gif' + cover_margins = (18,18,'grey99') no_stylesheets = True extra_css = '.headline {text-align: left;}\n \ .byline {font-family: monospace; \ @@ -158,7 +163,7 @@ class NYTimes(BasicNewsRecipe): return cover def get_masthead_title(self): - return 'NYTimes GR Version' + return self.title def dump_ans(self, ans): total_article_count = 0 @@ -279,15 +284,17 @@ class NYTimes(BasicNewsRecipe): self.dump_ans(ans) return ans - def preprocess_html(self, soup): + def skip_ad_pages(self, soup): # Skip ad pages served before actual article skip_tag = soup.find(True, {'name':'skip'}) if skip_tag is not None: - self.log.error("Found forwarding link: %s" % skip_tag.parent['href']) + self.log.warn("Found forwarding link: %s" % skip_tag.parent['href']) url = 'http://www.nytimes.com' + re.sub(r'\?.*', '', skip_tag.parent['href']) url += '?pagewanted=all' - self.log.error("Skipping ad to article at '%s'" % url) - soup = self.index_to_soup(url) + self.log.warn("Skipping ad to article at '%s'" % url) + return self.index_to_soup(url, raw=True) + + def preprocess_html(self, soup): return self.strip_anchors(soup) def postprocess_html(self,soup, True): @@ -329,7 +336,7 @@ class NYTimes(BasicNewsRecipe): self.log(">>> No class:'columnGroup first' found <<<") # Change class="kicker" to

kicker = soup.find(True, {'class':'kicker'}) - if kicker and kicker.contents[0]: + if kicker and kicker.contents and kicker.contents[0]: h3Tag = Tag(soup, "h3") h3Tag.insert(0, self.fixChars(self.tag_to_string(kicker, use_alt=False))) @@ -344,8 +351,10 @@ class NYTimes(BasicNewsRecipe): if mp_off >= 0: c = c[:mp_off] emTag.insert(0, c) - hrTag = Tag(soup, 'hr') - #hrTag['style'] = "margin-top:0em;margin-bottom:0em" + #hrTag = Tag(soup, 'hr') + #hrTag['class'] = 'caption_divider' + hrTag = Tag(soup, 'div') + hrTag['class'] = 'divider' emTag.insert(1, hrTag) caption.replaceWith(emTag) @@ -413,12 +422,11 @@ class NYTimes(BasicNewsRecipe): return soup - def postprocess_book(self, oeb, opts, log) : - print "\npostprocess_book()\n" - - def extract_byline(href) : - # :' + articlebody = soup.find('div',attrs={'class':'articlebody'}) + if not articlebody: + print 'postprocess_book.extract_description(): Did not find
:' print soup.prettify() return None - paras = articleBody.findAll('p') + paras = articlebody.findAll('p') for p in paras: if p.renderContents() > '' : return self.massageNCXText(self.tag_to_string(p,use_alt=False)) return None - # Method entry point here - # Single section toc looks different than multi-section tocs - if oeb.toc.depth() == 2 : - for article in oeb.toc : - if article.author is None : - article.author = extract_byline(article.href) - if article.description is None : - article.description = extract_description(article.href).decode('utf-8') - elif oeb.toc.depth() == 3 : - for section in oeb.toc : - for article in section : - if article.author is None : - article.author = extract_byline(article.href) - if article.description is None : - article.description = extract_description(article.href) + if not article.author: + article.author = extract_author(soup) + if not article.summary: + article.summary = article.text_summary = extract_description(soup) def strip_anchors(self,soup): paras = soup.findAll(True) diff --git a/resources/recipes/oldnewthing.recipe b/resources/recipes/oldnewthing.recipe index fc9749d403..8280451e17 100644 --- a/resources/recipes/oldnewthing.recipe +++ b/resources/recipes/oldnewthing.recipe @@ -28,7 +28,7 @@ class OldNewThing(BasicNewsRecipe): } remove_attributes = ['width','height'] - keep_only_tags = [dict(attrs={'class':['postsub','comment']})] - + keep_only_tags = [dict(attrs={'class':'full-post'})] + remove_tags = [dict(attrs={'class':['post-attributes','post-tags','post-actions']})] feeds = [(u'Posts', u'http://blogs.msdn.com/oldnewthing/rss.xml')] diff --git a/resources/recipes/people_daily.recipe b/resources/recipes/people_daily.recipe new file mode 100644 index 0000000000..4dec2452e2 --- /dev/null +++ b/resources/recipes/people_daily.recipe @@ -0,0 +1,57 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1277129332(BasicNewsRecipe): + title = u'People Daily - China' + oldest_article = 2 + max_articles_per_feed = 100 + __author__ = 'rty' + + pubisher = 'people.com.cn' + description = 'People Daily Newspaper' + language = 'zh' + category = 'News, China' + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + encoding = 'GB2312' + conversion_options = {'linearize_tables':True} + + feeds = [(u'\u56fd\u5185\u65b0\u95fb', u'http://www.people.com.cn/rss/politics.xml'), + (u'\u56fd\u9645\u65b0\u95fb', u'http://www.people.com.cn/rss/world.xml'), + (u'\u7ecf\u6d4e\u65b0\u95fb', u'http://www.people.com.cn/rss/finance.xml'), + (u'\u4f53\u80b2\u65b0\u95fb', u'http://www.people.com.cn/rss/sports.xml'), + (u'\u53f0\u6e7e\u65b0\u95fb', u'http://www.people.com.cn/rss/haixia.xml')] + keep_only_tags = [ + dict(name='div', attrs={'class':'left_content'}), + ] + remove_tags = [ + dict(name='table', attrs={'class':'title'}), + ] + remove_tags_after = [ + dict(name='table', attrs={'class':'bianji'}), + ] + + def append_page(self, soup, appendtag, position): + pager = soup.find('img',attrs={'src':'/img/next_b.gif'}) + if pager: + nexturl = self.INDEX + pager.a['href'] + soup2 = self.index_to_soup(nexturl) + texttag = soup2.find('div', attrs={'class':'left_content'}) + #for it in texttag.findAll(style=True): + # del it['style'] + newpos = len(texttag.contents) + self.append_page(soup2,texttag,newpos) + texttag.extract() + appendtag.insert(position,texttag) + + + def preprocess_html(self, soup): + mtag = '\n' + soup.head.insert(0,mtag) + for item in soup.findAll(style=True): + del item['form'] + self.append_page(soup, soup.body, 3) + #pager = soup.find('a',attrs={'class':'ab12'}) + #if pager: + # pager.extract() + return soup diff --git a/resources/recipes/psych.recipe b/resources/recipes/psych.recipe index 46290450cb..3fc940b4a2 100644 --- a/resources/recipes/psych.recipe +++ b/resources/recipes/psych.recipe @@ -1,39 +1,44 @@ + +from calibre.ptempfile import PersistentTemporaryFile from calibre.web.feeds.news import BasicNewsRecipe -from calibre.ebooks.BeautifulSoup import BeautifulSoup -class PsychologyToday(BasicNewsRecipe): +class AdvancedUserRecipe1275708473(BasicNewsRecipe): title = u'Psychology Today' - language = 'en' - __author__ = 'Krittika Goyal' - oldest_article = 1 #days - max_articles_per_feed = 25 - #encoding = 'latin1' - - remove_stylesheets = True - #remove_tags_before = dict(name='h1', attrs={'class':'heading'}) - #remove_tags_after = dict(name='td', attrs={'class':'newptool1'}) + _author__ = 'rty' + publisher = u'www.psychologytoday.com' + category = u'Psychology' + max_articles_per_feed = 100 + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + language = 'en' + temp_files = [] + articles_are_obfuscated = True remove_tags = [ - dict(name='iframe'), - dict(name='div', attrs={'class':['pt-box-title', 'pt-box-content', 'blog-entry-footer', 'item-list', 'article-sub-meta']}), - dict(name='div', attrs={'id':['block-td_search_160', 'block-cam_search_160']}), - #dict(name='ul', attrs={'class':'article-tools'}), - #dict(name='ul', attrs={'class':'articleTools'}), - ] + dict(name='div', attrs={'class':['print-source_url','field-items','print-footer']}), + dict(name='span', attrs={'class':'print-footnote'}), + ] + remove_tags_before = dict(name='h1', attrs={'class':'print-title'}) + remove_tags_after = dict(name='div', attrs={'class':['field-items','print-footer']}) - feeds = [ -('PSY TODAY', - 'http://www.psychologytoday.com/articles/index.rss'), -] + feeds = [(u'Contents', u'http://www.psychologytoday.com/articles/index.rss')] - def preprocess_html(self, soup): - story = soup.find(name='div', attrs={'id':'contentColumn'}) - #td = heading.findParent(name='td') - #td.extract() - soup = BeautifulSoup('t') - body = soup.find(name='body') - body.insert(0, story) - for x in soup.findAll(name='p', text=lambda x:x and '-->' in x): - p = x.findParent('p') - if p is not None: - p.extract() - return soup + def get_article_url(self, article): + return article.get('link', None) + + def get_obfuscated_article(self, url): + br = self.get_browser() + br.open(url) + response = br.follow_link(url_regex = r'/print/[0-9]+', nr = 0) + html = response.read() + self.temp_files.append(PersistentTemporaryFile('_fa.html')) + self.temp_files[-1].write(html) + self.temp_files[-1].close() + return self.temp_files[-1].name + + def get_cover_url(self): + index = 'http://www.psychologytoday.com/magazine/' + soup = self.index_to_soup(index) + for image in soup.findAll('img',{ "class" : "imagefield imagefield-field_magazine_cover" }): + return image['src'] + '.jpg' + return None diff --git a/resources/recipes/singtao_daily.recipe b/resources/recipes/singtao_daily.recipe new file mode 100644 index 0000000000..f25014ed9a --- /dev/null +++ b/resources/recipes/singtao_daily.recipe @@ -0,0 +1,79 @@ +from calibre.web.feeds.recipes import BasicNewsRecipe + +class AdvancedUserRecipe1278063072(BasicNewsRecipe): + title = u'Singtao Daily - Canada' + oldest_article = 7 + max_articles_per_feed = 100 + __author__ = 'rty' + description = 'Toronto Canada Chinese Newspaper' + publisher = 'news.singtao.ca' + category = 'Chinese, News, Canada' + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + language = 'zh' + conversion_options = {'linearize_tables':True} + masthead_url = 'http://news.singtao.ca/i/site_2009/logo.jpg' + extra_css = ''' + @font-face {font-family: "DroidFont", serif, sans-serif; src: url(res:///system/fonts/DroidSansFallback.ttf); }\ + + body {text-align: justify; margin-right: 8pt; font-family: 'DroidFont', serif;}\ + + h1 {font-family: 'DroidFont', serif;}\ + + .articledescription {font-family: 'DroidFont', serif;} + ''' + keep_only_tags = [ + dict(name='div', attrs={'id':['title','storybody']}), + dict(name='div', attrs={'class':'content'}) + ] + + def parse_index(self): + feeds = [] + for title, url in [ + ('Editorial', + 'http://news.singtao.ca/toronto/editorial.html'), + ('Toronto \xe5\x9f\x8e\xe5\xb8\x82/\xe7\xa4\xbe\xe5\x8d\x80'.decode('utf-8'), + 'http://news.singtao.ca/toronto/city.html'), + ('Canada \xe5\x8a\xa0\xe5\x9c\x8b'.decode('utf-8'), + 'http://news.singtao.ca/toronto/canada.html'), + ('Entertainment', + 'http://news.singtao.ca/toronto/entertainment.html'), + ('World', + 'http://news.singtao.ca/toronto/world.html'), + ('Finance \xe5\x9c\x8b\xe9\x9a\x9b\xe8\xb2\xa1\xe7\xb6\x93'.decode('utf-8'), + 'http://news.singtao.ca/toronto/finance.html'), + ('Sports', 'http://news.singtao.ca/toronto/sports.html'), + ]: + articles = self.parse_section(url) + if articles: + feeds.append((title, articles)) + return feeds + + def parse_section(self, url): + soup = self.index_to_soup(url) + div = soup.find(attrs={'class': ['newslist paddingL10T10','newslist3 paddingL10T10']}) + #date = div.find(attrs={'class': 'underlineBLK'}) + current_articles = [] + for li in div.findAll('li'): + a = li.find('a', href = True) + if a is None: + continue + title = self.tag_to_string(a) + url = a.get('href', False) + if not url or not title: + continue + if url.startswith('/'): + url = 'http://news.singtao.ca'+url + # self.log('\ \ Found article:', title) + # self.log('\ \ \ ', url) + current_articles.append({'title': title, 'url': url, 'description':''}) + + return current_articles + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + for item in soup.findAll(width=True): + del item['width'] + return soup diff --git a/resources/recipes/statesman.recipe b/resources/recipes/statesman.recipe new file mode 100644 index 0000000000..1bbf94fa5b --- /dev/null +++ b/resources/recipes/statesman.recipe @@ -0,0 +1,35 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1278049615(BasicNewsRecipe): + title = u'Statesman' + pubisher = 'http://www.statesman.com/' + description = 'Austin Texas Daily Newspaper' + category = 'News, Austin, Texas' + __author__ = 'rty' + oldest_article = 3 + + max_articles_per_feed = 100 + + feeds = [(u'News', u'http://www.statesman.com/section-rss.do?source=news&includeSubSections=true'), + (u'Business', u'http://www.statesman.com/section-rss.do?source=business&includeSubSections=true'), + (u'Life', u'http://www.statesman.com/section-rss.do?source=life&includesubsection=true'), + (u'Editorial', u'http://www.statesman.com/section-rss.do?source=opinion&includesubsections=true'), + (u'Sports', u'http://www.statesman.com/section-rss.do?source=sports&includeSubSections=true') + ] + masthead_url = "http://www.statesman.com/images/cmg-logo.gif" + #temp_files = [] + #articles_are_obfuscated = True + + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + language = 'en' + encoding = 'utf-8' + conversion_options = {'linearize_tables':True} + remove_tags = [ + dict(name='div', attrs={'id':'cxArticleOptions'}), + ] + keep_only_tags = [ + dict(name='div', attrs={'class':'cxArticleHeader'}), + dict(name='div', attrs={'id':'cxArticleBodyText'}), + ] diff --git a/resources/recipes/today_online.recipe b/resources/recipes/today_online.recipe new file mode 100644 index 0000000000..e2fc229473 --- /dev/null +++ b/resources/recipes/today_online.recipe @@ -0,0 +1,59 @@ +from calibre.ptempfile import PersistentTemporaryFile +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1276486274(BasicNewsRecipe): + title = u'Today Online - Singapore' + publisher = 'MediaCorp Press Ltd - Singapore' + __author__ = 'rty' + category = 'news, Singapore' + oldest_article = 7 + max_articles_per_feed = 100 + remove_javascript = True + use_embedded_content = False + no_stylesheets = True + language = 'en_SG' + temp_files = [] + articles_are_obfuscated = True + masthead_url = 'http://www.todayonline.com/App_Themes/Default/images/icons/TodayOnlineLogo.gif' + conversion_options = {'linearize_tables':True} + extra_css = ''' + .author{font-style: italic; font-size: small} + .date{font-style: italic; font-size: small} + .Headline{font-weight: bold; font-size: xx-large} + .headerStrap{font-weight: bold; font-size: x-large; font-syle: italic} + .bodyText{font-size: 4px;font-family: Times New Roman;} + ''' + keep_only_tags = [ + dict(name='div', attrs={'id':['fullPrintBodyHolder']}) + ] + remove_tags_after = [ dict(name='div', attrs={'class':'button'})] + + + remove_tags = [ + dict(name='div', attrs={'class':['url','button']}) + ] + feeds = [ + (u'Singapore', u'http://www.todayonline.com/RSS/Singapore'), + (u'Hot News', u'http://www.todayonline.com/RSS/Hotnews'), + (u'Today Online', u'http://www.todayonline.com/RSS/Todayonline'), + (u'Voices', u'http://www.todayonline.com/RSS/Voices'), + (u'Commentary', u'http://www.todayonline.com/RSS/Commentary'), + (u'World', u'http://www.todayonline.com/RSS/World'), + (u'Business', u'http://www.todayonline.com/RSS/Business'), + (u'Column', u'http://www.todayonline.com/RSS/Columns'), + ] + + def get_obfuscated_article(self, url): + br = self.get_browser() + br.open(url) + response = br.follow_link(url_regex = r'/Print/', nr = 0) + html = response.read() + self.temp_files.append(PersistentTemporaryFile('_fa.html')) + self.temp_files[-1].write(html) + self.temp_files[-1].close() + return self.temp_files[-1].name + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + return soup diff --git a/resources/recipes/toi.recipe b/resources/recipes/toi.recipe index ed462ae94f..9539bcade7 100644 --- a/resources/recipes/toi.recipe +++ b/resources/recipes/toi.recipe @@ -1,21 +1,16 @@ from calibre.web.feeds.news import BasicNewsRecipe -from calibre.ebooks.BeautifulSoup import BeautifulSoup class TimesOfIndia(BasicNewsRecipe): title = u'Times of India' language = 'en_IN' - __author__ = 'Krittika Goyal' + __author__ = 'Kovid Goyal' oldest_article = 1 #days max_articles_per_feed = 25 - remove_stylesheets = True + no_stylesheets = True + keep_only_tags = [dict(attrs={'class':'prttabl'})] remove_tags = [ - dict(name='iframe'), - dict(name='td', attrs={'class':'newptool1'}), - dict(name='div', attrs={'id':'newptool'}), - dict(name='ul', attrs={'class':'newtabcontent_tabs_new'}), - dict(name='b', text='Topics'), - dict(name='span', text=':'), + dict(style=lambda x: x and 'float' in x) ] feeds = [ @@ -42,13 +37,8 @@ class TimesOfIndia(BasicNewsRecipe): ('Most Read', 'http://timesofindia.indiatimes.com/rssfeedmostread.cms') ] + def print_version(self, url): + return url + '?prtpage=1' def preprocess_html(self, soup): - heading = soup.find(name='h1', attrs={'class':'heading'}) - td = heading.findParent(name='td') - td.extract() - soup = BeautifulSoup('t') - body = soup.find(name='body') - body.insert(0, td) - td.name = 'div' return soup diff --git a/resources/recipes/winnipeg_sun.recipe b/resources/recipes/winnipeg_sun.recipe new file mode 100644 index 0000000000..fe611b8d5c --- /dev/null +++ b/resources/recipes/winnipeg_sun.recipe @@ -0,0 +1,35 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1277647803(BasicNewsRecipe): + title = u'Winnipeg Sun' + __author__ = 'rty' + __version__ = '1.0' + oldest_article = 2 + pubisher = 'www.winnipegsun.com' + description = 'Winnipeg Newspaper' + category = 'News, Winnipeg, Canada' + max_articles_per_feed = 100 + no_stylesheets = True + encoding = 'UTF-8' + remove_javascript = True + use_embedded_content = False + language = 'en_CA' + feeds = [ + (u'News', u'http://www.winnipegsun.com/news/rss.xml'), + (u'Columnists', u'http://www.winnipegsun.com/columnists/rss.xml'), + (u'Editorial', u'http://www.winnipegsun.com/comment/editorial/rss.xml'), + (u'Entertainments', u'http://www.winnipegsun.com/entertainment/rss.xml'), + (u'Life', u'http://www.winnipegsun.com/life/rss.xml'), + (u'Money', u'http://www.winnipegsun.com/money/rss.xml') + ] + keep_only_tags = [ + dict(name='div', attrs={'id':'article'}), + ] + remove_tags = [ + dict(name='div', attrs={'class':['leftBox','bottomBox clear']}), + dict(name='ul', attrs={'class':'tabs dl contentSwap'}), + dict(name='div', attrs={'id':'commentsBottom'}), + ] + remove_tags_after = [ + dict(name='div', attrs={'class':'bottomBox clear'}) + ] diff --git a/resources/recipes/wsj.recipe b/resources/recipes/wsj.recipe index e8e29505c4..fd5e977d10 100644 --- a/resources/recipes/wsj.recipe +++ b/resources/recipes/wsj.recipe @@ -3,15 +3,15 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' -import string from calibre.web.feeds.news import BasicNewsRecipe +import copy # http://online.wsj.com/page/us_in_todays_paper.html class WallStreetJournal(BasicNewsRecipe): - title = 'The Wall Street Journal (US)' - __author__ = 'Kovid Goyal and Sujata Raman' + title = 'The Wall Street Journal' + __author__ = 'Kovid Goyal, Sujata Raman, and Joshua Oster-Morris' description = 'News and current affairs' needs_subscription = True language = 'en' @@ -66,7 +66,17 @@ class WallStreetJournal(BasicNewsRecipe): return soup def wsj_get_index(self): - return self.index_to_soup('http://online.wsj.com/page/us_in_todays_paper.html') + 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() @@ -75,24 +85,72 @@ class WallStreetJournal(BasicNewsRecipe): if date is not None: self.timefmt = ' [%s]'%self.tag_to_string(date) - sections = {} - sec_order = [] + cov = soup.find('a', attrs={'class':'icon pdf'}, href=True) + if cov is not None: + self.cover_url = cov['href'] + + 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']) - if container.name == 'div': - section = 'Page One' - else: - section = '' - sec = container.find('a', href=lambda x: x and '/search?' in x) - if sec is not None: - section = self.tag_to_string(sec).strip() - if not section: - h = container.find(['h1','h2','h3','h4','h5','h6']) - section = self.tag_to_string(h) - section = string.capitalize(section).replace('U.s.', 'U.S.') - if section not in sections: - sections[section] = [] - sec_order.append(section) meta = a.find(attrs={'class':'meta_sectionName'}) if meta is not None: meta.extract() @@ -103,30 +161,14 @@ class WallStreetJournal(BasicNewsRecipe): if p is not None: desc = self.tag_to_string(p) - sections[section].append({'title':title, 'url':url, + articles.append({'title':title, 'url':url, 'description':desc, 'date':''}) - self.log('Found article:', title) + self.log('\tFound article:', title) - a.extract() - for a in container.findAll('a', href=lambda x: x and '/article/' - in x): - url = a['href'] - if not url.startswith('http:'): - url = 'http://online.wsj.com'+url - title = self.tag_to_string(a).strip() - if not title or title.startswith('['): continue - if title: - sections[section].append({'title':self.tag_to_string(a), - 'url':url, 'description':'', 'date':''}) - self.log('\tFound related:', title) - - - feeds = [(sec, sections[sec]) for sec in sec_order] - return feeds + return articles def cleanup(self): self.browser.open('http://online.wsj.com/logout?url=http://online.wsj.com') - diff --git a/resources/recipes/zaobao.recipe b/resources/recipes/zaobao.recipe index bce594bafa..91a5459e18 100644 --- a/resources/recipes/zaobao.recipe +++ b/resources/recipes/zaobao.recipe @@ -15,22 +15,22 @@ class ZAOBAO(BasicNewsRecipe): no_stylesheets = True recursions = 1 language = 'zh' - encoding = 'gbk' # multithreaded_fetch = True keep_only_tags = [ - dict(name='table', attrs={'cellpadding':'9'}), - dict(name='table', attrs={'class':'cont'}), - dict(name='div', attrs={'id':'content'}), + dict(name='td', attrs={'class':'text'}), dict(name='span', attrs={'class':'page'}), + dict(name='div', attrs={'id':'content'}) ] remove_tags = [ dict(name='table', attrs={'cellspacing':'9'}), + dict(name='fieldset'), + dict(name='div', attrs={'width':'30%'}), ] - extra_css = '\ + extra_css = '\n\ @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}\n\ body{font-family: serif1, serif}\n\ .article_description{font-family: serif1, serif}\n\ @@ -41,7 +41,10 @@ class ZAOBAO(BasicNewsRecipe): .article {font-size:medium}\n\ .navbar {font-size: small}\n\ .feed{font-size: medium}\n\ - .small{font-size: small; padding-right: 8%}\n' + .small{font-size: small;padding-right: 8pt}\n\ + .text{padding-right: 8pt}\n\ + p{text-indent: 0cm}\n\ + div#content{padding-right: 10pt}' INDEXES = [ (u'\u65b0\u95fb\u56fe\u7247', u'http://www.zaobao.com/photoweb/photoweb_idx.shtml') @@ -51,27 +54,35 @@ class ZAOBAO(BasicNewsRecipe): DESC_SENSE = u'\u8054\u5408\u65e9\u62a5\u7f51' feeds = [ - (u'\u5373\u65f6\u62a5\u9053', u'http://realtime.zaobao.com/news.xml'), - (u'\u4e2d\u56fd\u65b0\u95fb', u'http://www.zaobao.com/zg/zg.xml'), - (u'\u56fd\u9645\u65b0\u95fb', u'http://www.zaobao.com/gj/gj.xml'), - (u'\u4e16\u754c\u62a5\u520a\u6587\u8403', u'http://www.zaobao.com/wencui/wencui.xml'), - (u'\u4e1c\u5357\u4e9a\u65b0\u95fb', u'http://www.zaobao.com/yx/yx.xml'), - (u'\u65b0\u52a0\u5761\u65b0\u95fb', u'http://www.zaobao.com/sp/sp.xml'), - (u'\u4eca\u65e5\u89c2\u70b9', u'http://www.zaobao.com/yl/yl.xml'), - (u'\u4e2d\u56fd\u8d22\u7ecf', u'http://www.zaobao.com/cz/cz.xml'), - (u'\u72ee\u57ce\u8d22\u7ecf', u'http://www.zaobao.com/cs/cs.xml'), - (u'\u5168\u7403\u8d22\u7ecf', u'http://www.zaobao.com/cg/cg.xml'), - (u'\u65e9\u62a5\u4f53\u80b2', u'http://www.zaobao.com/ty/ty.xml'), - (u'\u65e9\u62a5\u526f\u520a', u'http://www.zaobao.com/fk/fk.xml'), + (u'\u5373\u65f6\u62a5\u9053', u'http://realtime.zaobao.com/news.xml'), + (u'\u4e2d\u56fd\u65b0\u95fb', u'http://www.zaobao.com/zg/zg.xml'), + (u'\u56fd\u9645\u65b0\u95fb', u'http://www.zaobao.com/gj/gj.xml'), + (u'\u4e16\u754c\u62a5\u520a\u6587\u8403', u'http://www.zaobao.com/wencui/wencui.xml'), + (u'\u4e1c\u5357\u4e9a\u65b0\u95fb', u'http://www.zaobao.com/yx/yx.xml'), + (u'\u65b0\u52a0\u5761\u65b0\u95fb', u'http://www.zaobao.com/sp/sp.xml'), + (u'\u4eca\u65e5\u89c2\u70b9', u'http://www.zaobao.com/yl/yl.xml'), + (u'\u4e2d\u56fd\u8d22\u7ecf', u'http://www.zaobao.com/cz/cz.xml'), + (u'\u72ee\u57ce\u8d22\u7ecf', u'http://www.zaobao.com/cs/cs.xml'), + (u'\u5168\u7403\u8d22\u7ecf', u'http://www.zaobao.com/cg/cg.xml'), + (u'\u65e9\u62a5\u4f53\u80b2', u'http://www.zaobao.com/ty/ty.xml'), + (u'\u65e9\u62a5\u526f\u520a', u'http://www.zaobao.com/fk/fk.xml'), ] + def preprocess_html(self, soup): + for tag in soup.findAll(name='a'): + if tag.has_key('href'): + tag_url = tag['href'] + if tag_url.find('http://') != -1 and tag_url.find('zaobao.com') == -1: + del tag['href'] + return soup + def postprocess_html(self, soup, first): for tag in soup.findAll(name=['table', 'tr', 'td']): tag.name = 'div' return soup def parse_feeds(self): - self.log.debug('ZAOBAO overrided parse_feeds()') + self.log_debug(_('ZAOBAO overrided parse_feeds()')) parsed_feeds = BasicNewsRecipe.parse_feeds(self) for id, obj in enumerate(self.INDEXES): @@ -88,7 +99,7 @@ class ZAOBAO(BasicNewsRecipe): a_title = self.tag_to_string(a) date = '' description = '' - self.log.debug('adding %s at %s'%(a_title,a_url)) + self.log_debug(_('adding %s at %s')%(a_title,a_url)) articles.append({ 'title':a_title, 'date':date, @@ -97,26 +108,25 @@ class ZAOBAO(BasicNewsRecipe): }) pfeeds = feeds_from_index([(title, articles)], oldest_article=self.oldest_article, - max_articles_per_feed=self.max_articles_per_feed, - log=self.log) + max_articles_per_feed=self.max_articles_per_feed) - self.log.debug('adding %s to feed'%(title)) + self.log_debug(_('adding %s to feed')%(title)) for feed in pfeeds: - self.log.debug('adding feed: %s'%(feed.title)) + self.log_debug(_('adding feed: %s')%(feed.title)) feed.description = self.DESC_SENSE parsed_feeds.append(feed) for a, article in enumerate(feed): - self.log.debug('added article %s from %s'%(article.title, article.url)) - self.log.debug('added feed %s'%(feed.title)) + self.log_debug(_('added article %s from %s')%(article.title, article.url)) + self.log_debug(_('added feed %s')%(feed.title)) for i, feed in enumerate(parsed_feeds): # workaorund a strange problem: Somethimes the xml encoding is not apllied correctly by parse() weired_encoding_detected = False if not isinstance(feed.description, unicode) and self.encoding and feed.description: - self.log.debug('Feed %s is not encoded correctly, manually replace it'%(feed.title)) + self.log_debug(_('Feed %s is not encoded correctly, manually replace it')%(feed.title)) feed.description = feed.description.decode(self.encoding, 'replace') elif feed.description.find(self.DESC_SENSE) == -1 and self.encoding and feed.description: - self.log.debug('Feed %s is strangely encoded, manually redo all'%(feed.title)) + self.log_debug(_('Feed %s is weired encoded, manually redo all')%(feed.title)) feed.description = feed.description.encode('cp1252', 'replace').decode(self.encoding, 'replace') weired_encoding_detected = True @@ -138,7 +148,7 @@ class ZAOBAO(BasicNewsRecipe): article.text_summary = article.text_summary.encode('cp1252', 'replace').decode(self.encoding, 'replace') if article.title == "Untitled article": - self.log.debug('Removing empty article %s from %s'%(article.title, article.url)) + self.log_debug(_('Removing empty article %s from %s')%(article.title, article.url)) # remove the article feed.articles[a:a+1] = [] return parsed_feeds diff --git a/resources/templates/html.css b/resources/templates/html.css index 9e80d54f88..e9b683ca34 100644 --- a/resources/templates/html.css +++ b/resources/templates/html.css @@ -406,3 +406,8 @@ img, object, svg|svg { width: auto; height: auto; } + +/* These are needed because ADE renders anchors the same as links */ + +a { text-decoration: inherit; color: inherit; cursor: inherit } +a[href] { text-decoration: underline; color: blue; cursor: pointer } diff --git a/setup/installer/linux/freeze.py b/setup/installer/linux/freeze.py index 7353134393..8c56ed4fb7 100644 --- a/setup/installer/linux/freeze.py +++ b/setup/installer/linux/freeze.py @@ -40,13 +40,14 @@ class LinuxFreeze(Command): '/usr/bin/pdftohtml', '/usr/lib/libwmflite-0.2.so.7', '/usr/lib/liblcms.so.1', + '/usr/lib/libstlport.so.5.1', '/tmp/calibre-mount-helper', '/usr/lib/libunrar.so', '/usr/lib/libchm.so.0', '/usr/lib/libsqlite3.so.0', '/usr/lib/libsqlite3.so.0', '/usr/lib/libmng.so.1', - '/usr/lib/libpodofo.so.0.6.99', + '/usr/lib/libpodofo.so.0.8.1', '/lib/libz.so.1', '/lib/libuuid.so.1', '/usr/lib/libtiff.so.3', diff --git a/setup/installer/osx/app/main.py b/setup/installer/osx/app/main.py index 5b01c8503c..c95be6752c 100644 --- a/setup/installer/osx/app/main.py +++ b/setup/installer/osx/app/main.py @@ -265,6 +265,9 @@ class Py2App(object): @flush def get_local_dependencies(self, path_to_lib): for x in self.get_dependencies(path_to_lib): + if x.startswith('libpodofo'): + yield x, x + continue for y in (SW+'/lib/', '/usr/local/lib/', SW+'/qt/lib/', '/opt/local/lib/', '/Library/Frameworks/Python.framework/', SW+'/freetype/lib/'): @@ -397,7 +400,7 @@ class Py2App(object): @flush def add_podofo(self): info('\nAdding PoDoFo') - pdf = join(SW, 'lib', 'libpodofo.0.6.99.dylib') + pdf = join(SW, 'lib', 'libpodofo.0.8.1.dylib') self.install_dylib(pdf) @flush diff --git a/setup/installer/windows/notes.rst b/setup/installer/windows/notes.rst index 0fdecda27c..cd02c80d2e 100644 --- a/setup/installer/windows/notes.rst +++ b/setup/installer/windows/notes.rst @@ -162,9 +162,50 @@ SET(WANT_LIB64 FALSE) SET(PODOFO_BUILD_SHARED TRUE) SET(PODOFO_BUILD_STATIC FALSE) -cp build/podofo-0.7.0/build/src/Release/podofo.dll bin/ -cp build/podofo-0.7.0/build/src/Release/podofo.lib lib/ -cp build/podofo-0.7.0/build/src/Release/podofo.exp lib/ +cp build/podofo/build/src/Release/podofo.dll bin/ +cp build/podofo/build/src/Release/podofo.lib lib/ +cp build/podofo/build/src/Release/podofo.exp lib/ + +cp build/podofo/build/podofo_config.h include/podofo/ +cp -r build/podofo/src/* include/podofo/ + +The following patch was required to get it to compile: + +Index: src/PdfImage.cpp +=================================================================== +--- src/PdfImage.cpp (revision 1261) ++++ src/PdfImage.cpp (working copy) +@@ -627,7 +627,7 @@ + + long lLen = static_cast(pInfo->rowbytes * height); + char* pBuffer = static_cast(malloc(sizeof(char) * lLen)); +- png_bytep pRows[height]; ++ png_bytepp pRows = static_cast(malloc(sizeof(png_bytep)*height)); + for(int y=0; y(pBuffer + (y * pInfo->rowbytes)); +@@ -672,6 +672,7 @@ + this->SetImageData( width, height, pInfo->bit_depth, &stream ); + + free(pBuffer); ++ free(pRows); + } + #endif // PODOFO_HAVE_PNG_LIB + +Index: src/PdfFiltersPrivate.cpp +=================================================================== +--- src/PdfFiltersPrivate.cpp (revision 1261) ++++ src/PdfFiltersPrivate.cpp (working copy) +@@ -1019,7 +1019,7 @@ + /* + * Prepare for input from a memory buffer. + */ +-GLOBAL(void) ++void + jpeg_memory_src (j_decompress_ptr cinfo, const JOCTET * buffer, size_t bufsize) + { + my_src_ptr src; + ImageMagick -------------- diff --git a/setup/installer/windows/wix-template.xml b/setup/installer/windows/wix-template.xml index 35560f5162..37dd8b25a8 100644 --- a/setup/installer/windows/wix-template.xml +++ b/setup/installer/windows/wix-template.xml @@ -154,6 +154,10 @@ + + + + diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 48f2c0ecec..92ee2ca6d2 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -30,6 +30,7 @@ mimetypes.add_type('application/epub+zip', '.epub') mimetypes.add_type('text/x-sony-bbeb+xml', '.lrs') mimetypes.add_type('application/xhtml+xml', '.xhtml') mimetypes.add_type('image/svg+xml', '.svg') +mimetypes.add_type('text/fb2+xml', '.fb2') mimetypes.add_type('application/x-sony-bbeb', '.lrf') mimetypes.add_type('application/x-sony-bbeb', '.lrx') mimetypes.add_type('application/x-dtbncx+xml', '.ncx') @@ -43,6 +44,7 @@ mimetypes.add_type('application/x-mobipocket-ebook', '.prc') mimetypes.add_type('application/x-mobipocket-ebook', '.azw') mimetypes.add_type('application/x-cbz', '.cbz') mimetypes.add_type('application/x-cbr', '.cbr') +mimetypes.add_type('application/x-koboreader-ebook', '.kobo') mimetypes.add_type('image/wmf', '.wmf') guess_type = mimetypes.guess_type import cssutils @@ -340,13 +342,6 @@ def detect_ncpus(): return ans -def launch(path_or_url): - from PyQt4.QtCore import QUrl - from PyQt4.QtGui import QDesktopServices - if os.path.exists(path_or_url): - path_or_url = 'file:'+path_or_url - QDesktopServices.openUrl(QUrl(path_or_url)) - relpath = os.path.relpath _spat = re.compile(r'^the\s+|^a\s+|^an\s+', re.IGNORECASE) def english_sort(x, y): diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 4f9e1f3904..540f376ffa 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.2' +__version__ = '0.7.8' __author__ = "Kovid Goyal " import re diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 93344f4616..9d876b42d1 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -9,6 +9,7 @@ from calibre.customize import FileTypePlugin, MetadataReaderPlugin, MetadataWrit from calibre.constants import numeric_version from calibre.ebooks.metadata.archive import ArchiveExtract, get_cbz_metadata +# To archive plugins {{{ class HTML2ZIP(FileTypePlugin): name = 'HTML to ZIP' author = 'Kovid Goyal' @@ -30,6 +31,7 @@ every time you add an HTML file to the library.\ with TemporaryDirectory('_plugin_html2zip') as tdir: recs =[('debug_pipeline', tdir, OptionRecommendation.HIGH)] + recs.append(['keep_ligatures', True, OptionRecommendation.HIGH]) if self.site_customization and self.site_customization.strip(): recs.append(['input_encoding', self.site_customization.strip(), OptionRecommendation.HIGH]) @@ -81,7 +83,9 @@ class PML2PMLZ(FileTypePlugin): return of.name +# }}} +# Metadata reader plugins {{{ class ComicMetadataReader(MetadataReaderPlugin): name = 'Read comic metadata' @@ -319,7 +323,9 @@ class ZipMetadataReader(MetadataReaderPlugin): def get_metadata(self, stream, ftype): from calibre.ebooks.metadata.zip import get_metadata return get_metadata(stream) +# }}} +# Metadata writer plugins {{{ class EPUBMetadataWriter(MetadataWriterPlugin): @@ -395,6 +401,7 @@ class TOPAZMetadataWriter(MetadataWriterPlugin): from calibre.ebooks.metadata.topaz import set_metadata set_metadata(stream, mi) +# }}} from calibre.ebooks.comic.input import ComicInput from calibre.ebooks.epub.input import EPUBInput @@ -436,7 +443,7 @@ from calibre.devices.blackberry.driver import BLACKBERRY from calibre.devices.cybook.driver import CYBOOK from calibre.devices.eb600.driver import EB600, COOL_ER, SHINEBOOK, \ POCKETBOOK360, GER2, ITALICA, ECLICTO, DBOOK, INVESBOOK, \ - BOOQ, ELONEX, POCKETBOOK301 + BOOQ, ELONEX, POCKETBOOK301, MENTOR from calibre.devices.iliad.driver import ILIAD from calibre.devices.irexdr.driver import IREXDR1000, IREXDR800 from calibre.devices.jetbook.driver import JETBOOK @@ -444,7 +451,7 @@ from calibre.devices.kindle.driver import KINDLE, KINDLE2, KINDLE_DX from calibre.devices.nook.driver import NOOK from calibre.devices.prs505.driver import PRS505 from calibre.devices.android.driver import ANDROID, S60 -from calibre.devices.nokia.driver import N770, N810, E71X +from calibre.devices.nokia.driver import N770, N810, E71X, E52 from calibre.devices.eslick.driver import ESLICK, EBK52 from calibre.devices.nuut2.driver import NUUT2 from calibre.devices.iriver.driver import IRIVER_STORY @@ -453,7 +460,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 +from calibre.devices.misc import PALMPRE, AVANT, SWEEX, PDNOVEL from calibre.devices.folder_device.driver import FOLDER_DEVICE_FOR_CONFIG from calibre.devices.kobo.driver import KOBO @@ -461,8 +468,11 @@ from calibre.ebooks.metadata.fetch import GoogleBooks, ISBNDB, Amazon, \ LibraryThing from calibre.ebooks.metadata.douban import DoubanBooks from calibre.library.catalog import CSV_XML, EPUB_MOBI +from calibre.ebooks.epub.fix.unmanifested import Unmanifested +from calibre.ebooks.epub.fix.epubcheck import Epubcheck + plugins = [HTML2ZIP, PML2PMLZ, ArchiveExtract, GoogleBooks, ISBNDB, Amazon, - LibraryThing, DoubanBooks, CSV_XML, EPUB_MOBI] + LibraryThing, DoubanBooks, CSV_XML, EPUB_MOBI, Unmanifested, Epubcheck] plugins += [ ComicInput, EPUBInput, @@ -499,7 +509,6 @@ plugins += [ ] # Order here matters. The first matched device is the one used. plugins += [ - ITUNES, HANLINV3, HANLINV5, BLACKBERRY, @@ -520,6 +529,7 @@ plugins += [ S60, N770, E71X, + E52, N810, COOL_ER, ESLICK, @@ -550,6 +560,10 @@ plugins += [ AZBOOKA, FOLDER_DEVICE_FOR_CONFIG, AVANT, + MENTOR, + SWEEX, + PDNOVEL, + ITUNES, ] plugins += [x for x in list(locals().values()) if isinstance(x, type) and \ x.__name__.endswith('MetadataReader')] diff --git a/src/calibre/customize/profiles.py b/src/calibre/customize/profiles.py index 222f6128e0..0db3ce6a15 100644 --- a/src/calibre/customize/profiles.py +++ b/src/calibre/customize/profiles.py @@ -36,7 +36,7 @@ class Plugin(_Plugin): self.fnames = dict((name, sz) for name, _, sz in self.fsizes if name) self.fnums = dict((num, sz) for _, num, sz in self.fsizes if num) - +# Input profiles {{{ class InputProfile(Plugin): author = 'Kovid Goyal' @@ -218,6 +218,8 @@ input_profiles = [InputProfile, SonyReaderInput, SonyReader300Input, input_profiles.sort(cmp=lambda x,y:cmp(x.name.lower(), y.name.lower())) +# }}} + class OutputProfile(Plugin): author = 'Kovid Goyal' @@ -237,11 +239,12 @@ class OutputProfile(Plugin): # If True the MOBI renderer on the device supports MOBI indexing supports_mobi_indexing = False - # Device supports displaying a nested TOC - supports_nested_toc = True - # If True output should be optimized for a touchscreen interface touchscreen = False + touchscreen_news_css = '' + # A list of extra (beyond CSS 2.1) modules supported by the device + # Format is a cssutils profile dictionary (see iPad for example) + extra_css_modules = [] @classmethod def tags_to_string(cls, tags): @@ -256,8 +259,151 @@ class iPadOutput(OutputProfile): screen_size = (768, 1024) comic_screen_size = (768, 1024) dpi = 132.0 - supports_nested_toc = False + extra_css_modules = [ + { + 'name':'webkit', + 'props': { '-webkit-border-bottom-left-radius':'{length}', + '-webkit-border-bottom-right-radius':'{length}', + '-webkit-border-top-left-radius':'{length}', + '-webkit-border-top-right-radius':'{length}', + '-webkit-border-radius': r'{border-width}(\s+{border-width}){0,3}|inherit', + }, + 'macros': {'border-width': '{length}|medium|thick|thin'} + } + ] touchscreen = True + # touchscreen_news_css {{{ + touchscreen_news_css = u''' + /* hr used in articles */ + .article_articles_list { + width:18%; + } + .article_link { + color: #593f29; + font-style: italic; + } + .article_next { + -webkit-border-top-right-radius:4px; + -webkit-border-bottom-right-radius:4px; + font-style: italic; + width:32%; + } + + .article_prev { + -webkit-border-top-left-radius:4px; + -webkit-border-bottom-left-radius:4px; + font-style: italic; + width:32%; + } + .article_sections_list { + width:18%; + } + .articles_link { + font-weight: bold; + } + .sections_link { + font-weight: bold; + } + + + .caption_divider { + border:#ccc 1px solid; + } + + .touchscreen_navbar { + background:#c3bab2; + border:#ccc 0px solid; + border-collapse:separate; + border-spacing:1px; + margin-left: 5%; + margin-right: 5%; + width: 90%; + -webkit-border-radius:4px; + } + .touchscreen_navbar td { + background:#fff; + font-family:Helvetica; + font-size:80%; + /* UI touchboxes use 8px padding */ + padding: 6px; + text-align:center; + } + + .touchscreen_navbar td a:link { + color: #593f29; + text-decoration: none; + } + + /* Index formatting */ + .publish_date { + text-align:center; + } + .divider { + border-bottom:1em solid white; + border-top:1px solid gray; + } + + hr.caption_divider { + border-color:black; + border-style:solid; + border-width:1px; + } + + /* Feed summary formatting */ + .article_summary { + display:inline-block; + } + .feed { + font-family:sans-serif; + font-weight:bold; + font-size:larger; + } + + .feed_link { + font-style: italic; + } + + .feed_next { + -webkit-border-top-right-radius:4px; + -webkit-border-bottom-right-radius:4px; + font-style: italic; + width:40%; + } + + .feed_prev { + -webkit-border-top-left-radius:4px; + -webkit-border-bottom-left-radius:4px; + font-style: italic; + width:40%; + } + + .feed_title { + text-align: center; + font-size: 160%; + } + + .feed_up { + font-weight: bold; + width:20%; + } + + .summary_headline { + font-weight:bold; + text-align:left; + } + + .summary_byline { + text-align:left; + font-family:monospace; + } + + .summary_text { + text-align:left; + } + + ''' + # }}} + class SonyReaderOutput(OutputProfile): @@ -279,6 +425,7 @@ class KoboReaderOutput(OutputProfile): description = _('This profile is intended for the Kobo Reader.') screen_size = (590, 775) + comic_screen_size = (540, 718) dpi = 168.451 fbase = 12 fsizes = [7.5, 9, 10, 12, 15.5, 20, 22, 24] diff --git a/src/calibre/customize/ui.py b/src/calibre/customize/ui.py index 8397827fbb..31f4c69c0f 100644 --- a/src/calibre/customize/ui.py +++ b/src/calibre/customize/ui.py @@ -16,6 +16,7 @@ from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata.fetch import MetadataSource from calibre.utils.config import make_config_dir, Config, ConfigProxy, \ plugin_dir, OptionParser, prefs +from calibre.ebooks.epub.fix import ePubFixer platform = 'linux' @@ -151,13 +152,13 @@ def reread_filetype_plugins(): def _run_filetype_plugins(path_to_file, ft=None, occasion='preprocess'): - occasion = {'import':_on_import, 'preprocess':_on_preprocess, + occasion_plugins = {'import':_on_import, 'preprocess':_on_preprocess, 'postprocess':_on_postprocess}[occasion] customization = config['plugin_customization'] if ft is None: ft = os.path.splitext(path_to_file)[-1].lower().replace('.', '') nfp = path_to_file - for plugin in occasion.get(ft, []): + for plugin in occasion_plugins.get(ft, []): if is_disabled(plugin): continue plugin.site_customization = customization.get(plugin.name, '') @@ -194,7 +195,6 @@ def plugin_customization(plugin): # }}} - # Input/Output profiles {{{ def input_profiles(): for plugin in _initialized_plugins: @@ -444,6 +444,14 @@ def device_plugins(): # {{{ yield plugin # }}} +# epub fixers {{{ +def epub_fixers(): + for plugin in _initialized_plugins: + if isinstance(plugin, ePubFixer): + if not is_disabled(plugin): + if platform in plugin.supported_platforms: + yield plugin +# }}} # Initialize plugins {{{ diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index 0bbdf0f22c..5642235b31 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -34,6 +34,12 @@ class ANDROID(USBMS): # Acer 0x502 : { 0x3203 : [0x0100]}, + + # Dell + 0x413c : { 0xb007 : [0x0100]}, + + # Eken? + 0x040d : { 0x0851 : [0x0001]}, } EBOOK_DIR_MAIN = ['wordplayer/calibretransfer', 'eBooks/import', 'Books'] EXTRA_CUSTOMIZATION_MESSAGE = _('Comma separated list of directories to ' @@ -42,11 +48,12 @@ class ANDROID(USBMS): EXTRA_CUSTOMIZATION_DEFAULT = ', '.join(EBOOK_DIR_MAIN) VENDOR_NAME = ['HTC', 'MOTOROLA', 'GOOGLE_', 'ANDROID', 'ACER', - 'GT-I5700', 'SAMSUNG'] + 'GT-I5700', 'SAMSUNG', 'DELL', 'LINUX'] WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE', '__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD', - 'PROD_GT-I9000'] - WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'PROD_GT-I9000_CARD'] + 'GT-I9000', 'FILE-STOR_GADGET'] + WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'GT-I9000_CARD', + 'FILE-STOR_GADGET'] OSX_MAIN_MEM = 'HTC Android Phone Media' diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index 7a90343c29..3156542a92 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -6,18 +6,19 @@ __docformat__ = 'restructuredtext en' import cStringIO, ctypes, datetime, os, re, shutil, subprocess, sys, tempfile, time - -from calibre.constants import DEBUG +from calibre.constants import __appname__, __version__, DEBUG from calibre import fit_image from calibre.constants import isosx, iswindows from calibre.devices.errors import UserFeedback +from calibre.devices.usbms.deviceconfig import DeviceConfig from calibre.devices.interface import DevicePlugin from calibre.ebooks.BeautifulSoup import BeautifulSoup -from calibre.ebooks.metadata import MetaInformation +from calibre.ebooks.metadata import MetaInformation, authors_to_string from calibre.ebooks.metadata.epub import set_metadata from calibre.library.server.utils import strftime -from calibre.utils.config import Config, config_dir +from calibre.utils.config import config_dir from calibre.utils.date import isoformat, now, parse_date +from calibre.utils.localization import get_lang from calibre.utils.logging import Log from calibre.utils.zipfile import ZipFile @@ -34,8 +35,16 @@ if isosx: if iswindows: import pythoncom, win32com.client +class DriverBase(DeviceConfig, DevicePlugin): + # Needed for config_widget to work + FORMATS = ['epub', 'pdf'] + SUPPORTS_SUB_DIRS = True # To enable second checkbox in customize widget -class ITUNES(DevicePlugin): + @classmethod + def _config_base_name(cls): + return 'iTunes' + +class ITUNES(DriverBase): ''' Calling sequences: Initialization: @@ -75,76 +84,86 @@ class ITUNES(DevicePlugin): name = 'Apple device interface' gui_name = 'Apple device' icon = I('devices/ipad.png') - description = _('Communicate with iBooks through iTunes.') + description = _('Communicate with iTunes/iBooks.') supported_platforms = ['osx','windows'] author = 'GRiker' #: The version of this plugin as a 3-tuple (major, minor, revision) - version = (0,6,0) + version = (0,9,0) OPEN_FEEDBACK_MESSAGE = _( 'Apple device detected, launching iTunes, please wait ...') - FORMATS = ['epub'] - # Product IDs: - # 0x1292:iPhone 3G - # 0x129a:iPad + # 0x1291 iPod Touch + # 0x1292 iPhone 3G + # 0x1293 iPod Touch 2G + # 0x1294 iPhone 3GS + # 0x1297 iPhone 4 + # 0x1299 iPod Touch 3G + # 0x129a iPad VENDOR_ID = [0x05ac] - PRODUCT_ID = [0x129a] + PRODUCT_ID = [0x1292,0x1293,0x1294,0x1297,0x1299,0x129a] BCD = [0x01] # iTunes enumerations - Sources = [ - 'Unknown', - 'Library', - 'iPod', - 'AudioCD', - 'MP3CD', - 'Device', - 'RadioTuner', - 'SharedLibrary'] - + Audiobooks = [ + 'Audible file', + 'MPEG audio file', + 'Protected AAC audio file' + ] ArtworkFormat = [ - 'Unknown', - 'JPEG', - 'PNG', - 'BMP' - ] - + 'Unknown', + 'JPEG', + 'PNG', + 'BMP' + ] PlaylistKind = [ - 'Unknown', - 'Library', - 'User', - 'CD', - 'Device', - 'Radio Tuner' - ] - + 'Unknown', + 'Library', + 'User', + 'CD', + 'Device', + 'Radio Tuner' + ] PlaylistSpecialKind = [ - 'Unknown', - 'Purchased Music', - 'Party Shuffle', - 'Podcasts', - 'Folder', - 'Video', - 'Music', - 'Movies', - 'TV Shows', - 'Books', - ] - + 'Unknown', + 'Purchased Music', + 'Party Shuffle', + 'Podcasts', + 'Folder', + 'Video', + 'Music', + 'Movies', + 'TV Shows', + 'Books', + ] SearchField = [ - 'All', - 'Visible', - 'Artists', - 'Albums', - 'Composers', - 'SongNames', - ] + 'All', + 'Visible', + 'Artists', + 'Albums', + 'Composers', + 'SongNames', + ] + Sources = [ + 'Unknown', + 'Library', + 'iPod', + 'AudioCD', + 'MP3CD', + 'Device', + 'RadioTuner', + 'SharedLibrary' + ] + + # Cover art size limits + MAX_COVER_WIDTH = 510 + MAX_COVER_HEIGHT = 680 # Properties cached_books = {} cache_dir = os.path.join(config_dir, 'caches', 'itunes') + archive_path = os.path.join(cache_dir, "thumbs.zip") description_prefix = "added by calibre" ejected = False iTunes= None @@ -152,7 +171,7 @@ class ITUNES(DevicePlugin): library_orphans = None log = Log() manual_sync_mode = False - path_template = 'iTunes/%s - %s.epub' + path_template = 'iTunes/%s - %s.%s' problem_titles = [] problem_msg = None report_progress = None @@ -173,16 +192,17 @@ class ITUNES(DevicePlugin): (L{books}(oncard=None), L{books}(oncard='carda'), L{books}(oncard='cardb')). ''' + if DEBUG: + self.log.info("ITUNES.add_books_to_metadata()") task_count = float(len(self.update_list)) # Delete any obsolete copies of the book from the booklist if self.update_list: - if True: - self.log.info("ITUNES.add_books_to_metadata()") - #self._dump_booklist(booklists[0], header='before',indent=2) - #self._dump_update_list(header='before',indent=2) - #self._dump_cached_books(header='before',indent=2) + if False: + self._dump_booklist(booklists[0], header='before',indent=2) + self._dump_update_list(header='before',indent=2) + self._dump_cached_books(header='before',indent=2) for (j,p_book) in enumerate(self.update_list): if False: @@ -230,7 +250,7 @@ class ITUNES(DevicePlugin): # Add new books to booklists[0] for new_book in locations[0]: - if False: + if DEBUG: self.log.info(" adding '%s' by '%s' to booklists[0]" % (new_book.title, new_book.author)) booklists[0].append(new_book) @@ -256,11 +276,13 @@ class ITUNES(DevicePlugin): """ if not oncard: if DEBUG: - self.log.info("ITUNES:books(oncard=%s)" % oncard) + self.log.info("ITUNES:books():") + if self.settings().use_subdirs: + self.log.info(" Cover fetching/caching enabled") + else: + self.log.info(" Cover fetching/caching disabled") # Fetch a list of books from iPod device connected to iTunes - - if 'iPod' in self.sources: booklist = BookList(self.log) cached_books = {} @@ -271,11 +293,12 @@ class ITUNES(DevicePlugin): book_count = float(len(device_books)) for (i,book) in enumerate(device_books): this_book = Book(book.name(), book.artist()) - this_book.path = self.path_template % (book.name(), book.artist()) + format = 'pdf' if book.kind().startswith('PDF') else 'epub' + this_book.path = self.path_template % (book.name(), book.artist(),format) try: this_book.datetime = parse_date(str(book.date_added())).timetuple() except: - pass + this_book.datetime = time.gmtime() this_book.db_id = None this_book.device_collections = [] this_book.library_id = library_books[this_book.path] if this_book.path in library_books else None @@ -293,7 +316,7 @@ class ITUNES(DevicePlugin): 'author':[book.artist()], 'lib_book':library_books[this_book.path] if this_book.path in library_books else None, 'dev_book':book, - 'uuid': book.album() + 'uuid': book.composer() } if self.report_progress is not None: @@ -309,11 +332,12 @@ class ITUNES(DevicePlugin): book_count = float(len(device_books)) for (i,book) in enumerate(device_books): this_book = Book(book.Name, book.Artist) - this_book.path = self.path_template % (book.Name, book.Artist) + format = 'pdf' if book.KindAsString.startswith('PDF') else 'epub' + this_book.path = self.path_template % (book.Name, book.Artist,format) try: this_book.datetime = parse_date(str(book.DateAdded)).timetuple() except: - pass + this_book.datetime = time.gmtime() this_book.db_id = None this_book.device_collections = [] this_book.library_id = library_books[this_book.path] if this_book.path in library_books else None @@ -329,7 +353,8 @@ class ITUNES(DevicePlugin): 'title':book.Name, 'author':book.Artist, 'lib_book':library_books[this_book.path] if this_book.path in library_books else None, - 'uuid': book.Album + 'uuid': book.Composer, + 'format': 'pdf' if book.KindAsString.startswith('PDF') else 'epub' } if self.report_progress is not None: @@ -343,12 +368,12 @@ class ITUNES(DevicePlugin): if self.report_progress is not None: self.report_progress(1.0, _('finished')) self.cached_books = cached_books -# if DEBUG: -# self._dump_booklist(booklist, 'returning from books():') -# self._dump_cached_books('returning from books():') + if DEBUG: + self._dump_booklist(booklist, 'returning from books()', indent=2) + self._dump_cached_books('returning from books()',indent=2) return booklist else: - return [] + return BookList(self.log) def can_handle(self, device_info, debug=False): ''' @@ -359,7 +384,7 @@ class ITUNES(DevicePlugin): Confirm that: - iTunes is running - - there is an iPod-type device connected + - there is an iDevice connected This gets called first when the device fingerprint is read, so it needs to instantiate iTunes if necessary This gets called ~1x/second while device fingerprint is sensed @@ -398,7 +423,7 @@ class ITUNES(DevicePlugin): attempts -= 1 time.sleep(0.5) if DEBUG: - self.log.warning(" waiting for identified iPad, attempt #%d" % (10 - attempts)) + self.log.warning(" waiting for connected iPad, attempt #%d" % (10 - attempts)) else: if DEBUG: self.log.info(' found connected iPad') @@ -474,7 +499,7 @@ class ITUNES(DevicePlugin): attempts -= 1 time.sleep(0.5) if DEBUG: - self.log.warning(" waiting for identified iPad, attempt #%d" % (10 - attempts)) + self.log.warning(" waiting for connected iPad, attempt #%d" % (10 - attempts)) else: if DEBUG: self.log.info(' found connected iPad in iTunes') @@ -506,6 +531,21 @@ class ITUNES(DevicePlugin): ''' return (None,None) + @classmethod + def config_widget(cls): + ''' + Return a QWidget with settings for the device interface + ''' + cw = DriverBase.config_widget() + # Turn off the Save template + cw.opt_save_template.setVisible(False) + cw.label.setVisible(False) + # Repurpose the metadata checkbox + cw.opt_read_metadata.setText(_("Use Series as Category in iTunes/iBooks")) + # Repurpose the use_subdirs checkbox + cw.opt_use_subdirs.setText(_("Cache covers from iTunes/iBooks")) + return cw + def delete_books(self, paths, end_session=True): ''' Delete books at paths on device. @@ -661,21 +701,19 @@ class ITUNES(DevicePlugin): self.log.info("ITUNES.open()") # Confirm/create thumbs archive - archive_path = os.path.join(self.cache_dir, "thumbs.zip") - if not os.path.exists(self.cache_dir): if DEBUG: self.log.info(" creating thumb cache '%s'" % self.cache_dir) os.makedirs(self.cache_dir) - if not os.path.exists(archive_path): + if not os.path.exists(self.archive_path): self.log.info(" creating zip archive") - zfw = ZipFile(archive_path, mode='w') + zfw = ZipFile(self.archive_path, mode='w') zfw.writestr("iTunes Thumbs Archive",'') zfw.close() else: if DEBUG: - self.log.info(" existing thumb cache at '%s'" % archive_path) + self.log.info(" existing thumb cache at '%s'" % self.archive_path) def remove_books_from_metadata(self, paths, booklists): ''' @@ -685,23 +723,72 @@ class ITUNES(DevicePlugin): @param booklists: A tuple containing the result of calls to (L{books}(oncard=None), L{books}(oncard='carda'), L{books}(oncard='cardb')). + + NB: This will not find books that were added by a different installation of calibre + as uuids are different ''' if DEBUG: self.log.info("ITUNES.remove_books_from_metadata()") for path in paths: - self._dump_cached_book(self.cached_books[path], indent=2) + if DEBUG: + self._dump_cached_book(self.cached_books[path], indent=2) + self.log.info(" looking for '%s' by '%s' (%s)" % + (self.cached_books[path]['title'], + self.cached_books[path]['author'], + self.cached_books[path]['uuid'])) - # Purge the booklist, self.cached_books + # Purge the booklist, self.cached_books, thumb cache for i,bl_book in enumerate(booklists[0]): - if bl_book.uuid == self.cached_books[path]['uuid']: - # Remove from booklists[0] - booklists[0].pop(i) + if False: + self.log.info(" evaluating '%s' by '%s' (%s)" % + (bl_book.title, bl_book.author,bl_book.uuid)) + found = False + if bl_book.uuid == self.cached_books[path]['uuid']: + if False: + self.log.info(" matched with uuid") + booklists[0].pop(i) + found = True + elif bl_book.title == self.cached_books[path]['title'] and \ + bl_book.author[0] == self.cached_books[path]['author']: + if False: + self.log.info(" matched with title + author") + booklists[0].pop(i) + found = True + + if found: + # Remove from self.cached_books for cb in self.cached_books: if self.cached_books[cb]['uuid'] == self.cached_books[path]['uuid']: self.cached_books.pop(cb) break + + # Remove from thumb from thumb cache + thumb_path = path.rpartition('.')[0] + '.jpg' + zf = ZipFile(self.archive_path,'a') + fnames = zf.namelist() + try: + thumb = [x for x in fnames if thumb_path in x][0] + except: + thumb = None + if thumb: + if DEBUG: + self.log.info(" deleting '%s' from cover cache" % (thumb_path)) + zf.delete(thumb_path) + else: + if DEBUG: + self.log.info(" '%s' not found in cover cache" % thumb_path) + zf.close() + break +# else: +# if DEBUG: +# self.log.error(" unable to find '%s' by '%s' (%s)" % +# (bl_book.title, bl_book.author,bl_book.uuid)) + + if False: + self._dump_booklist(booklists[0], indent = 2) + self._dump_cached_books(indent=2) def reset(self, key='-1', log_packets=False, report_progress=None, detected_device=None) : @@ -726,17 +813,6 @@ class ITUNES(DevicePlugin): ''' self.report_progress = report_progress - def settings(self): - ''' - Should return an opts object. The opts object should have one attribute - `format_map` which is an ordered list of formats for the device. - ''' - klass = self if isinstance(self, type) else self.__class__ - c = Config('device_drivers_%s' % klass.__name__, _('settings for device drivers')) - c.add_opt('format_map', default=self.FORMATS, - help=_('Ordered list of formats the device will accept')) - return c.parse() - def sync_booklists(self, booklists, end_session=True): ''' Update metadata on device. @@ -744,6 +820,10 @@ class ITUNES(DevicePlugin): (L{books}(oncard=None), L{books}(oncard='carda'), L{books}(oncard='cardb')). ''' + + if DEBUG: + self.log.info("ITUNES.sync_booklists()") + if self.update_needed: if DEBUG: self.log.info(' calling _update_device') @@ -806,29 +886,35 @@ class ITUNES(DevicePlugin): self.problem_msg = _("Some cover art could not be converted.\n" "Click 'Show Details' for a list.") - if False: + if DEBUG: self.log.info("ITUNES.upload_books()") self._dump_files(files, header='upload_books()',indent=2) self._dump_update_list(header='upload_books()',indent=2) if isosx: for (i,file) in enumerate(files): - path = self.path_template % (metadata[i].title, metadata[i].author[0]) + format = file.rpartition('.')[2].lower() + path = self.path_template % (metadata[i].title, metadata[i].author[0],format) self._remove_existing_copy(path, metadata[i]) - fpath = self._get_fpath(file, metadata[i], update_md=True) + fpath = self._get_fpath(file, metadata[i], format, update_md=True) db_added, lb_added = self._add_new_copy(fpath, metadata[i]) - thumb = self._cover_to_thumb(path, metadata[i], db_added, lb_added) - this_book = self._create_new_book(fpath, metadata[i], path, db_added, lb_added, thumb) + thumb = self._cover_to_thumb(path, metadata[i], db_added, lb_added, format) + this_book = self._create_new_book(fpath, metadata[i], path, db_added, lb_added, thumb, format) new_booklist.append(this_book) self._update_iTunes_metadata(metadata[i], db_added, lb_added, this_book) - # Add new_book to self.cached_paths + # Add new_book to self.cached_books + if DEBUG: + self.log.info(" adding '%s' by '%s' ['%s'] to self.cached_books" % + ( metadata[i].title, metadata[i].author, metadata[i].uuid)) self.cached_books[this_book.path] = { - 'title': metadata[i].title, 'author': metadata[i].author, - 'lib_book': lb_added, 'dev_book': db_added, - 'uuid': metadata[i].uuid} + 'format': format, + 'lib_book': lb_added, + 'title': metadata[i].title, + 'uuid': metadata[i].uuid } + # Report progress if self.report_progress is not None: @@ -840,9 +926,10 @@ class ITUNES(DevicePlugin): self.iTunes = win32com.client.Dispatch("iTunes.Application") for (i,file) in enumerate(files): - path = self.path_template % (metadata[i].title, metadata[i].author[0]) + format = file.rpartition('.')[2].lower() + path = self.path_template % (metadata[i].title, metadata[i].author[0],format) self._remove_existing_copy(path, metadata[i]) - fpath = self._get_fpath(file, metadata[i], update_md=True) + fpath = self._get_fpath(file, metadata[i],format, update_md=True) db_added, lb_added = self._add_new_copy(fpath, metadata[i]) if self.manual_sync_mode and not db_added: @@ -851,17 +938,18 @@ class ITUNES(DevicePlugin): "Click 'Show Details...' for affected books.") self.problem_titles.append("'%s' by %s" % (metadata[i].title, metadata[i].author[0])) - thumb = self._cover_to_thumb(path, metadata[i], lb_added, db_added) - this_book = self._create_new_book(fpath, metadata[i], path, db_added, lb_added, thumb) + thumb = self._cover_to_thumb(path, metadata[i], db_added, lb_added, format) + this_book = self._create_new_book(fpath, metadata[i], path, db_added, lb_added, thumb, format) new_booklist.append(this_book) self._update_iTunes_metadata(metadata[i], db_added, lb_added, this_book) # Add new_book to self.cached_paths self.cached_books[this_book.path] = { - 'title': metadata[i].title, 'author': metadata[i].author[0], - 'lib_book': lb_added, 'dev_book': db_added, + 'format': format, + 'lib_book': lb_added, + 'title': metadata[i].title, 'uuid': metadata[i].uuid} # Report progress @@ -962,7 +1050,8 @@ class ITUNES(DevicePlugin): db_added = self._find_device_book( {'title': metadata.title, 'author': metadata.authors[0], - 'uuid': metadata.uuid}) + 'uuid': metadata.uuid, + 'format': fpath.rpartition('.')[2].lower()}) return db_added @@ -1015,7 +1104,8 @@ class ITUNES(DevicePlugin): added = self._find_library_book( { 'title': metadata.title, 'author': metadata.author[0], - 'uuid': metadata.uuid}) + 'uuid': metadata.uuid, + 'format': file.rpartition('.')[2].lower()}) return added def _add_new_copy(self, fpath, metadata): @@ -1041,46 +1131,82 @@ class ITUNES(DevicePlugin): return db_added, lb_added - def _cover_to_thumb(self, path, metadata, db_added, lb_added): + def _cover_to_thumb(self, path, metadata, db_added, lb_added, format): ''' assumes pythoncom wrapper for db_added + as of iTunes 9.2, iBooks 1.1, can't set artwork for PDF files via automation ''' self.log.info(" ITUNES._cover_to_thumb()") + thumb = None if metadata.cover: - if isosx: - cover_data = open(metadata.cover,'rb') - if lb_added: - lb_added.artworks[1].data_.set(cover_data.read()) - if db_added: - # The following command generates an error, but the artwork does in fact - # get sent to the device. Seems like a bug in Apple's automation interface - try: - db_added.artworks[1].data_.set(cover_data.read()) - except: + if format == 'epub': + # Pre-shrink cover + # self.MAX_COVER_WIDTH, self.MAX_COVER_HEIGHT + try: + img = PILImage.open(metadata.cover) + width = img.size[0] + height = img.size[1] + scaled, nwidth, nheight = fit_image(width, height, self.MAX_COVER_WIDTH, self.MAX_COVER_HEIGHT) + if scaled: if DEBUG: - self.log.warning(" iTunes automation interface reported an error" - " when adding artwork to '%s'" % metadata.title) - #import traceback - #traceback.print_exc() - #from calibre import ipython - #ipython(user_ns=locals()) - pass - - - elif iswindows: - if lb_added: - if lb_added.Artwork.Count: - lb_added.Artwork.Item(1).SetArtworkFromFile(metadata.cover) + self.log.info(" '%s' scaled from %sx%s to %sx%s" % + (metadata.cover,width,height,nwidth,nheight)) + img = img.resize((nwidth, nheight), PILImage.ANTIALIAS) + cd = cStringIO.StringIO() + img.convert('RGB').save(cd, 'JPEG') + cover_data = cd.getvalue() + cd.close() else: - lb_added.AddArtworkFromFile(metadata.cover) + with open(metadata.cover,'r+b') as cd: + cover_data = cd.read() + except: + self.problem_titles.append("'%s' by %s" % (metadata.title, metadata.author[0])) + self.log.error(" error scaling '%s' for '%s'" % (metadata.cover,metadata.title)) + return thumb - if db_added: - if db_added.Artwork.Count: - db_added.Artwork.Item(1).SetArtworkFromFile(metadata.cover) - else: - db_added.AddArtworkFromFile(metadata.cover) + if isosx: + if lb_added: + lb_added.artworks[1].data_.set(cover_data) + + if db_added: + # The following command generates an error, but the artwork does in fact + # get sent to the device. Seems like a bug in Apple's automation interface + try: + db_added.artworks[1].data_.set(cover_data) + except: + if DEBUG: + self.log.warning(" iTunes automation interface reported an error" + " when adding artwork to '%s' on the iDevice" % metadata.title) + #import traceback + #traceback.print_exc() + #from calibre import ipython + #ipython(user_ns=locals()) + pass + + + elif iswindows: + # Write the data to a real file for Windows iTunes + tc = os.path.join(tempfile.gettempdir(), "cover.jpg") + with open(tc,'wb') as tmp_cover: + tmp_cover.write(cover_data) + + if lb_added: + if lb_added.Artwork.Count: + lb_added.Artwork.Item(1).SetArtworkFromFile(tc) + else: + lb_added.AddArtworkFromFile(tc) + + if db_added: + if db_added.Artwork.Count: + db_added.Artwork.Item(1).SetArtworkFromFile(tc) + else: + db_added.AddArtworkFromFile(tc) + + elif format == 'pdf': + if DEBUG: + self.log.info(" unable to set PDF cover via automation interface") try: # Resize for thumb @@ -1091,31 +1217,35 @@ class ITUNES(DevicePlugin): of = cStringIO.StringIO() im.convert('RGB').save(of, 'JPEG') thumb = of.getvalue() + of.close() # Refresh the thumbnail cache if DEBUG: - self.log.info( " refreshing cached thumb for '%s'" % metadata.title) - archive_path = os.path.join(self.cache_dir, "thumbs.zip") - zfw = ZipFile(archive_path, mode='a') + self.log.info( " refreshing cached thumb for '%s'" % metadata.title) + zfw = ZipFile(self.archive_path, mode='a') thumb_path = path.rpartition('.')[0] + '.jpg' zfw.writestr(thumb_path, thumb) - zfw.close() except: self.problem_titles.append("'%s' by %s" % (metadata.title, metadata.author[0])) - self.log.error(" error converting '%s' to thumb for '%s'" % (metadata.cover,metadata.title)) + self.log.error(" error converting '%s' to thumb for '%s'" % (metadata.cover,metadata.title)) + finally: + zfw.close() + else: + if DEBUG: + self.log.info(" no cover defined in metadata for '%s'" % metadata.title) + return thumb - return thumb - - def _create_new_book(self,fpath, metadata, path, db_added, lb_added, thumb): + def _create_new_book(self,fpath, metadata, path, db_added, lb_added, thumb, format): ''' ''' if DEBUG: self.log.info(" ITUNES._create_new_book()") - this_book = Book(metadata.title, metadata.author[0]) - + this_book = Book(metadata.title, authors_to_string(metadata.author)) + this_book.datetime = time.gmtime() this_book.db_id = None this_book.device_collections = [] + this_book.format = format this_book.library_id = lb_added this_book.path = path this_book.thumbnail = thumb @@ -1165,7 +1295,8 @@ class ITUNES(DevicePlugin): plist = None if plist: if DEBUG: - self.log.info(" deleting %s from %s" % (pl_name,fpath)) + self.log.info(" _delete_iTunesMetadata_plist():") + self.log.info(" deleting '%s'\n from '%s'" % (pl_name,fpath)) zf.delete(pl_name) zf.close() @@ -1264,18 +1395,18 @@ class ITUNES(DevicePlugin): def _dump_cached_book(self, cached_book, header=None,indent=0): ''' ''' - if header: - msg = '%s%s' % (' '*indent,header) - self.log.info(msg) - self.log.info( "%s%s" % (' '*indent, '-' * len(msg))) if isosx: - self.log.info("%s%-40.40s %-30.30s %-10.10s %-10.10s %s" % - (' '*indent, - 'title', - 'author', - 'lib_book', - 'dev_book', - 'uuid')) + if header: + msg = '%s%s' % (' '*indent,header) + self.log.info(msg) + self.log.info( "%s%s" % (' '*indent, '-' * len(msg))) + self.log.info("%s%-40.40s %-30.30s %-10.10s %-10.10s %s" % + (' '*indent, + 'title', + 'author', + 'lib_book', + 'dev_book', + 'uuid')) self.log.info("%s%-40.40s %-30.30s %-10.10s %-10.10s %s" % (' '*indent, cached_book['title'], @@ -1284,14 +1415,17 @@ class ITUNES(DevicePlugin): str(cached_book['dev_book'])[-9:], cached_book['uuid'])) elif iswindows: + if header: + msg = '%s%s' % (' '*indent,header) + self.log.info(msg) + self.log.info( "%s%s" % (' '*indent, '-' * len(msg))) + self.log.info("%s%-40.40s %-30.30s %s" % (' '*indent, cached_book['title'], cached_book['author'], cached_book['uuid'])) - self.log.info() - def _dump_cached_books(self, header=None, indent=0): ''' ''' @@ -1310,10 +1444,11 @@ class ITUNES(DevicePlugin): self.cached_books[cb]['uuid'])) elif iswindows: for cb in self.cached_books.keys(): - self.log.info("%s%-40.40s %-30.30s %s" % + self.log.info("%s%-40.40s %-30.30s %-4.4s %s" % (' '*indent, self.cached_books[cb]['title'], self.cached_books[cb]['author'], + self.cached_books[cb]['format'], self.cached_books[cb]['uuid'])) self.log.info() @@ -1329,8 +1464,9 @@ class ITUNES(DevicePlugin): fnames = zf.namelist() opf = [x for x in fnames if '.opf' in x][0] if opf: - opf_raw = cStringIO.StringIO(zf.read(opf)).getvalue() - soup = BeautifulSoup(opf_raw) + opf_raw = cStringIO.StringIO(zf.read(opf)) + soup = BeautifulSoup(opf_raw.getvalue()) + opf_raw.close() title = soup.find('dc:title').renderContents() author = soup.find('dc:creator').renderContents() ts = soup.find('meta',attrs={'name':'calibre:timestamp'}) @@ -1410,24 +1546,60 @@ class ITUNES(DevicePlugin): if iswindows: dev_books = self._get_device_books_playlist() if DEBUG: - self.log.info(" ITUNES._find_device_book(uuid)") - self.log.info(" searching for %s ('%s' by %s)" % - (search['uuid'], search['title'], search['author'])) + self.log.info(" ITUNES._find_device_book()") + self.log.info(" searching for '%s' by '%s' (%s)" % + (search['title'], search['author'],search['uuid'])) attempts = 9 while attempts: - # Try by uuid - hits = dev_books.Search(search['uuid'],self.SearchField.index('Albums')) - if hits: - hit = hits[0] - self.log.info(" found '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Album)) - return hit + # Try by uuid - only one hit + if 'uuid' in search and search['uuid']: + if DEBUG: + self.log.info(" searching by uuid '%s' ..." % search['uuid']) + hits = dev_books.Search(search['uuid'],self.SearchField.index('All')) + if hits: + hit = hits[0] + self.log.info(" found '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Composer)) + return hit - # Try by author - hits = dev_books.Search(search['author'],self.SearchField.index('Artists')) + # Try by author - there could be multiple hits + if search['author']: + if DEBUG: + self.log.info(" searching by author '%s' ..." % search['author']) + hits = dev_books.Search(search['author'],self.SearchField.index('Artists')) + if hits: + for hit in hits: + if hit.Name == search['title']: + if DEBUG: + self.log.info(" found '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Composer)) + return hit + + # Search by title if no author available + if DEBUG: + self.log.info(" searching by title '%s' ..." % search['title']) + hits = dev_books.Search(search['title'],self.SearchField.index('All')) if hits: - hit = hits[0] - self.log.info(" found '%s' by %s" % (hit.Name, hit.Artist)) - return hit + for hit in hits: + if hit.Name == search['title']: + if DEBUG: + self.log.info(" found '%s'" % (hit.Name)) + return hit + + # PDF just sent, title not updated yet, look for export pattern + # PDF metadata was rewritten at export as 'safe(title) - safe(author)' + if search['format'] == 'pdf': + title = re.sub(r'[^0-9a-zA-Z ]', '_', search['title']) + author = re.sub(r'[^0-9a-zA-Z ]', '_', search['author']) + if DEBUG: + self.log.info(" searching by name: '%s - %s'" % (title,author)) + hits = dev_books.Search('%s - %s' % (title,author), + self.SearchField.index('All')) + if hits: + hit = hits[0] + self.log.info(" found '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Composer)) + return hit + else: + if DEBUG: + self.log.info(" no PDF hits") attempts -= 1 time.sleep(0.5) @@ -1438,19 +1610,21 @@ class ITUNES(DevicePlugin): self.log.error(" no hits") return None - def _find_library_book(self, cached_book): + def _find_library_book(self, search): ''' Windows-only method to get a handle to a library book in the current pythoncom session ''' if iswindows: if DEBUG: self.log.info(" ITUNES._find_library_book()") - if 'uuid' in cached_book: + ''' + if 'uuid' in search: self.log.info(" looking for '%s' by %s (%s)" % - (cached_book['title'], cached_book['author'], cached_book['uuid'])) + (search['title'], search['author'], search['uuid'])) else: self.log.info(" looking for '%s' by %s" % - (cached_book['title'], cached_book['author'])) + (search['title'], search['author'])) + ''' for source in self.iTunes.sources: if source.Kind == self.Sources.index('Library'): @@ -1475,24 +1649,59 @@ class ITUNES(DevicePlugin): if DEBUG: self.log.error(" no Books playlist found") + attempts = 9 while attempts: - # Find book whose Album field = cached_book['uuid'] - if 'uuid' in cached_book: - hits = lib_books.Search(cached_book['uuid'],self.SearchField.index('Albums')) + # Find book whose Album field = search['uuid'] + if 'uuid' in search and search['uuid']: + if DEBUG: + self.log.info(" searching by uuid '%s' ..." % search['uuid']) + hits = lib_books.Search(search['uuid'],self.SearchField.index('All')) if hits: hit = hits[0] if DEBUG: - self.log.info(" found '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Album)) + self.log.info(" found '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Composer)) return hit - hits = lib_books.Search(cached_book['author'],self.SearchField.index('Artists')) + # Search by author if known + if search['author']: + if DEBUG: + self.log.info(" searching by author '%s' ..." % search['author']) + hits = lib_books.Search(search['author'],self.SearchField.index('Artists')) + if hits: + for hit in hits: + if hit.Name == search['title']: + if DEBUG: + self.log.info(" found '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Composer)) + return hit + + # Search by title if no author available + if DEBUG: + self.log.info(" searching by title '%s' ..." % search['title']) + hits = lib_books.Search(search['title'],self.SearchField.index('All')) if hits: - hit = hits[0] - if hit.Name == cached_book['title']: - if DEBUG: - self.log.info(" found '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Album)) + for hit in hits: + if hit.Name == search['title']: + if DEBUG: + self.log.info(" found '%s'" % (hit.Name)) + return hit + + # PDF just sent, title not updated yet, look for export pattern + # PDF metadata was rewritten at export as 'safe(title) - safe(author)' + if search['format'] == 'pdf': + title = re.sub(r'[^0-9a-zA-Z ]', '_', search['title']) + author = re.sub(r'[^0-9a-zA-Z ]', '_', search['author']) + if DEBUG: + self.log.info(" searching by name: %s - %s" % (title,author)) + hits = lib_books.Search('%s - %s' % (title,author), + self.SearchField.index('All')) + if hits: + hit = hits[0] + self.log.info(" found '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Composer)) return hit + else: + if DEBUG: + self.log.info(" no PDF hits") attempts -= 1 time.sleep(0.5) @@ -1500,7 +1709,7 @@ class ITUNES(DevicePlugin): self.log.warning(" attempt #%d" % (10 - attempts)) if DEBUG: - self.log.error(" search for '%s' yielded no hits" % cached_book['title']) + self.log.error(" search for '%s' yielded no hits" % search['title']) return None def _generate_thumbnail(self, book_path, book): @@ -1508,50 +1717,90 @@ class ITUNES(DevicePlugin): Convert iTunes artwork to thumbnail Cache generated thumbnails cache_dir = os.path.join(config_dir, 'caches', 'itunes') + as of iTunes 9.2, iBooks 1.1, can't set artwork for PDF files via automation ''' - archive_path = os.path.join(self.cache_dir, "thumbs.zip") - thumb_path = book_path.rpartition('.')[0] + '.jpg' - - try: - zfr = ZipFile(archive_path) - thumb_data = zfr.read(thumb_path) - zfr.close() - except: - zfw = ZipFile(archive_path, mode='a') - else: + # self.settings().use_subdirs is a repurposed DeviceConfig field + # We're using it to skip fetching/caching covers to speed things up + if not self.settings().use_subdirs: + thumb_data = None return thumb_data - self.log.info(" ITUNES._generate_thumbnail()") + thumb_path = book_path.rpartition('.')[0] + '.jpg' if isosx: + title = book.name() + elif iswindows: + title = book.Name + + try: + zfr = ZipFile(self.archive_path) + thumb_data = zfr.read(thumb_path) + if thumb_data == 'None': + if False: + self.log.info(" ITUNES._generate_thumbnail()\n returning None from cover cache for '%s'" % title) + zfr.close() + return None + except: + zfw = ZipFile(self.archive_path, mode='a') + else: + if False: + self.log.info(" returning thumb from cache for '%s'" % title) + return thumb_data + + if DEBUG: + self.log.info(" ITUNES._generate_thumbnail():") + if isosx: + + # Fetch the artwork from iTunes try: - # Resize the cover data = book.artworks[1].raw_data().data - #self._dump_hex(data[:256]) - im = PILImage.open(cStringIO.StringIO(data)) + except: + # If no artwork, write an empty marker to cache + if DEBUG: + self.log.error(" error fetching iTunes artwork for '%s'" % title) + zfw.writestr(thumb_path, 'None') + zfw.close() + return None + + # Generate a thumb + try: + img_data = cStringIO.StringIO(data) + im = PILImage.open(img_data) scaled, width, height = fit_image(im.size[0],im.size[1], 60, 80) im = im.resize((int(width),int(height)), PILImage.ANTIALIAS) + thumb = cStringIO.StringIO() im.convert('RGB').save(thumb,'JPEG') - + thumb_data = thumb.getvalue() + thumb.close() + if False: + self.log.info(" generated thumb for '%s', caching" % title) # Cache the tagged thumb - if DEBUG: - self.log.info(" generated thumb for '%s', caching" % book.name()) - zfw.writestr(thumb_path, thumb.getvalue()) - zfw.close() - return thumb.getvalue() + zfw.writestr(thumb_path, thumb_data) except: - self.log.error(" error generating thumb for '%s'" % book.name()) - return None + if DEBUG: + self.log.error(" error generating thumb for '%s', caching empty marker" % book.name()) + self._dump_hex(data[:32]) + thumb_data = None + # Cache the empty cover + zfw.writestr(thumb_path, 'None') + finally: + img_data.close() + zfw.close() + + return thumb_data + elif iswindows: - if not book.Artwork.Count: if DEBUG: - self.log.info(" no artwork available") + self.log.info(" no artwork available for '%s'" % book.Name) + zfw.writestr(thumb_path, 'None') + zfw.close() return None - # Save the cover from iTunes + # Fetch the artwork from iTunes + try: tmp_thumb = os.path.join(tempfile.gettempdir(), "thumb.%s" % self.ArtworkFormat[book.Artwork.Item(1).Format]) book.Artwork.Item(1).SaveArtworkToFile(tmp_thumb) @@ -1561,32 +1810,43 @@ class ITUNES(DevicePlugin): im = im.resize((int(width),int(height)), PILImage.ANTIALIAS) thumb = cStringIO.StringIO() im.convert('RGB').save(thumb,'JPEG') + thumb_data = thumb.getvalue() os.remove(tmp_thumb) - - # Cache the tagged thumb - if DEBUG: + thumb.close() + if False: self.log.info(" generated thumb for '%s', caching" % book.Name) - zfw.writestr(thumb_path, thumb.getvalue()) - zfw.close() - return thumb.getvalue() + # Cache the tagged thumb + zfw.writestr(thumb_path, thumb_data) except: - self.log.error(" error generating thumb for '%s'" % book.Name) - return None + if DEBUG: + self.log.error(" error generating thumb for '%s', caching empty marker" % book.Name) + self._dump_hex(data[:32]) + thumb_data = None + # Cache the empty cover + zfw.writestr(thumb_path,'None') + + finally: + zfw.close() + + return thumb_data def _get_device_book_size(self, file, compressed_size): ''' Calculate the exploded size of file ''' - myZip = ZipFile(file,'r') - myZipList = myZip.infolist() - exploded_file_size = 0 - for file in myZipList: - exploded_file_size += file.file_size - if False: - self.log.info(" ITUNES._get_device_book_size()") - self.log.info(" %d items in archive" % len(myZipList)) - self.log.info(" compressed: %d exploded: %d" % (compressed_size, exploded_file_size)) - myZip.close() + exploded_file_size = compressed_size + format = file.rpartition('.')[2].lower() + if format == 'epub': + myZip = ZipFile(file,'r') + myZipList = myZip.infolist() + exploded_file_size = 0 + for file in myZipList: + exploded_file_size += file.file_size + if False: + self.log.info(" ITUNES._get_device_book_size()") + self.log.info(" %d items in archive" % len(myZipList)) + self.log.info(" compressed: %d exploded: %d" % (compressed_size, exploded_file_size)) + myZip.close() return exploded_file_size def _get_device_books(self): @@ -1612,12 +1872,12 @@ class ITUNES(DevicePlugin): for book in books: # This may need additional entries for international iTunes users - if book.kind() in ['MPEG audio file']: + if book.kind() in self.Audiobooks: if DEBUG: self.log.info(" ignoring '%s' of type '%s'" % (book.name(), book.kind())) else: if DEBUG: - self.log.info(" %-30.30s %-30.30s %s [%s]" % + self.log.info(" %-30.30s %-30.30s %-40.40s [%s]" % (book.name(), book.artist(), book.album(), book.kind())) device_books.append(book) if DEBUG: @@ -1644,12 +1904,12 @@ class ITUNES(DevicePlugin): for book in dev_books: # This may need additional entries for international iTunes users - if book.KindAsString in ['MPEG audio file']: + if book.KindAsString in self.Audiobooks: if DEBUG: self.log.info(" ignoring '%s' of type '%s'" % (book.Name, book.KindAsString)) else: if DEBUG: - self.log.info(" %-30.30s %-30.30s %s [%s]" % (book.Name, book.Artist, book.Album, book.KindAsString)) + self.log.info(" %-30.30s %-30.30s %-40.40s [%s]" % (book.Name, book.Artist, book.Album, book.KindAsString)) device_books.append(book) if DEBUG: self.log.info() @@ -1663,8 +1923,6 @@ class ITUNES(DevicePlugin): ''' assumes pythoncom wrapper ''' -# if DEBUG: -# self.log.info(" ITUNES._get_device_books_playlist()") if iswindows: if 'iPod' in self.sources: pl = None @@ -1680,7 +1938,7 @@ class ITUNES(DevicePlugin): self.log.error(" no iPad|Books playlist found") return pl - def _get_fpath(self,file, metadata, update_md=False): + def _get_fpath(self,file, metadata, format, update_md=False): ''' If the database copy will be deleted after upload, we have to use file (the PersistentTemporaryFile), which will be around until @@ -1702,16 +1960,11 @@ class ITUNES(DevicePlugin): else: # Recipe - PTF if DEBUG: - self.log.info(" file will be deleted after upload") + self.log.info(" file will be deleted after upload") - if update_md: + if format == 'epub' and update_md: self._update_epub_metadata(fpath, metadata) -# if DEBUG: -# self.log.info(" metadata before rewrite: '{0[0]}' '{0[1]}' '{0[2]}'".format(self._dump_epub_metadata(fpath))) -# self._update_epub_metadata(fpath, metadata) -# if DEBUG: -# self.log.info(" metadata after rewrite: '{0[0]}' '{0[1]}' '{0[2]}'".format(self._dump_epub_metadata(fpath))) return fpath def _get_library_books(self): @@ -1752,21 +2005,27 @@ class ITUNES(DevicePlugin): lib_books = pl.file_tracks() for book in lib_books: # This may need additional entries for international iTunes users - if book.kind() in ['MPEG audio file']: + if book.kind() in self.Audiobooks: if DEBUG: self.log.info(" ignoring '%s' of type '%s'" % (book.name(), book.kind())) else: # Collect calibre orphans - remnants of recipe uploads - path = self.path_template % (book.name(), book.artist()) + format = 'pdf' if book.kind().startswith('PDF') else 'epub' + path = self.path_template % (book.name(), book.artist(),format) if str(book.description()).startswith(self.description_prefix): - if book.location() == appscript.k.missing_value: - library_orphans[path] = book - if False: - self.log.info(" found iTunes PTF '%s' in Library|Books" % book.name()) + try: + if book.location() == appscript.k.missing_value: + library_orphans[path] = book + if False: + self.log.info(" found iTunes PTF '%s' in Library|Books" % book.name()) + except: + if DEBUG: + self.log.error(" iTunes returned an error returning .location() with %s" % book.name()) library_books[path] = book if DEBUG: - self.log.info(" %-30.30s %-30.30s %s [%s]" % (book.name(), book.artist(), book.album(), book.kind())) + self.log.info(" %-30.30s %-30.30s %-40.40s [%s]" % + (book.name(), book.artist(), book.album(), book.kind())) else: if DEBUG: self.log.info(' no Library playlists') @@ -1804,11 +2063,12 @@ class ITUNES(DevicePlugin): try: for book in lib_books: # This may need additional entries for international iTunes users - if book.KindAsString in ['MPEG audio file']: + if book.KindAsString in self.Audiobooks: if DEBUG: self.log.info(" ignoring %-30.30s of type '%s'" % (book.Name, book.KindAsString)) else: - path = self.path_template % (book.Name, book.Artist) + format = 'pdf' if book.KindAsString.startswith('PDF') else 'epub' + path = self.path_template % (book.Name, book.Artist,format) # Collect calibre orphans if book.Description.startswith(self.description_prefix): @@ -1819,7 +2079,7 @@ class ITUNES(DevicePlugin): library_books[path] = book if DEBUG: - self.log.info(" %-30.30s %-30.30s %s [%s]" % (book.Name, book.Artist, book.Album, book.KindAsString)) + self.log.info(" %-30.30s %-30.30s %-40.40s [%s]" % (book.Name, book.Artist, book.Album, book.KindAsString)) except: if DEBUG: self.log.info(" no books in library") @@ -1852,8 +2112,12 @@ class ITUNES(DevicePlugin): Check for >1 iPod device connected to iTunes ''' if isosx: - names = [s.name() for s in self.iTunes.sources()] - kinds = [str(s.kind()).rpartition('.')[2] for s in self.iTunes.sources()] + try: + names = [s.name() for s in self.iTunes.sources()] + kinds = [str(s.kind()).rpartition('.')[2] for s in self.iTunes.sources()] + except: + # User probably quit iTunes + return {} elif iswindows: # Assumes a pythoncom wrapper it_sources = ['Unknown','Library','iPod','AudioCD','MP3CD','Device','RadioTuner','SharedLibrary'] @@ -1893,8 +2157,13 @@ class ITUNES(DevicePlugin): running_apps = appscript.app('System Events') if not 'iTunes' in running_apps.processes.name(): if DEBUG: - self.log.info( "ITUNES:open(): Launching iTunes" ) - self.iTunes = iTunes= appscript.app('iTunes', hide=True) + self.log.info( "ITUNES:_launch_iTunes(): Launching iTunes" ) + try: + self.iTunes = iTunes= appscript.app('iTunes', hide=True) + except: + self.iTunes = None + raise UserFeedback(' ITUNES._launch_iTunes(): unable to find installed iTunes', details=None, level=UserFeedback.WARN) + iTunes.run() self.initial_status = 'launched' else: @@ -1912,35 +2181,60 @@ class ITUNES(DevicePlugin): self.log.error(" could not confirm valid iTunes.media_dir from %s" % 'com.apple.itunes') self.log.error(" media_dir: %s" % media_dir) if DEBUG: + self.log.info(" %s %s" % (__appname__, __version__)) self.log.info(" [OSX %s - %s (%s), driver version %d.%d.%d]" % (self.iTunes.name(), self.iTunes.version(), self.initial_status, self.version[0],self.version[1],self.version[2])) self.log.info(" iTunes_media: %s" % self.iTunes_media) + if iswindows: ''' Launch iTunes if not already running Assumes pythoncom wrapper + + *** Current implementation doesn't handle UNC paths correctly, + and python has two incompatible methods to parse UNCs: + os.path.splitdrive() and os.path.splitunc() + need to use os.path.normpath on result of splitunc() + + Once you have the //server/share, convert with os.path.normpath('//server/share') + os.path.splitdrive doesn't work as advertised, so use os.path.splitunc + os.path.splitunc("//server/share") returns ('//server/share','') + os.path.splitunc("C:/Documents") returns ('c:','/documents') + os.path.normpath("//server/share") returns "\\\\server\\share" ''' # Instantiate iTunes - self.iTunes = win32com.client.Dispatch("iTunes.Application") + try: + self.iTunes = win32com.client.Dispatch("iTunes.Application") + except: + self.iTunes = None + raise UserFeedback(' ITUNES._launch_iTunes(): unable to find installed iTunes', details=None, level=UserFeedback.WARN) + if not DEBUG: self.iTunes.Windows[0].Minimized = True self.initial_status = 'launched' # Read the current storage path for iTunes media from the XML file + media_dir = '' + string = None with open(self.iTunes.LibraryXMLPath, 'r') as xml: - soup = BeautifulSoup(xml.read().decode('utf-8')) - mf = soup.find('key',text="Music Folder").parent - string = mf.findNext('string').renderContents() - media_dir = os.path.abspath(string[len('file://localhost/'):].replace('%20',' ')) + for line in xml: + if line.strip().startswith('Music Folder'): + soup = BeautifulSoup(line) + string = soup.find('string').renderContents() + media_dir = os.path.abspath(string[len('file://localhost/'):].replace('%20',' ')) + break if os.path.exists(media_dir): self.iTunes_media = media_dir - else: + elif hasattr(string,'parent'): self.log.error(" could not extract valid iTunes.media_dir from %s" % self.iTunes.LibraryXMLPath) self.log.error(" %s" % string.parent.prettify()) self.log.error(" '%s' not found" % media_dir) + else: + self.log.error(" no media dir found: string: %s" % string) if DEBUG: + self.log.info(" %s %s" % (__appname__, __version__)) self.log.info(" [Windows %s - %s (%s), driver version %d.%d.%d]" % (self.iTunes.Windows[0].name, self.iTunes.Version, self.initial_status, self.version[0],self.version[1],self.version[2])) @@ -1989,7 +2283,9 @@ class ITUNES(DevicePlugin): # 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: + 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]: self.update_list.append(self.cached_books[book]) self._remove_from_device(self.cached_books[book]) if DEBUG: @@ -2006,15 +2302,17 @@ class ITUNES(DevicePlugin): # 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: + 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]: self.update_list.append(self.cached_books[book]) self._remove_from_iTunes(self.cached_books[book]) if DEBUG: self.log.info( " deleting library book '%s'" % metadata.title) break - else: - if DEBUG: - self.log.info(" '%s' not in cached_books" % metadata.title) + else: + if DEBUG: + self.log.info(" '%s' not found in cached_books" % metadata.title) def _remove_from_device(self, cached_book): ''' @@ -2022,18 +2320,20 @@ class ITUNES(DevicePlugin): ''' self.log.info(" ITUNES._remove_from_device()") if isosx: - if False: - self.log.info(" deleting %s" % cached_book['dev_book']) + if DEBUG: + self.log.info(" deleting '%s' from iDevice" % cached_book['title']) cached_book['dev_book'].delete() elif iswindows: - dev_pl = self._get_device_books_playlist() - hits = dev_pl.Search(cached_book['uuid'],self.SearchField.index('Albums')) - if hits: - hit = hits[0] - if False: - self.log.info(" deleting '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Album)) + hit = self._find_device_book(cached_book) + if hit: + if DEBUG: + self.log.info(" deleting '%s' from iDevice" % cached_book['title']) hit.Delete() + else: + if DEBUG: + self.log.warning(" unable to remove '%s' by '%s' (%s) from device" % + (cached_book['title'],cached_book['author'],cached_book['uuid'])) def _remove_from_iTunes(self, cached_book): ''' @@ -2076,13 +2376,13 @@ class ITUNES(DevicePlugin): except: # We get here if there was an error with .location().path if DEBUG: - self.log.info(" '%s' not found in iTunes" % cached_book['title']) + self.log.info(" '%s' not in iTunes storage" % cached_book['title']) try: self.iTunes.delete(cached_book['lib_book']) except: if DEBUG: - self.log.info(" '%s' not found in iTunes" % cached_book['title']) + self.log.info(" unable to remove '%s' from iTunes" % cached_book['title']) elif iswindows: ''' @@ -2094,17 +2394,19 @@ class ITUNES(DevicePlugin): path = book.Location except: book = self._find_library_book(cached_book) + if book: + path = book.Location if book: - storage_path = os.path.split(book.Location) - if book.Location.startswith(self.iTunes_media): + if self.iTunes_media and path.startswith(self.iTunes_media): + storage_path = os.path.split(path) if DEBUG: self.log.info(" removing '%s' at %s" % - (cached_book['title'], book.Location)) + (cached_book['title'], path)) try: os.remove(path) except: - self.log.warning(" could not find '%s' in iTunes storage" % path) + self.log.warning(" '%s' not in iTunes storage" % path) try: os.rmdir(storage_path[0]) self.log.info(" removed folder '%s'" % storage_path[0]) @@ -2121,7 +2423,7 @@ class ITUNES(DevicePlugin): book.Delete() except: if DEBUG: - self.log.info(" '%s' not found in iTunes" % cached_book['title']) + self.log.info(" unable to remove '%s' from iTunes" % cached_book['title']) def _update_epub_metadata(self, fpath, metadata): ''' @@ -2130,40 +2432,39 @@ class ITUNES(DevicePlugin): # Refresh epub metadata with open(fpath,'r+b') as zfo: - ''' - # Touch the timestamp to force a recache - if metadata.timestamp: - if DEBUG: - self.log.info(" old timestamp: %s" % metadata.timestamp) - old_ts = metadata.timestamp - metadata.timestamp = datetime.datetime(old_ts.year, old_ts.month, old_ts.day, old_ts.hour, - old_ts.minute, old_ts.second, old_ts.microsecond+1, old_ts.tzinfo) - if DEBUG: - self.log.info(" new timestamp: %s" % metadata.timestamp) - else: - metadata.timestamp = isoformat(now()) - if DEBUG: - self.log.info(" add timestamp: %s" % metadata.timestamp) - ''' # Touch the OPF timestamp zf_opf = ZipFile(fpath,'r') fnames = zf_opf.namelist() opf = [x for x in fnames if '.opf' in x][0] if opf: - opf_raw = cStringIO.StringIO(zf_opf.read(opf)).getvalue() - soup = BeautifulSoup(opf_raw) + opf_raw = cStringIO.StringIO(zf_opf.read(opf)) + soup = BeautifulSoup(opf_raw.getvalue()) + opf_raw.close() + + # Touch existing calibre timestamp md = soup.find('metadata') - ts = md.find('meta',attrs={'name':'calibre:timestamp'}) - if ts: - # Touch existing calibre timestamp - timestamp = ts['content'] - old_ts = parse_date(timestamp) - metadata.timestamp = datetime.datetime(old_ts.year, old_ts.month, old_ts.day, old_ts.hour, - old_ts.minute, old_ts.second, old_ts.microsecond+1, old_ts.tzinfo) + if md: + ts = md.find('meta',attrs={'name':'calibre:timestamp'}) + if ts: + timestamp = ts['content'] + old_ts = parse_date(timestamp) + metadata.timestamp = datetime.datetime(old_ts.year, old_ts.month, old_ts.day, old_ts.hour, + old_ts.minute, old_ts.second, old_ts.microsecond+1, old_ts.tzinfo) + else: + metadata.timestamp = isoformat(now()) + if DEBUG: + self.log.info(" add timestamp: %s" % metadata.timestamp) else: metadata.timestamp = isoformat(now()) if DEBUG: + self.log.warning(" missing block in OPF file") self.log.info(" add timestamp: %s" % metadata.timestamp) + + # Force the language declaration for iBooks 1.1 + metadata.language = get_lang().replace('_', '-') + if DEBUG: + self.log.info(" rewriting language: %s" % metadata.language) + zf_opf.close() # If 'News' in tags, tweak the title/author for friendlier display in iBooks @@ -2243,18 +2544,26 @@ class ITUNES(DevicePlugin): if isosx: if lb_added: - lb_added.album.set(metadata.uuid) + lb_added.album.set(metadata.title) + lb_added.artist.set(authors_to_string(metadata.authors)) + lb_added.composer.set(metadata.uuid) lb_added.description.set("%s %s" % (self.description_prefix,strftime('%Y-%m-%d %H:%M:%S'))) lb_added.enabled.set(True) lb_added.sort_artist.set(metadata.author_sort.title()) lb_added.sort_name.set(this_book.title_sorter) + if this_book.format == 'pdf': + lb_added.name.set(metadata.title) if db_added: - db_added.album.set(metadata.uuid) + db_added.album.set(metadata.title) + db_added.artist.set(authors_to_string(metadata.authors)) + db_added.composer.set(metadata.uuid) db_added.description.set("%s %s" % (self.description_prefix,strftime('%Y-%m-%d %H:%M:%S'))) db_added.enabled.set(True) db_added.sort_artist.set(metadata.author_sort.title()) db_added.sort_name.set(this_book.title_sorter) + if this_book.format == 'pdf': + db_added.name.set(metadata.title) if metadata.comments: if lb_added: @@ -2273,17 +2582,26 @@ class ITUNES(DevicePlugin): pass # Set genre from series if available, else first alpha tag - # Otherwise iTunes grabs the first dc:subject from the opf metadata, - if metadata.series: + # Otherwise iTunes grabs the first dc:subject from the opf metadata + if metadata.series and self.settings().read_metadata: + if DEBUG: + self.log.info(" using Series name as Genre") if lb_added: + lb_added.sort_name.set("%s %04f" % (metadata.series, metadata.series_index)) lb_added.genre.set(metadata.series) lb_added.episode_ID.set(metadata.series) lb_added.episode_number.set(metadata.series_index) + if db_added: + db_added.sort_name.set("%s %04f" % (metadata.series, metadata.series_index)) db_added.genre.set(metadata.series) db_added.episode_ID.set(metadata.series) db_added.episode_number.set(metadata.series_index) + elif metadata.tags: + if DEBUG: + self.log.info(" %susing Tag as Genre" % + "no Series name available, " if self.settings().read_metadata else '') for tag in metadata.tags: if self._is_alpha(tag[0]): if lb_added: @@ -2294,18 +2612,26 @@ class ITUNES(DevicePlugin): elif iswindows: if lb_added: - lb_added.Album = metadata.uuid + lb_added.Album = metadata.title + lb_added.Artist = authors_to_string(metadata.authors) + lb_added.Composer = metadata.uuid lb_added.Description = ("%s %s" % (self.description_prefix,strftime('%Y-%m-%d %H:%M:%S'))) lb_added.Enabled = True lb_added.SortArtist = (metadata.author_sort.title()) lb_added.SortName = (this_book.title_sorter) + if this_book.format == 'pdf': + lb_added.Name = metadata.title if db_added: - db_added.Album = metadata.uuid + db_added.Album = metadata.title + db_added.Artist = authors_to_string(metadata.authors) + db_added.Composer = metadata.uuid db_added.Description = ("%s %s" % (self.description_prefix,strftime('%Y-%m-%d %H:%M:%S'))) db_added.Enabled = True db_added.SortArtist = (metadata.author_sort.title()) db_added.SortName = (this_book.title_sorter) + if this_book.format == 'pdf': + db_added.Name = metadata.title if metadata.comments: if lb_added: @@ -2323,38 +2649,271 @@ class ITUNES(DevicePlugin): except: if DEBUG: self.log.warning(" iTunes automation interface reported an error" - " setting AlbumRating") + " setting AlbumRating on iDevice") - # Set Category from first alpha tag, overwrite with series if available + # Set Genre from first alpha tag, overwrite with series if available # Otherwise iBooks uses first from opf # iTunes balks on setting EpisodeNumber, but it sticks (9.1.1.12) - if metadata.series: + if metadata.series and self.settings().read_metadata: + if DEBUG: + self.log.info(" using Series name as Genre") if lb_added: - lb_added.Category = metadata.series + lb_added.SortName = "%s %04f" % (metadata.series, metadata.series_index) + lb_added.Genre = metadata.series lb_added.EpisodeID = metadata.series try: lb_added.EpisodeNumber = metadata.series_index except: pass if db_added: - db_added.Category = metadata.series + db_added.SortName = "%s %04f" % (metadata.series, metadata.series_index) + db_added.Genre = metadata.series db_added.EpisodeID = metadata.series try: db_added.EpisodeNumber = metadata.series_index except: if DEBUG: self.log.warning(" iTunes automation interface reported an error" - " setting EpisodeNumber") + " setting EpisodeNumber on iDevice") elif metadata.tags: + if DEBUG: + self.log.info(" using Tag as Genre") for tag in metadata.tags: if self._is_alpha(tag[0]): if lb_added: - lb_added.Category = tag + lb_added.Genre = tag if db_added: - db_added.Category = tag + db_added.Genre = tag break +class ITUNES_ASYNC(ITUNES): + ''' + This subclass allows the user to interact directly with iTunes via a menu option + 'Connect to iTunes' in Send to device. + ''' + name = 'iTunes interface' + gui_name = 'Apple iTunes' + icon = I('devices/itunes.png') + description = _('Communicate with iTunes.') + + connected = False + + def __init__(self,path): + if DEBUG: + self.log.info("ITUNES_ASYNC:__init__()") + + if isosx and appscript is None: + self.connected = False + raise UserFeedback('OSX 10.5 or later required', details=None, level=UserFeedback.WARN) + return + else: + self.connected = True + + if isosx: + self._launch_iTunes() + + if iswindows: + try: + pythoncom.CoInitialize() + self._launch_iTunes() + except: + raise UserFeedback('unable to launch iTunes', details=None, level=UserFeedback.WARN) + finally: + pythoncom.CoUninitialize() + + self.manual_sync_mode = False + + def books(self, oncard=None, end_session=True): + """ + Return a list of ebooks on the device. + @param oncard: If 'carda' or 'cardb' return a list of ebooks on the + specific storage card, otherwise return list of ebooks + in main memory of device. If a card is specified and no + books are on the card return empty list. + @return: A BookList. + + Implementation notes: + iTunes does not sync purchased books, they are only on the device. They are visible, but + they are not backed up to iTunes. Since calibre can't manage them, don't show them in the + list of device books. + + """ + if not oncard: + if DEBUG: + self.log.info("ITUNES_ASYNC:books()") + if self.settings().use_subdirs: + self.log.info(" Cover fetching/caching enabled") + else: + self.log.info(" Cover fetching/caching disabled") + + # Fetch a list of books from iTunes + + booklist = BookList(self.log) + cached_books = {} + + if isosx: + library_books = self._get_library_books() + book_count = float(len(library_books)) + for (i,book) in enumerate(library_books): + format = 'pdf' if library_books[book].kind().startswith('PDF') else 'epub' + this_book = Book(library_books[book].name(), library_books[book].artist()) + this_book.path = self.path_template % (library_books[book].name(), + library_books[book].artist(), + format) + try: + this_book.datetime = parse_date(str(library_books[book].date_added())).timetuple() + except: + this_book.datetime = time.gmtime() + this_book.db_id = None + this_book.device_collections = [] + #this_book.library_id = library_books[this_book.path] if this_book.path in library_books else None + this_book.library_id = library_books[book] + this_book.size = library_books[book].size() + this_book.uuid = library_books[book].album() + # Hack to discover if we're running in GUI environment + if self.report_progress is not None: + this_book.thumbnail = self._generate_thumbnail(this_book.path, library_books[book]) + else: + this_book.thumbnail = None + booklist.add_book(this_book, False) + + cached_books[this_book.path] = { + 'title':library_books[book].name(), + 'author':[library_books[book].artist()], + 'lib_book':library_books[book], + 'dev_book':None, + 'uuid': library_books[book].composer(), + 'format': format + } + + if self.report_progress is not None: + self.report_progress(i+1/book_count, _('%d of %d') % (i+1, book_count)) + + elif iswindows: + try: + pythoncom.CoInitialize() + self.iTunes = win32com.client.Dispatch("iTunes.Application") + library_books = self._get_library_books() + book_count = float(len(library_books)) + for (i,book) in enumerate(library_books): + this_book = Book(library_books[book].Name, library_books[book].Artist) + format = 'pdf' if library_books[book].KindAsString.startswith('PDF') else 'epub' + this_book.path = self.path_template % (library_books[book].Name, + library_books[book].Artist, + format) + try: + this_book.datetime = parse_date(str(library_books[book].DateAdded)).timetuple() + except: + this_book.datetime = time.gmtime() + this_book.db_id = None + this_book.device_collections = [] + this_book.library_id = library_books[book] + this_book.size = library_books[book].Size + # Hack to discover if we're running in GUI environment + if self.report_progress is not None: + this_book.thumbnail = self._generate_thumbnail(this_book.path, library_books[book]) + else: + this_book.thumbnail = None + booklist.add_book(this_book, False) + + cached_books[this_book.path] = { + 'title':library_books[book].Name, + 'author':library_books[book].Artist, + 'lib_book':library_books[book], + 'uuid': library_books[book].Composer, + 'format': format + } + + if self.report_progress is not None: + self.report_progress(i+1/book_count, + _('%d of %d') % (i+1, book_count)) + + finally: + pythoncom.CoUninitialize() + + if self.report_progress is not None: + self.report_progress(1.0, _('finished')) + self.cached_books = cached_books + if DEBUG: + self._dump_booklist(booklist, 'returning from books()', indent=2) + self._dump_cached_books('returning from books()',indent=2) + return booklist + + else: + return BookList(self.log) + + def eject(self): + ''' + Un-mount / eject the device from the OS. This does not check if there + are pending GUI jobs that need to communicate with the device. + ''' + if DEBUG: + self.log.info("ITUNES_ASYNC:eject()") + self.iTunes = None + self.connected = False + + def free_space(self, end_session=True): + """ + Get free space available on the mountpoints: + 1. Main memory + 2. Card A + 3. Card B + + @return: A 3 element list with free space in bytes of (1, 2, 3). If a + particular device doesn't have any of these locations it should return -1. + """ + if DEBUG: + self.log.info("ITUNES_ASYNC:free_space()") + free_space = 0 + if isosx: + s = os.statvfs(os.sep) + free_space = s.f_bavail * s.f_frsize + elif iswindows: + free_bytes = ctypes.c_ulonglong(0) + ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(os.sep), None, None, ctypes.pointer(free_bytes)) + free_space = free_bytes.value + return (free_space,-1,-1) + + def get_device_information(self, end_session=True): + """ + Ask device for device information. See L{DeviceInfoQuery}. + @return: (device name, device version, software version on device, mime type) + """ + if DEBUG: + self.log.info("ITUNES_ASYNC:get_device_information()") + + return ('iTunes','hw v1.0','sw v1.0', 'mime type normally goes here') + + def is_usb_connected(self, devices_on_system, debug=False, + only_presence=False): + return self.connected, self + + def sync_booklists(self, booklists, end_session=True): + ''' + Update metadata on device. + @param booklists: A tuple containing the result of calls to + (L{books}(oncard=None), L{books}(oncard='carda'), + L{books}(oncard='cardb')). + ''' + + if DEBUG: + self.log.info("ITUNES_ASYNC.sync_booklists()") + + # Inform user of any problem books + if self.problem_titles: + raise UserFeedback(self.problem_msg, + details='\n'.join(self.problem_titles), level=UserFeedback.WARN) + self.problem_titles = [] + self.problem_msg = None + self.update_list = [] + + def unmount_device(self): + ''' + ''' + if DEBUG: + self.log.info("ITUNES_ASYNC:unmount_device()") + self.connected = False class BookList(list): ''' @@ -2411,8 +2970,6 @@ class BookList(list): class Book(MetaInformation): ''' A simple class describing a book in the iTunes Books Library. - Q's: - - Should thumbnail come from calibre if available? - See ebooks.metadata.__init__ for all fields ''' def __init__(self,title,author): diff --git a/src/calibre/devices/eb600/driver.py b/src/calibre/devices/eb600/driver.py index 9b7a21a3bb..bf03b1e4c2 100644 --- a/src/calibre/devices/eb600/driver.py +++ b/src/calibre/devices/eb600/driver.py @@ -186,6 +186,15 @@ class BOOQ(EB600): WINDOWS_MAIN_MEM = 'EB600' WINDOWS_CARD_A_MEM = 'EB600' +class MENTOR(EB600): + + name = 'Astak Mentor EB600' + gui_name = 'Mentor' + description = _('Communicate with the Astak Mentor EB600') + FORMATS = ['epub', 'fb2', 'mobi', 'prc', 'pdf', 'txt'] + + WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'MENTOR' + class ELONEX(EB600): name = 'Elonex 600EB' diff --git a/src/calibre/devices/folder_device/driver.py b/src/calibre/devices/folder_device/driver.py index e1c95e865a..1d00b32864 100644 --- a/src/calibre/devices/folder_device/driver.py +++ b/src/calibre/devices/folder_device/driver.py @@ -66,7 +66,7 @@ class FOLDER_DEVICE(USBMS): detected_device=None): pass - def disconnect_from_folder(self): + def unmount_device(self): self._main_prefix = '' self.is_connected = False diff --git a/src/calibre/devices/hanlin/driver.py b/src/calibre/devices/hanlin/driver.py index 0d972afc76..f19135a7e7 100644 --- a/src/calibre/devices/hanlin/driver.py +++ b/src/calibre/devices/hanlin/driver.py @@ -106,9 +106,11 @@ class BOOX(HANLINV3): description = _('Communicate with the BOOX eBook reader.') author = 'Jesus Manuel Marinho Valcarce' supported_platforms = ['windows', 'osx', 'linux'] + METADATA_CACHE = '.metadata.calibre' # Ordered list of supported formats - FORMATS = ['epub', 'fb2', 'djvu', 'pdf', 'html', 'txt', 'rtf', 'mobi', 'prc', 'chm'] + FORMATS = ['epub', 'fb2', 'djvu', 'pdf', 'html', 'txt', 'rtf', 'mobi', + 'prc', 'chm', 'doc'] VENDOR_ID = [0x0525] PRODUCT_ID = [0xa4a5] diff --git a/src/calibre/devices/hanvon/driver.py b/src/calibre/devices/hanvon/driver.py index 7a0de3064e..d5b71b2cf5 100644 --- a/src/calibre/devices/hanvon/driver.py +++ b/src/calibre/devices/hanvon/driver.py @@ -24,7 +24,7 @@ class N516(USBMS): VENDOR_ID = [0x0525] PRODUCT_ID = [0xa4a5] - BCD = [0x323, 0x326] + BCD = [0x323, 0x326, 0x327] VENDOR_NAME = 'INGENIC' WINDOWS_MAIN_MEM = '_FILE-STOR_GADGE' diff --git a/src/calibre/devices/interface.py b/src/calibre/devices/interface.py index da8a2cb978..c417c501f4 100644 --- a/src/calibre/devices/interface.py +++ b/src/calibre/devices/interface.py @@ -59,7 +59,7 @@ class DevicePlugin(Plugin): return cls.__name__ return cls.name - + # Device detection {{{ def test_bcd_windows(self, device_id, bcd): if bcd is None or len(bcd) == 0: return True @@ -152,6 +152,7 @@ class DevicePlugin(Plugin): return True, dev return False, None + # }}} def reset(self, key='-1', log_packets=False, report_progress=None, detected_device=None) : @@ -372,14 +373,12 @@ class DevicePlugin(Plugin): @classmethod def settings(cls): ''' - Should return an opts object. The opts object should have one attribute + Should return an opts object. The opts object should have at least one attribute `format_map` which is an ordered list of formats for the device. ''' raise NotImplementedError() - - class BookList(list): ''' A list of books. Each Book object must have the fields: diff --git a/src/calibre/devices/kindle/driver.py b/src/calibre/devices/kindle/driver.py index cd56d210e1..98e16bd207 100644 --- a/src/calibre/devices/kindle/driver.py +++ b/src/calibre/devices/kindle/driver.py @@ -213,7 +213,7 @@ class KINDLE_DX(KINDLE2): PRODUCT_ID = [0x0003] BCD = [0x0100] -class Bookmark(): +class Bookmark(): # {{{ ''' A simple class fetching bookmark data Kindle-specific @@ -429,6 +429,7 @@ class Bookmark(): entries, = unpack('>I', data[9:13]) current_entry = 0 e_base = 0x0d + self.pdf_page_offset = 0 while current_entry < entries: ''' location, = unpack('>I', data[e_base+2:e_base+6]) @@ -516,3 +517,6 @@ class Bookmark(): else: print "unsupported bookmark_extension: %s" % self.bookmark_extension + +# }}} + diff --git a/src/calibre/devices/kobo/books.py b/src/calibre/devices/kobo/books.py new file mode 100644 index 0000000000..7ee5beaec0 --- /dev/null +++ b/src/calibre/devices/kobo/books.py @@ -0,0 +1,116 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Timothy Legge ' +''' +''' + +import os +import re +import time + +from calibre.ebooks.metadata import MetaInformation +from calibre.constants import filesystem_encoding, preferred_encoding +from calibre import isbytestring + +class Book(MetaInformation): + + BOOK_ATTRS = ['lpath', 'size', 'mime', 'device_collections', '_new_book'] + + JSON_ATTRS = [ + 'lpath', 'title', 'authors', 'mime', 'size', 'tags', 'author_sort', + 'title_sort', 'comments', 'category', 'publisher', 'series', + 'series_index', 'rating', 'isbn', 'language', 'application_id', + 'book_producer', 'lccn', 'lcc', 'ddc', 'rights', 'publication_type', + 'uuid', + ] + + def __init__(self, prefix, lpath, title, authors, mime, date, ContentType, thumbnail_name, other=None): + + MetaInformation.__init__(self, '') + self.device_collections = [] + self._new_book = False + + self.path = os.path.join(prefix, lpath) + if os.sep == '\\': + self.path = self.path.replace('/', '\\') + self.lpath = lpath.replace('\\', '/') + else: + self.lpath = lpath + + self.title = title + if not authors: + self.authors = [''] + else: + self.authors = [authors] + self.mime = mime + try: + self.size = os.path.getsize(self.path) + except OSError: + self.size = 0 + try: + if ContentType == '6': + self.datetime = time.strptime(date, "%Y-%m-%dT%H:%M:%S.%f") + else: + self.datetime = time.gmtime(os.path.getctime(self.path)) + except: + self.datetime = time.gmtime() + + if thumbnail_name is not None: + self.thumbnail = ImageWrapper(thumbnail_name) + self.tags = [] + if other: + self.smart_update(other) + + def __eq__(self, other): + return self.path == getattr(other, 'path', None) + + @dynamic_property + def db_id(self): + doc = '''The database id in the application database that this file corresponds to''' + def fget(self): + match = re.search(r'_(\d+)$', self.lpath.rpartition('.')[0]) + if match: + return int(match.group(1)) + return None + return property(fget=fget, doc=doc) + + @dynamic_property + def title_sorter(self): + doc = '''String to sort the title. If absent, title is returned''' + def fget(self): + return re.sub('^\s*A\s+|^\s*The\s+|^\s*An\s+', '', self.title).rstrip() + return property(doc=doc, fget=fget) + + @dynamic_property + def thumbnail(self): + return None + + def smart_update(self, other): + ''' + Merge the information in C{other} into self. In case of conflicts, the information + in C{other} takes precedence, unless the information in C{other} is NULL. + ''' + + MetaInformation.smart_update(self, other) + + for attr in self.BOOK_ATTRS: + if hasattr(other, attr): + val = getattr(other, attr, None) + setattr(self, attr, val) + + def to_json(self): + json = {} + for attr in self.JSON_ATTRS: + val = getattr(self, attr) + if isbytestring(val): + enc = filesystem_encoding if attr == 'lpath' else preferred_encoding + val = val.decode(enc, 'replace') + elif isinstance(val, (list, tuple)): + val = [x.decode(preferred_encoding, 'replace') if + isbytestring(x) else x for x in val] + json[attr] = val + return json + +class ImageWrapper(object): + def __init__(self, image_path): + self.image_path = image_path + diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index 4b14b2bf8e..f4c4cad3c7 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -2,17 +2,26 @@ # vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai __license__ = 'GPL v3' -__copyright__ = '2010, Kovid Goyal ' +__copyright__ = '2010, Timothy Legge and Kovid Goyal ' __docformat__ = 'restructuredtext en' +import os +import sqlite3 as sqlite + +from calibre.devices.usbms.books import BookList +from calibre.devices.kobo.books import Book +from calibre.devices.kobo.books import ImageWrapper +from calibre.devices.mime import mime_type_ext from calibre.devices.usbms.driver import USBMS +from calibre import prints class KOBO(USBMS): name = 'Kobo Reader Device Interface' gui_name = 'Kobo Reader' description = _('Communicate with the Kobo Reader') - author = 'Kovid Goyal' + author = 'Timothy Legge and Kovid Goyal' + version = (1, 0, 4) supported_platforms = ['windows', 'osx', 'linux'] @@ -29,3 +38,320 @@ class KOBO(USBMS): EBOOK_DIR_MAIN = '' SUPPORTS_SUB_DIRS = True + def initialize(self): + USBMS.initialize(self) + self.book_class = Book + + def books(self, oncard=None, end_session=True): + from calibre.ebooks.metadata.meta import path_to_ext + + dummy_bl = BookList(None, None, None) + + if oncard == 'carda' and not self._card_a_prefix: + self.report_progress(1.0, _('Getting list of books on device...')) + return dummy_bl + elif oncard == 'cardb' and not self._card_b_prefix: + self.report_progress(1.0, _('Getting list of books on device...')) + return dummy_bl + elif oncard and oncard != 'carda' and oncard != 'cardb': + self.report_progress(1.0, _('Getting list of books on device...')) + return dummy_bl + + prefix = self._card_a_prefix if oncard == 'carda' else \ + self._card_b_prefix if oncard == 'cardb' \ + else self._main_prefix + + # get the metadata cache + bl = self.booklist_class(oncard, prefix, self.settings) + need_sync = self.parse_metadata_cache(bl, prefix, self.METADATA_CACHE) + + # make a dict cache of paths so the lookup in the loop below is faster. + bl_cache = {} + for idx,b in enumerate(bl): + bl_cache[b.lpath] = idx + + def update_booklist(prefix, path, title, authors, mime, date, ContentType, ImageID): + changed = False + # if path_to_ext(path) in self.FORMATS: + try: + lpath = path.partition(self.normalize_path(prefix))[2] + if lpath.startswith(os.sep): + lpath = lpath[len(os.sep):] + lpath = lpath.replace('\\', '/') +# print "LPATH: " + lpath + + path = self.normalize_path(path) + # print "Normalized FileName: " + path + + idx = bl_cache.get(lpath, None) + if idx is not None: + if ImageID is not None: + imagename = self.normalize_path(self._main_prefix + '.kobo/images/' + ImageID + ' - NickelBookCover.parsed') + #print "Image name Normalized: " + imagename + if imagename is not None: + bl[idx].thumbnail = ImageWrapper(imagename) + bl_cache[lpath] = None + if ContentType != '6': + if self.update_metadata_item(bl[idx]): + # print 'update_metadata_item returned true' + changed = True + else: + book = Book(prefix, lpath, title, authors, mime, date, ContentType, ImageID) + # print 'Update booklist' + if bl.add_book(book, replace_metadata=False): + changed = True + except: # Probably a path encoding error + import traceback + traceback.print_exc() + return changed + + connection = sqlite.connect(self._main_prefix + '.kobo/KoboReader.sqlite') + cursor = connection.cursor() + + #query = 'select count(distinct volumeId) from volume_shortcovers' + #cursor.execute(query) + #for row in (cursor): + # numrows = row[0] + #cursor.close() + + query= 'select Title, Attribution, DateCreated, ContentID, MimeType, ContentType, ' \ + 'ImageID from content where BookID is Null' + + cursor.execute (query) + + changed = False + for i, row in enumerate(cursor): + # self.report_progress((i+1) / float(numrows), _('Getting list of books on device...')) + + path = self.path_from_contentid(row[3], row[5], oncard) + mime = mime_type_ext(path_to_ext(row[3])) + + if oncard != 'carda' and oncard != 'cardb' and not row[3].startswith("file:///mnt/sd/"): + changed = update_booklist(self._main_prefix, path, row[0], row[1], mime, row[2], row[5], row[6]) + # print "shortbook: " + path + elif oncard == 'carda' and row[3].startswith("file:///mnt/sd/"): + changed = update_booklist(self._card_a_prefix, path, row[0], row[1], mime, row[2], row[5], row[6]) + + if changed: + need_sync = True + + cursor.close() + connection.close() + + # Remove books that are no longer in the filesystem. Cache contains + # indices into the booklist if book not in filesystem, None otherwise + # Do the operation in reverse order so indices remain valid + for idx in sorted(bl_cache.itervalues(), reverse=True): + if idx is not None: + need_sync = True + del bl[idx] + + #print "count found in cache: %d, count of files in metadata: %d, need_sync: %s" % \ + # (len(bl_cache), len(bl), need_sync) + if need_sync: #self.count_found_in_bl != len(bl) or need_sync: + if oncard == 'cardb': + self.sync_booklists((None, None, bl)) + elif oncard == 'carda': + self.sync_booklists((None, bl, None)) + else: + self.sync_booklists((bl, None, None)) + + self.report_progress(1.0, _('Getting list of books on device...')) + return bl + + def delete_via_sql(self, ContentID, ContentType): + # Delete Order: + # 1) shortcover_page + # 2) volume_shorcover + # 2) content + + connection = sqlite.connect(self._main_prefix + '.kobo/KoboReader.sqlite') + cursor = connection.cursor() + t = (ContentID,) + cursor.execute('select ImageID from content where ContentID = ?', t) + + ImageID = None + for row in cursor: + # First get the ImageID to delete the images + ImageID = row[0] + cursor.close() + + cursor = connection.cursor() + if ContentType == 6: + # Delete the shortcover_pages first + cursor.execute('delete from shortcover_page where shortcoverid in (select ContentID from content where BookID = ?)', t) + + #Delete the volume_shortcovers second + cursor.execute('delete from volume_shortcovers where volumeid = ?', t) + + # Delete the chapters associated with the book next + t = (ContentID,ContentID,) + cursor.execute('delete from content where BookID = ? or ContentID = ?', t) + + connection.commit() + + cursor.close() + if ImageID != None: + print "Error condition ImageID was not found" + print "You likely tried to delete a book that the kobo has not yet added to the database" + + connection.close() + # If all this succeeds we need to delete the images files via the ImageID + return ImageID + + def delete_images(self, ImageID): + if ImageID != None: + path_prefix = '.kobo/images/' + path = self._main_prefix + path_prefix + ImageID + + file_endings = (' - iPhoneThumbnail.parsed', ' - bbMediumGridList.parsed', ' - NickelBookCover.parsed',) + + for ending in file_endings: + fpath = path + ending + fpath = self.normalize_path(fpath) + + if os.path.exists(fpath): + # print 'Image File Exists: ' + fpath + os.unlink(fpath) + + def delete_books(self, paths, end_session=True): + for i, path in enumerate(paths): + self.report_progress((i+1) / float(len(paths)), _('Removing books from device...')) + path = self.normalize_path(path) + # print "Delete file normalized path: " + path + extension = os.path.splitext(path)[1] + + if extension == '.kobo': + # Kobo books do not have book files. They do have some images though + #print "kobo book" + ContentType = 6 + ContentID = self.contentid_from_path(path, ContentType) + elif extension == '.pdf' or extension == '.epub': + # print "ePub or pdf" + ContentType = 16 + #print "Path: " + path + ContentID = self.contentid_from_path(path, ContentType) + # print "ContentID: " + ContentID + else: # if extension == '.html' or extension == '.txt': + ContentType = 999 # Yet another hack: to get around Kobo changing how ContentID is stored + ContentID = self.contentid_from_path(path, ContentType) + + ImageID = self.delete_via_sql(ContentID, ContentType) + #print " We would now delete the Images for" + ImageID + self.delete_images(ImageID) + + if os.path.exists(path): + # Delete the ebook + # print "Delete the ebook: " + path + os.unlink(path) + + filepath = os.path.splitext(path)[0] + for ext in self.DELETE_EXTS: + if os.path.exists(filepath + ext): + # print "Filename: " + filename + os.unlink(filepath + ext) + if os.path.exists(path + ext): + # print "Filename: " + filename + os.unlink(path + ext) + + if self.SUPPORTS_SUB_DIRS: + try: + # print "removed" + os.removedirs(os.path.dirname(path)) + except: + pass + self.report_progress(1.0, _('Removing books from device...')) + + def remove_books_from_metadata(self, paths, booklists): + for i, path in enumerate(paths): + self.report_progress((i+1) / float(len(paths)), _('Removing books from device metadata listing...')) + for bl in booklists: + for book in bl: + #print "Book Path: " + book.path + if path.endswith(book.path): + #print " Remove: " + book.path + bl.remove_book(book) + self.report_progress(1.0, _('Removing books from device metadata listing...')) + + def add_books_to_metadata(self, locations, metadata, booklists): + metadata = iter(metadata) + for i, location in enumerate(locations): + self.report_progress((i+1) / float(len(locations)), _('Adding books to device metadata listing...')) + info = metadata.next() + blist = 2 if location[1] == 'cardb' else 1 if location[1] == 'carda' else 0 + + # Extract the correct prefix from the pathname. To do this correctly, + # we must ensure that both the prefix and the path are normalized + # so that the comparison will work. Book's __init__ will fix up + # lpath, so we don't need to worry about that here. + path = self.normalize_path(location[0]) + if self._main_prefix: + prefix = self._main_prefix if \ + path.startswith(self.normalize_path(self._main_prefix)) else None + if not prefix and self._card_a_prefix: + prefix = self._card_a_prefix if \ + path.startswith(self.normalize_path(self._card_a_prefix)) else None + if not prefix and self._card_b_prefix: + prefix = self._card_b_prefix if \ + path.startswith(self.normalize_path(self._card_b_prefix)) else None + if prefix is None: + prints('in add_books_to_metadata. Prefix is None!', path, + self._main_prefix) + continue + #print "Add book to metatdata: " + #print "prefix: " + prefix + lpath = path.partition(prefix)[2] + if lpath.startswith('/') or lpath.startswith('\\'): + lpath = lpath[1:] + #print "path: " + lpath + #book = self.book_class(prefix, lpath, other=info) + lpath = self.normalize_path(prefix + lpath) + book = Book(prefix, lpath, '', '', '', '', '', '', other=info) + if book.size is None: + book.size = os.stat(self.normalize_path(path)).st_size + booklists[blist].add_book(book, replace_metadata=True) + self.report_progress(1.0, _('Adding books to device metadata listing...')) + + def contentid_from_path(self, path, ContentType): + if ContentType == 6: + ContentID = os.path.splitext(path)[0] + # Remove the prefix on the file. it could be either + ContentID = ContentID.replace(self._main_prefix, '') + if self._card_a_prefix is not None: + ContentID = ContentID.replace(self._card_a_prefix, '') + elif ContentType == 999: # HTML Files + ContentID = path + ContentID = ContentID.replace(self._main_prefix, "/mnt/onboard/") + if self._card_a_prefix is not None: + ContentID = ContentID.replace(self._card_a_prefix, "/mnt/sd/") + else: # ContentType = 16 + ContentID = path + ContentID = ContentID.replace(self._main_prefix, "file:///mnt/onboard/") + if self._card_a_prefix is not None: + ContentID = ContentID.replace(self._card_a_prefix, "file:///mnt/sd/") + ContentID = ContentID.replace("\\", '/') + return ContentID + + + def path_from_contentid(self, ContentID, ContentType, oncard): + path = ContentID + + if oncard == 'cardb': + print 'path from_contentid cardb' + elif oncard == 'carda': + path = path.replace("file:///mnt/sd/", self._card_a_prefix) + # print "SD Card: " + filename + else: + if ContentType == "6": + # This is a hack as the kobo files do not exist + # but the path is required to make a unique id + # for calibre's reference + path = self._main_prefix + path + '.kobo' + # print "Path: " + path + else: + # if path.startswith("file:///mnt/onboard/"): + path = path.replace("file:///mnt/onboard/", self._main_prefix) + path = path.replace("/mnt/onboard/", self._main_prefix) + # print "Internal: " + filename + + return path diff --git a/src/calibre/devices/misc.py b/src/calibre/devices/misc.py index 4310c51421..d74689c45c 100644 --- a/src/calibre/devices/misc.py +++ b/src/calibre/devices/misc.py @@ -49,3 +49,41 @@ class AVANT(USBMS): EBOOK_DIR_MAIN = '' SUPPORTS_SUB_DIRS = True +class SWEEX(USBMS): + name = 'Sweex Device Interface' + gui_name = 'Sweex' + description = _('Communicate with the Sweex MM300') + author = 'Kovid Goyal' + supported_platforms = ['windows', 'osx', 'linux'] + + # Ordered list of supported formats + FORMATS = ['epub', 'prc', 'fb2', 'html', 'rtf', 'chm', 'pdf', 'txt'] + + VENDOR_ID = [0x0525] + PRODUCT_ID = [0xa4a5] + BCD = [0x0319] + + VENDOR_NAME = 'SWEEX' + WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'EBOOKREADER' + + EBOOK_DIR_MAIN = '' + SUPPORTS_SUB_DIRS = True + +class PDNOVEL(USBMS): + name = 'Pandigital Novel device interface' + gui_name = 'PD Novel' + description = _('Communicate with the Pandigital Novel') + author = 'Kovid Goyal' + supported_platforms = ['windows', 'linux', 'osx'] + FORMATS = ['epub', 'pdf'] + + VENDOR_ID = [0x18d1] + PRODUCT_ID = [0xb004] + BCD = [0x224] + + VENDOR_NAME = 'ANDROID' + WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = '__UMS_COMPOSITE' + + EBOOK_DIR_MAIN = 'eBooks' + SUPPORTS_SUB_DIRS = False + diff --git a/src/calibre/devices/nokia/driver.py b/src/calibre/devices/nokia/driver.py index 66a4243f2b..f378a656fb 100644 --- a/src/calibre/devices/nokia/driver.py +++ b/src/calibre/devices/nokia/driver.py @@ -67,3 +67,24 @@ class E71X(USBMS): VENDOR_NAME = 'NOKIA' WINDOWS_MAIN_MEM = 'S60' +class E52(USBMS): + + name = 'Nokia E52 device interface' + gui_name = 'Nokia E52' + description = _('Communicate with the Nokia E52') + author = 'David Ignjic' + supported_platforms = ['windows', 'linux', 'osx'] + + VENDOR_ID = [0x421] + PRODUCT_ID = [0x1CD] + BCD = [0x100] + + + FORMATS = ['mobi', 'prc'] + + EBOOK_DIR_MAIN = 'eBooks' + SUPPORTS_SUB_DIRS = True + + VENDOR_NAME = 'NOKIA' + WINDOWS_MAIN_MEM = 'S60' + diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index 5860826778..c55936be2d 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -99,7 +99,7 @@ class PRS505(USBMS): if self._card_b_prefix is not None: if not write_cache(self._card_b_prefix): self._card_b_prefix = None - + self.booklist_class.rebuild_collections = self.rebuild_collections def get_device_information(self, end_session=True): return (self.gui_name, '', '', '') @@ -145,7 +145,7 @@ class PRS505(USBMS): blists[i] = booklists[i] opts = self.settings() if opts.extra_customization: - collections = [x.strip() for x in + collections = [x.lower().strip() for x in opts.extra_customization.split(',')] else: collections = [] @@ -156,4 +156,10 @@ class PRS505(USBMS): USBMS.sync_booklists(self, booklists, end_session=end_session) debug_print('PRS505: finished sync_booklists') + def rebuild_collections(self, booklist, oncard): + debug_print('PRS505: started rebuild_collections on card', oncard) + c = self.initialize_XML_cache() + c.rebuild_collections(booklist, {'carda':1, 'cardb':2}.get(oncard, 0)) + c.write() + debug_print('PRS505: finished rebuild_collections') diff --git a/src/calibre/devices/prs505/sony_cache.py b/src/calibre/devices/prs505/sony_cache.py index e7d0e4686c..b87ca937bc 100644 --- a/src/calibre/devices/prs505/sony_cache.py +++ b/src/calibre/devices/prs505/sony_cache.py @@ -6,10 +6,8 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' import os, time -from pprint import pprint from base64 import b64decode from uuid import uuid4 - from lxml import etree from calibre import prints, guess_type @@ -62,8 +60,7 @@ class XMLCache(object): def __init__(self, paths, prefixes, use_author_sort): if DEBUG: - debug_print('Building XMLCache...') - pprint(paths) + debug_print('Building XMLCache...', paths) self.paths = paths self.prefixes = prefixes self.use_author_sort = use_author_sort @@ -147,39 +144,73 @@ class XMLCache(object): if title+str(i) not in seen: title = title+str(i) playlist.set('title', title) + seen.add(title) break else: seen.add(title) - def get_playlist_map(self): - debug_print('Start get_playlist_map') - ans = {} + def build_id_playlist_map(self, bl_index): + ''' + Return a map of the collections in books: {lpaths: [collection names]} + ''' + debug_print('Start build_id_playlist_map') self.ensure_unique_playlist_titles() - debug_print('after ensure_unique_playlist_titles') self.prune_empty_playlists() - debug_print('get_playlist_map loop') - for i, root in self.record_roots.items(): - debug_print('get_playlist_map loop', i) - id_map = self.build_id_map(root) - ans[i] = [] - for playlist in root.xpath('//*[local-name()="playlist"]'): - items = [] - for item in playlist: - id_ = item.get('id', None) - record = id_map.get(id_, None) - if record is not None: - items.append(record) - ans[i].append((playlist.get('title'), items)) - debug_print('end get_playlist_map') - return ans + debug_print('after cleaning playlists') + root = self.record_roots[bl_index] + if root is None: + return + id_map = self.build_id_map(root) + playlist_map = {} + # foreach playlist, get the lpaths for the ids in it, then add to dict + for playlist in root.xpath('//*[local-name()="playlist"]'): + name = playlist.get('title') + if name is None: + debug_print('build_id_playlist_map: unnamed playlist!') + continue + for item in playlist: + # translate each id into its lpath + id_ = item.get('id', None) + if id_ is None: + debug_print('build_id_playlist_map: id_ is None!') + continue + bk = id_map.get(id_, None) + if bk is None: + debug_print('build_id_playlist_map: book is None!', id_) + continue + lpath = bk.get('path', None) + if lpath is None: + debug_print('build_id_playlist_map: lpath is None!', id_) + continue + if lpath not in playlist_map: + playlist_map[lpath] = [] + playlist_map[lpath].append(name) + debug_print('Finish build_id_playlist_map. Found', len(playlist_map)) + return playlist_map + + def reset_existing_playlists_map(self): + ''' + Call this method before calling get_or_create_playlist in the context of + a given job. Call it again after deleting any playlists. The current + implementation adds all new playlists before deleting any, so that + constraint is respected. + ''' + self._playlist_to_playlist_id_map = {} def get_or_create_playlist(self, bl_idx, title): + # maintain a private map of playlists to their ids. Don't check if it + # exists, because reset_existing_playlist_map must be called before it + # is used to ensure that deleted playlists are taken into account root = self.record_roots[bl_idx] - for playlist in root.xpath('//*[local-name()="playlist"]'): - if playlist.get('title', None) == title: - return playlist - if DEBUG: - debug_print('Creating playlist:', title) + if bl_idx not in self._playlist_to_playlist_id_map: + self._playlist_to_playlist_id_map[bl_idx] = {} + for playlist in root.xpath('//*[local-name()="playlist"]'): + pl_title = playlist.get('title', None) + if pl_title is not None: + self._playlist_to_playlist_id_map[bl_idx][pl_title] = playlist + if title in self._playlist_to_playlist_id_map[bl_idx]: + return self._playlist_to_playlist_id_map[bl_idx][title] + debug_print('Creating playlist:', title) ans = root.makeelement('{%s}playlist'%self.namespaces[bl_idx], nsmap=root.nsmap, attrib={ 'uuid' : uuid(), @@ -188,12 +219,12 @@ class XMLCache(object): 'sourceid': '1' }) root.append(ans) + self._playlist_to_playlist_id_map[bl_idx][title] = ans return ans # }}} def fix_ids(self): # {{{ - if DEBUG: - debug_print('Running fix_ids()') + debug_print('Running fix_ids()') def ensure_numeric_ids(root): idmap = {} @@ -251,7 +282,9 @@ class XMLCache(object): ensure_media_xml_base_ids(root) idmap = ensure_numeric_ids(root) - remap_playlist_references(root, idmap) + if len(idmap) > 0: + debug_print('fix_ids: found some non-numeric ids') + remap_playlist_references(root, idmap) if i == 0: sourceid, playlist_sid = 1, 0 base = 0 @@ -276,38 +309,19 @@ class XMLCache(object): def update_booklist(self, bl, bl_index): if bl_index not in self.record_roots: return - if DEBUG: - debug_print('Updating JSON cache:', bl_index) + debug_print('Updating JSON cache:', bl_index) + playlist_map = self.build_id_playlist_map(bl_index) root = self.record_roots[bl_index] - pmap = self.get_playlist_map()[bl_index] - playlist_map = {} - for title, records in pmap: - for record in records: - path = record.get('path', None) - if path: - if path not in playlist_map: - playlist_map[path] = [] - playlist_map[path].append(title) - lpath_map = self.build_lpath_map(root) for book in bl: record = lpath_map.get(book.lpath, None) if record is not None: title = record.get('title', None) if title is not None and title != book.title: - if DEBUG: - debug_print('Renaming title', book.title, 'to', title) + debug_print('Renaming title', book.title, 'to', title) book.title = title -# We shouldn't do this for Sonys, because the reader strips -# all but the first author. -# authors = record.get('author', None) -# if authors is not None: -# authors = string_to_authors(authors) -# if authors != book.authors: -# if DEBUG: -# prints('Renaming authors', book.authors, 'to', -# authors) -# book.authors = authors + # Don't set the author, because the reader strips all but + # the first author. for thumbnail in record.xpath( 'descendant::*[local-name()="thumbnail"]'): for img in thumbnail.xpath( @@ -318,47 +332,57 @@ class XMLCache(object): book.thumbnail = raw break break - if book.lpath in playlist_map: - tags = playlist_map[book.lpath] - book.device_collections = tags + book.device_collections = playlist_map.get(book.lpath, []) debug_print('Finished updating JSON cache:', bl_index) # }}} # Update XML from JSON {{{ def update(self, booklists, collections_attributes): - debug_print('Starting update XML from JSON') - playlist_map = self.get_playlist_map() - + debug_print('Starting update', collections_attributes) for i, booklist in booklists.items(): - if DEBUG: - debug_print('Updating XML Cache:', i) + playlist_map = self.build_id_playlist_map(i) + debug_print('Updating XML Cache:', i) root = self.record_roots[i] lpath_map = self.build_lpath_map(root) + gtz_count = ltz_count = 0 for book in booklist: path = os.path.join(self.prefixes[i], *(book.lpath.split('/'))) -# record = self.book_by_lpath(book.lpath, root) record = lpath_map.get(book.lpath, None) if record is None: record = self.create_text_record(root, i, book.lpath) - self.update_text_record(record, book, path, i) - - bl_pmap = playlist_map[i] - self.update_playlists(i, root, booklist, bl_pmap, - collections_attributes) + (gtz_count, ltz_count) = self.update_text_record(record, book, + path, i, gtz_count, ltz_count) + # Ensure the collections in the XML database are recorded for + # this book + if book.device_collections is None: + book.device_collections = [] + book.device_collections = playlist_map.get(book.lpath, []) + debug_print('Timezone votes: %d GMT, %d LTZ'%(gtz_count, ltz_count)) + self.update_playlists(i, root, booklist, collections_attributes) + # Update the device collections because update playlist could have added + # some new ones. + debug_print('In update/ Starting refresh of device_collections') + for i, booklist in booklists.items(): + playlist_map = self.build_id_playlist_map(i) + for book in booklist: + book.device_collections = playlist_map.get(book.lpath, []) + self.fix_ids() + debug_print('Finished update') + def rebuild_collections(self, booklist, bl_index): + if bl_index not in self.record_roots: + return + root = self.record_roots[bl_index] + self.update_playlists(bl_index, root, booklist, []) self.fix_ids() - # This is needed to update device_collections - for i, booklist in booklists.items(): - self.update_booklist(booklist, i) - debug_print('Finished update XML from JSON') - - def update_playlists(self, bl_index, root, booklist, playlist_map, - collections_attributes): - debug_print('Starting update_playlists') + def update_playlists(self, bl_index, root, booklist, collections_attributes): + debug_print('Starting update_playlists', collections_attributes, bl_index) + self.reset_existing_playlists_map() collections = booklist.get_collections(collections_attributes) lpath_map = self.build_lpath_map(root) + debug_print('update_playlists: finished building maps') for category, books in collections.items(): records = [lpath_map.get(b.lpath, None) for b in books] # Remove any books that were not found, although this @@ -367,25 +391,34 @@ class XMLCache(object): debug_print('WARNING: Some elements in the JSON cache were not' ' found in the XML cache') records = [x for x in records if x is not None] + # Ensure each book has an ID. for rec in records: if rec.get('id', None) is None: rec.set('id', str(self.max_id(root)+1)) ids = [x.get('id', None) for x in records] + # Given that we set the ids, there shouldn't be any None's. But + # better to be safe... if None in ids: - if DEBUG: - debug_print('WARNING: Some elements do not have ids') - ids = [x for x in ids if x is not None] + debug_print('WARNING: Some elements do not have ids') + ids = [x for x in ids if x is not None] playlist = self.get_or_create_playlist(bl_index, category) + # Get the books currently in the playlist. We will need them to be + # sure to put back any books that were manually added. playlist_ids = [] for item in playlist: id_ = item.get('id', None) if id_ is not None: playlist_ids.append(id_) + # Empty the playlist. We do this so that the playlist will have the + # order specified by get_collections for item in list(playlist): playlist.remove(item) + # Get a list of ids not known by get_collections extra_ids = [x for x in playlist_ids if x not in ids] + # Rebuild the collection in the order specified by get_collections. Then + # add the ids that get_collections didn't know about. for id_ in ids + extra_ids: item = playlist.makeelement( '{%s}item'%self.namespaces[bl_index], @@ -423,11 +456,38 @@ class XMLCache(object): root.append(ans) return ans - def update_text_record(self, record, book, path, bl_index): + def update_text_record(self, record, book, path, bl_index, gtz_count, ltz_count): + ''' + Update the Sony database from the book. This is done if the timestamp in + the db differs from the timestamp on the file. + ''' + + # It seems that a Sony device can sometimes know what timezone it is in, + # and apparently converts the dates to GMT when it writes them to the + # db. Unfortunately, we can't tell when it does this, so we use a + # horrible heuristic. First, set dates only for new books, trying to + # avoid upsetting the sony. Use the timezone determined through the + # voting described next. Second, voting: if a book is not new, compare + # its Sony DB date against localtime and gmtime. Count the matches. When + # we must set a date, use the one with the most matches. Use localtime + # if the case of a tie, and hope it is right. timestamp = os.path.getmtime(path) - date = strftime(timestamp) - if date != record.get('date', None): + rec_date = record.get('date', None) + if not getattr(book, '_new_book', False): # book is not new + if strftime(timestamp, zone=time.gmtime) == rec_date: + gtz_count += 1 + elif strftime(timestamp, zone=time.localtime) == rec_date: + ltz_count += 1 + else: # book is new. Set the time using the current votes + if ltz_count >= gtz_count: + tz = time.localtime + debug_print("Using localtime TZ for new book", book.lpath) + else: + tz = time.gmtime + debug_print("Using GMT TZ for new book", book.lpath) + date = strftime(timestamp, zone=tz) record.set('date', date) + record.set('size', str(os.stat(path).st_size)) title = book.title if book.title else _('Unknown') record.set('title', title) @@ -452,6 +512,7 @@ class XMLCache(object): if 'id' not in record.attrib: num = self.max_id(record.getroottree().getroot()) record.set('id', str(num+1)) + return (gtz_count, ltz_count) # }}} # Writing the XML files {{{ @@ -544,10 +605,5 @@ class XMLCache(object): break self.namespaces[i] = ns -# if DEBUG: -# debug_print('Found nsmaps:') -# pprint(self.nsmaps) -# debug_print('Found namespaces:') -# pprint(self.namespaces) # }}} diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index be154f35c1..42d0f3c863 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -11,10 +11,11 @@ from calibre.devices.mime import mime_type_ext from calibre.devices.interface import BookList as _BookList from calibre.constants import filesystem_encoding, preferred_encoding from calibre import isbytestring +from calibre.utils.config import prefs class Book(MetaInformation): - BOOK_ATTRS = ['lpath', 'size', 'mime', 'device_collections'] + BOOK_ATTRS = ['lpath', 'size', 'mime', 'device_collections', '_new_book'] JSON_ATTRS = [ 'lpath', 'title', 'authors', 'mime', 'size', 'tags', 'author_sort', @@ -29,6 +30,7 @@ class Book(MetaInformation): MetaInformation.__init__(self, '') + self._new_book = False self.device_collections = [] self.path = os.path.join(prefix, lpath) if os.sep == '\\': @@ -76,7 +78,7 @@ class Book(MetaInformation): in C{other} takes precedence, unless the information in C{other} is NULL. ''' - MetaInformation.smart_update(self, other) + MetaInformation.smart_update(self, other, replace_tags=True) for attr in self.BOOK_ATTRS: if hasattr(other, attr): @@ -132,10 +134,28 @@ class CollectionsBookList(BookList): def get_collections(self, collection_attributes): collections = {} series_categories = set([]) - collection_attributes = list(collection_attributes)+['device_collections'] - for attr in collection_attributes: - attr = attr.strip() - for book in self: + # This map of sets is used to avoid linear searches when testing for + # book equality + collections_lpaths = {} + for book in self: + # Make sure we can identify this book via the lpath + lpath = getattr(book, 'lpath', None) + if lpath is None: + continue + # Decide how we will build the collections. The default: leave the + # book in all existing collections. Do not add any new ones. + attrs = ['device_collections'] + if getattr(book, '_new_book', False): + if prefs['preserve_user_collections']: + # Ensure that the book is in all the book's existing + # collections plus all metadata collections + attrs += collection_attributes + else: + # The book's existing collections are ignored. Put the book + # in collections defined by its metadata. + attrs = collection_attributes + for attr in attrs: + attr = attr.strip() val = getattr(book, attr, None) if not val: continue if isbytestring(val): @@ -150,11 +170,12 @@ class CollectionsBookList(BookList): continue if category not in collections: collections[category] = [] - if book not in collections[category]: + collections_lpaths[category] = set() + if lpath not in collections_lpaths[category]: + collections_lpaths[category].add(lpath) collections[category].append(book) - if attr == 'series': - series_categories.add(category) - + if attr == 'series': + series_categories.add(category) # Sort collections for category, books in collections.items(): def tgetter(x): @@ -167,3 +188,15 @@ class CollectionsBookList(BookList): books.sort(cmp=lambda x,y:cmp(getter(x), getter(y))) return collections + def rebuild_collections(self, booklist, oncard): + ''' + For each book in the booklist for the card oncard, remove it from all + its current collections, then add it to the collections specified in + device_collections. + + oncard is None for the main memory, carda for card A, cardb for card B, + etc. + + booklist is the object created by the :method:`books` call above. + ''' + pass diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index d899c8e995..55790420f2 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -78,9 +78,6 @@ class Device(DeviceConfig, DevicePlugin): STORAGE_CARD_VOLUME_LABEL = '' STORAGE_CARD2_VOLUME_LABEL = None - SUPPORTS_SUB_DIRS = False - MUST_READ_METADATA = False - SUPPORTS_USE_AUTHOR_SORT = False EBOOK_DIR_MAIN = '' EBOOK_DIR_CARD_A = '' diff --git a/src/calibre/devices/usbms/deviceconfig.py b/src/calibre/devices/usbms/deviceconfig.py index 5edefff743..e074387175 100644 --- a/src/calibre/devices/usbms/deviceconfig.py +++ b/src/calibre/devices/usbms/deviceconfig.py @@ -13,6 +13,10 @@ class DeviceConfig(object): EXTRA_CUSTOMIZATION_MESSAGE = None EXTRA_CUSTOMIZATION_DEFAULT = None + SUPPORTS_SUB_DIRS = False + MUST_READ_METADATA = False + SUPPORTS_USE_AUTHOR_SORT = False + #: If None the default is used SAVE_TEMPLATE = None @@ -23,9 +27,14 @@ class DeviceConfig(object): config().parse().send_template @classmethod - def _config(cls): + def _config_base_name(cls): klass = cls if isinstance(cls, type) else cls.__class__ - c = Config('device_drivers_%s' % klass.__name__, _('settings for device drivers')) + return klass.__name__ + + @classmethod + def _config(cls): + name = cls._config_base_name() + c = Config('device_drivers_%s' % name, _('settings for device drivers')) c.add_opt('format_map', default=cls.FORMATS, help=_('Ordered list of formats the device will accept')) c.add_opt('use_subdirs', default=True, diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index 2fc8b0d814..377ec36c16 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -233,6 +233,7 @@ class USBMS(CLI, Device): book = self.book_class(prefix, lpath, other=info) if book.size is None: book.size = os.stat(self.normalize_path(path)).st_size + book._new_book = True # Must be before add_book booklists[blist].add_book(book, replace_metadata=True) self.report_progress(1.0, _('Adding books to device metadata listing...')) debug_print('USBMS: finished adding metadata') @@ -273,6 +274,9 @@ class USBMS(CLI, Device): self.report_progress(1.0, _('Removing books from device metadata listing...')) debug_print('USBMS: finished removing metadata for %d books'%(len(paths))) + # If you override this method and you use book._new_book, then you must + # complete the processing before you call this method. The flag is cleared + # at the end just before the return def sync_booklists(self, booklists, end_session=True): debug_print('USBMS: starting sync_booklists') @@ -286,11 +290,18 @@ class USBMS(CLI, Device): js = [item.to_json() for item in booklists[listid] if hasattr(item, 'to_json')] with open(self.normalize_path(os.path.join(prefix, self.METADATA_CACHE)), 'wb') as f: - json.dump(js, f, indent=2, encoding='utf-8') + f.write(json.dumps(js, indent=2, encoding='utf-8')) write_prefix(self._main_prefix, 0) write_prefix(self._card_a_prefix, 1) write_prefix(self._card_b_prefix, 2) + # Clear the _new_book indication, as we are supposed to be done with + # adding books at this point + for blist in booklists: + if blist is not None: + for book in blist: + book._new_book = False + self.report_progress(1.0, _('Sending metadata to device...')) debug_print('USBMS: finished sync_booklists') diff --git a/src/calibre/ebooks/chm/input.py b/src/calibre/ebooks/chm/input.py index a3a49296d2..e3c3deba78 100644 --- a/src/calibre/ebooks/chm/input.py +++ b/src/calibre/ebooks/chm/input.py @@ -49,7 +49,6 @@ class CHMInput(InputFormatPlugin): log.debug('stream.name=%s' % stream.name) mainname = self._chmtohtml(tdir, chm_name, no_images, log) mainpath = os.path.join(tdir, mainname) - #raw_input() metadata = get_metadata_from_reader(self._chm_reader) @@ -92,7 +91,7 @@ class CHMInput(InputFormatPlugin): metadata.add('identifier', mi.isbn, attrib={'scheme':'ISBN'}) if not metadata.language: oeb.logger.warn(u'Language not specified') - metadata.add('language', get_lang()) + metadata.add('language', get_lang().replace('_', '-')) if not metadata.creator: oeb.logger.warn('Creator not specified') metadata.add('creator', _('Unknown')) @@ -141,10 +140,9 @@ class CHMInput(InputFormatPlugin): log.debug('Found %d section nodes' % len(chapters)) htmlpath = os.path.splitext(hhcpath)[0] + ".html" f = open(htmlpath, 'wb') - f.write('\n') - if chapters: + f.write('\n') path0 = chapters[0][1] subpath = os.path.dirname(path0) @@ -158,7 +156,9 @@ class CHMInput(InputFormatPlugin): url = url.encode('utf-8') f.write(url) - f.write("") + f.write("") + else: + f.write(hhcdata) f.close() return htmlpath diff --git a/src/calibre/ebooks/chm/reader.py b/src/calibre/ebooks/chm/reader.py index d0a81e8e7f..67a2d36607 100644 --- a/src/calibre/ebooks/chm/reader.py +++ b/src/calibre/ebooks/chm/reader.py @@ -8,7 +8,7 @@ import os, re from mimetypes import guess_type as guess_mimetype from calibre.ebooks.BeautifulSoup import BeautifulSoup, NavigableString -from calibre.constants import iswindows +from calibre.constants import iswindows, filesystem_encoding from calibre.utils.chm.chm import CHMFile from calibre.utils.chm.chmlib import ( CHM_RESOLVE_SUCCESS, CHM_ENUMERATE_NORMAL, @@ -78,6 +78,8 @@ class CHMError(Exception): class CHMReader(CHMFile): def __init__(self, input, log): CHMFile.__init__(self) + if isinstance(input, unicode): + input = input.encode(filesystem_encoding) if not self.LoadCHM(input): raise CHMError("Unable to open CHM file '%s'"%(input,)) self.log = log @@ -91,7 +93,6 @@ class CHMReader(CHMFile): self.root, ext = os.path.splitext(self.topics.lstrip('/')) self.hhc_path = self.root + ".hhc" - def _parse_toc(self, ul, basedir=os.getcwdu()): toc = TOC(play_order=self._playorder, base_path=basedir, text='') self._playorder += 1 @@ -152,6 +153,8 @@ class CHMReader(CHMFile): if f.lower() == self.hhc_path.lower(): self.hhc_path = f break + if self.hhc_path not in files and files: + self.hhc_path = files[0] def _reformat(self, data): try: @@ -159,7 +162,7 @@ class CHMReader(CHMFile): soup = BeautifulSoup(data) except ValueError: # hit some strange encoding problems... - print "Unable to parse html for cleaning, leaving it :(" + self.log.exception("Unable to parse html for cleaning, leaving it") return data # nuke javascript... [s.extract() for s in soup('script')] diff --git a/src/calibre/ebooks/compression/palmdoc.c b/src/calibre/ebooks/compression/palmdoc.c index b85a404eb6..4d913dfd2b 100644 --- a/src/calibre/ebooks/compression/palmdoc.c +++ b/src/calibre/ebooks/compression/palmdoc.c @@ -151,6 +151,7 @@ cpalmdoc_do_compress(buffer *b, char *output) { for (j=0; j < temp.len; j++) *(output++) = (char)temp.data[j]; } } + PyMem_Free(temp.data); return output - head; } @@ -168,7 +169,9 @@ cpalmdoc_compress(PyObject *self, PyObject *args) { for (j = 0; j < input_len; j++) b.data[j] = (_input[j] < 0) ? _input[j]+256 : _input[j]; b.len = input_len; - output = (char *)PyMem_Malloc(sizeof(char) * b.len); + // Make the output buffer larger than the input as sometimes + // compression results in a larger block + output = (char *)PyMem_Malloc(sizeof(char) * (int)(1.25*b.len)); if (output == NULL) return PyErr_NoMemory(); j = cpalmdoc_do_compress(&b, output); if ( j == 0) return PyErr_NoMemory(); diff --git a/src/calibre/ebooks/conversion/preprocess.py b/src/calibre/ebooks/conversion/preprocess.py index 7a7f362169..3a18d38b22 100644 --- a/src/calibre/ebooks/conversion/preprocess.py +++ b/src/calibre/ebooks/conversion/preprocess.py @@ -25,13 +25,13 @@ convert_entities = functools.partial(entity_to_unicode, _span_pat = re.compile('', re.DOTALL|re.IGNORECASE) LIGATURES = { - u'\u00c6': u'AE', - u'\u00e6': u'ae', - u'\u0152': u'OE', - u'\u0153': u'oe', - u'\u0132': u'IJ', - u'\u0133': u'ij', - u'\u1D6B': u'ue', +# u'\u00c6': u'AE', +# u'\u00e6': u'ae', +# u'\u0152': u'OE', +# u'\u0153': u'oe', +# u'\u0132': u'IJ', +# u'\u0133': u'ij', +# u'\u1D6B': u'ue', u'\uFB00': u'ff', u'\uFB01': u'fi', u'\uFB02': u'fl', @@ -107,9 +107,21 @@ class CSSPreProcessor(object): PAGE_PAT = re.compile(r'@page[^{]*?{[^}]*?}') - def __call__(self, data): + def __call__(self, data, add_namespace=False): + from calibre.ebooks.oeb.base import XHTML_CSS_NAMESPACE data = self.PAGE_PAT.sub('', data) - return data + if not add_namespace: + return data + ans, namespaced = [], False + for line in data.splitlines(): + ll = line.lstrip() + if not (namespaced or ll.startswith('@import') or + ll.startswith('@charset')): + ans.append(XHTML_CSS_NAMESPACE.strip()) + namespaced = True + ans.append(line) + + return u'\n'.join(ans) class HTMLPreProcessor(object): @@ -268,7 +280,7 @@ class HTMLPreProcessor(object): if getattr(self.extra_opts, 'remove_footer', None): try: - rules.insert(0 + rules.insert(0, (re.compile(self.extra_opts.footer_regex), lambda match : '') ) except: diff --git a/src/calibre/ebooks/epub/fix/__init__.py b/src/calibre/ebooks/epub/fix/__init__.py new file mode 100644 index 0000000000..5bdbd7c7f6 --- /dev/null +++ b/src/calibre/ebooks/epub/fix/__init__.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.customize import Plugin + +class InvalidEpub(ValueError): + pass + +class ePubFixer(Plugin): + + supported_platforms = ['windows', 'osx', 'linux'] + author = 'Kovid Goyal' + type = _('ePub Fixer') + can_be_disabled = True + + # API that subclasses must implement {{{ + @property + def short_description(self): + raise NotImplementedError + + @property + def long_description(self): + raise NotImplementedError + + @property + def fix_name(self): + raise NotImplementedError + + @property + def options(self): + ''' + Return a list of 4-tuples + (option_name, type, default, help_text) + type is one of 'bool', 'int', 'string' + ''' + return [] + + def run(self, container, opts, log, fix=False): + raise NotImplementedError + # }}} + + def add_options_to_parser(self, parser): + parser.add_option('--' + self.fix_name.replace('_', '-'), + help=self.long_description, action='store_true', default=False) + for option in self.options: + action = 'store' + if option[1] == 'bool': + action = 'store_true' + kwargs = {'action': action, 'default':option[2], 'help':option[3]} + if option[1] != 'bool': + kwargs['type'] = option[1] + parser.add_option('--'+option[0].replace('_', '-'), **kwargs) + diff --git a/src/calibre/ebooks/epub/fix/container.py b/src/calibre/ebooks/epub/fix/container.py new file mode 100644 index 0000000000..7a7c17427a --- /dev/null +++ b/src/calibre/ebooks/epub/fix/container.py @@ -0,0 +1,182 @@ +#!/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 os, posixpath, urllib, sys + +from lxml import etree + +from calibre.ebooks.epub.fix import InvalidEpub +from calibre import guess_type, prepare_string_for_xml +from calibre.ebooks.chardet import xml_to_unicode +from calibre.constants import iswindows +from calibre.utils.zipfile import ZipFile, ZIP_STORED + +exists, join = os.path.exists, os.path.join + +OCF_NS = 'urn:oasis:names:tc:opendocument:xmlns:container' +OPF_NS = 'http://www.idpf.org/2007/opf' + +class Container(object): + + META_INF = { + 'container.xml' : True, + 'manifest.xml' : False, + 'encryption.xml' : False, + 'metadata.xml' : False, + 'signatures.xml' : False, + 'rights.xml' : False, + } + + def __init__(self, path, log): + self.root = os.path.abspath(path) + self.log = log + self.dirtied = set([]) + self.cache = {} + self.mime_map = {} + + if exists(join(self.root, 'mimetype')): + os.remove(join(self.root, 'mimetype')) + + container_path = join(self.root, 'META-INF', 'container.xml') + if not exists(container_path): + raise InvalidEpub('No META-INF/container.xml in epub') + self.container = etree.fromstring(open(container_path, 'rb').read()) + opf_files = self.container.xpath(( + r'child::ocf:rootfiles/ocf:rootfile' + '[@media-type="%s" and @full-path]'%guess_type('a.opf')[0] + ), namespaces={'ocf':OCF_NS} + ) + if not opf_files: + raise InvalidEpub('META-INF/container.xml contains no link to OPF file') + opf_path = os.path.join(self.root, + *opf_files[0].get('full-path').split('/')) + if not exists(opf_path): + raise InvalidEpub('OPF file does not exist at location pointed to' + ' by META-INF/container.xml') + + # Map of relative paths with / separators to absolute + # paths on filesystem with os separators + self.name_map = {} + for dirpath, dirnames, filenames in os.walk(self.root): + for f in filenames: + path = join(dirpath, f) + name = os.path.relpath(path, self.root).replace(os.sep, '/') + self.name_map[name] = path + if path == opf_path: + self.opf_name = name + self.mime_map[name] = guess_type('a.opf')[0] + + for item in self.opf.xpath( + '//opf:manifest/opf:item[@href and @media-type]', + namespaces={'opf':OPF_NS}): + href = item.get('href') + self.mime_map[self.href_to_name(href, + posixpath.dirname(self.opf_name))] = item.get('media-type') + + def manifest_worthy_names(self): + for name in self.name_map: + if name.endswith('.opf'): continue + if name.startswith('META-INF') and \ + posixpath.basename(name) in self.META_INF: continue + yield name + + def delete_name(self, name): + self.mime_map.pop(name, None) + path = self.name_map[name] + os.remove(path) + self.name_map.pop(name) + + def manifest_item_for_name(self, name): + href = self.name_to_href(name, + posixpath.dirname(self.opf_name)) + q = prepare_string_for_xml(href, attribute=True) + existing = self.opf.xpath('//opf:manifest/opf:item[@href="%s"]'%q, + namespaces={'opf':OPF_NS}) + if not existing: + return None + return existing[0] + + def add_name_to_manifest(self, name): + item = self.manifest_item_for_name(name) + if item is not None: + return + manifest = self.opf.xpath('//opf:manifest', namespaces={'opf':OPF_NS})[0] + item = manifest.makeelement('{%s}item'%OPF_NS, nsmap={'opf':OPF_NS}, + href=self.name_to_href(name, posixpath.dirname(self.opf_name)), + id=self.generate_manifest_id()) + mt = guess_type(posixpath.basename(name))[0] + if not mt: + mt = 'application/octest-stream' + item.set('media-type', mt) + manifest.append(item) + + def generate_manifest_id(self): + items = self.opf.xpath('//opf:manifest/opf:item[@id]', + namespaces={'opf':OPF_NS}) + ids = set([x.get('id') for x in items]) + for x in xrange(sys.maxint): + c = 'id%d'%x + if c not in ids: + return c + + @property + def opf(self): + return self.get(self.opf_name) + + def href_to_name(self, href, base=''): + href = urllib.unquote(href.partition('#')[0]) + name = href + if base: + name = posixpath.join(base, href) + return name + + def name_to_href(self, name, base): + if not base: + return name + return posixpath.relpath(name, base) + + def get_raw(self, name): + path = self.name_map[name] + return open(path, 'rb').read() + + def get(self, name): + if name in self.cache: + return self.cache[name] + raw = self.get_raw(name) + if name in self.mime_map: + raw = self._parse(raw, self.mime_map[name]) + self.cache[name] = raw + return raw + + def set(self, name, val): + self.cache[name] = val + self.dirtied.add(name) + + def _parse(self, raw, mimetype): + mt = mimetype.lower() + if mt.endswith('+xml'): + parser = etree.XMLParser(no_network=True, huge_tree=not iswindows) + return etree.fromstring(xml_to_unicode(raw, + strip_encoding_pats=True, assume_utf8=True)[0], parser=parser) + return raw + + def write(self, path): + for name in self.dirtied: + data = self.cache[name] + raw = data + if hasattr(data, 'xpath'): + raw = etree.tostring(data, encoding='utf-8', + xml_declaration=True) + with open(self.name_map[name], 'wb') as f: + f.write(raw) + self.dirtied.clear() + zf = ZipFile(path, 'w') + zf.writestr('mimetype', bytes(guess_type('a.epub')[0]), + compression=ZIP_STORED) + zf.add_dir(self.root) + zf.close() + diff --git a/src/calibre/ebooks/epub/fix/epubcheck.py b/src/calibre/ebooks/epub/fix/epubcheck.py new file mode 100644 index 0000000000..f5c8086e7c --- /dev/null +++ b/src/calibre/ebooks/epub/fix/epubcheck.py @@ -0,0 +1,82 @@ +#!/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.ebooks.epub.fix import ePubFixer, InvalidEpub +from calibre.utils.date import parse_date, strptime + + +class Epubcheck(ePubFixer): + + name = 'Workaround epubcheck bugs' + + @property + def short_description(self): + return _('Workaround epubcheck bugs') + + @property + def long_description(self): + return _('Workarounds for bugs in the latest release of epubcheck. ' + 'epubcheck reports many things as errors that are not ' + 'actually errors. %prog will try to detect these and replace ' + 'them with constructs that epubcheck likes. This may cause ' + 'significant changes to your epub, complain to the epubcheck ' + 'project.') + + @property + def fix_name(self): + return 'epubcheck' + + def fix_pubdates(self): + dirtied = False + opf = self.container.opf + for dcdate in opf.xpath('//dc:date', + namespaces={'dc':'http://purl.org/dc/elements/1.1/'}): + raw = dcdate.text + if not raw: raw = '' + default = strptime('2000-1-1', '%Y-%m-%d', as_utc=True) + try: + ts = parse_date(raw, assume_utc=False, as_utc=True, + default=default) + except: + raise InvalidEpub('Invalid date set in OPF', raw) + sval = ts.strftime('%Y-%m-%d') + if sval != raw: + self.log.error( + 'OPF contains date', raw, 'that epubcheck does not like') + if self.fix: + dcdate.text = sval + self.log('\tReplaced', raw, 'with', sval) + dirtied = True + if dirtied: + self.container.set(self.container.opf_name, opf) + + def fix_preserve_aspect_ratio(self): + for name in self.container.name_map: + mt = self.container.mime_map.get(name, '') + if mt.lower() == 'application/xhtml+xml': + root = self.container.get(name) + dirtied = False + for svg in root.xpath('//svg:svg[@preserveAspectRatio="none"]', + namespaces={'svg':'http://www.w3.org/2000/svg'}): + self.log.error('Found element with' + ' preserveAspectRatio="none" which epubcheck ' + 'cannot handle') + if self.fix: + svg.set('preserveAspectRatio', 'xMidYMid meet') + dirtied = True + self.log('\tReplaced none with xMidYMid meet') + if dirtied: + self.container.set(name, root) + + + def run(self, container, opts, log, fix=False): + self.container = container + self.opts = opts + self.log = log + self.fix = fix + self.fix_pubdates() + self.fix_preserve_aspect_ratio() diff --git a/src/calibre/ebooks/epub/fix/main.py b/src/calibre/ebooks/epub/fix/main.py new file mode 100644 index 0000000000..3f9ca260b3 --- /dev/null +++ b/src/calibre/ebooks/epub/fix/main.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' + +import sys, os + +from calibre.utils.config import OptionParser +from calibre.ptempfile import TemporaryDirectory +from calibre import CurrentDir +from calibre.utils.zipfile import ZipFile +from calibre.utils.logging import default_log +from calibre.customize.ui import epub_fixers +from calibre.ebooks.epub.fix.container import Container + +def option_parser(): + parser = OptionParser(usage=_( + '%prog [options] file.epub\n\n' + 'Fix common problems in EPUB files that can cause them ' + 'to be rejected by poorly designed publishing services.\n\n' + 'By default, no fixing is done and messages are printed out ' + 'for each error detected. Use the options to control which errors ' + 'are automatically fixed.')) + for fixer in epub_fixers(): + fixer.add_options_to_parser(parser) + + return parser + + +def run(epub, opts, log): + with TemporaryDirectory('_epub-fix') as tdir: + with CurrentDir(tdir): + zf = ZipFile(epub) + zf.extractall() + zf.close() + container = Container(tdir, log) + for fixer in epub_fixers(): + fix = getattr(opts, fixer.fix_name, False) + fixer.run(container, opts, log, fix=fix) + container.write(epub) + +def main(args=sys.argv): + parser = option_parser() + opts, args = parser.parse_args(args) + if len(args) != 2: + parser.print_help() + print + default_log.error(_('You must specify an epub file')) + return + epub = os.path.abspath(args[1]) + run(epub, opts, default_log) + +if __name__ == '__main__': + main() diff --git a/src/calibre/ebooks/epub/fix/unmanifested.py b/src/calibre/ebooks/epub/fix/unmanifested.py new file mode 100644 index 0000000000..71913e9d50 --- /dev/null +++ b/src/calibre/ebooks/epub/fix/unmanifested.py @@ -0,0 +1,49 @@ +#!/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.ebooks.epub.fix import ePubFixer + +class Unmanifested(ePubFixer): + + name = 'Fix unmanifested files' + + @property + def short_description(self): + return _('Fix unmanifested files') + + @property + def long_description(self): + return _('Fix unmanifested files. %prog can either add them to ' + 'the manifest or delete them as specified by the ' + 'delete unmanifested option.') + + @property + def fix_name(self): + return 'unmanifested' + + @property + def options(self): + return [('delete_unmanifested', 'bool', False, + _('Delete unmanifested files instead of adding them to the manifest'))] + + def run(self, container, opts, log, fix=False): + dirtied = False + for name in list(container.manifest_worthy_names()): + item = container.manifest_item_for_name(name) + if item is None: + log.error(name, 'not in manifest') + if fix: + if opts.delete_unmanifested: + container.delete_name(name) + log('\tDeleted') + else: + container.add_name_to_manifest(name) + log('\tAdded to manifest') + dirtied = True + if dirtied: + container.set(container.opf_name, container.opf) diff --git a/src/calibre/ebooks/epub/output.py b/src/calibre/ebooks/epub/output.py index 8708b98d97..4146031cd2 100644 --- a/src/calibre/ebooks/epub/output.py +++ b/src/calibre/ebooks/epub/output.py @@ -84,7 +84,7 @@ class EPUBOutput(OutputFormatPlugin): OptionRecommendation(name='no_svg_cover', recommended_value=False, help=_('Do not use SVG for the book cover. Use this option if ' - 'your EPUB is going to be used ona device that does not ' + 'your EPUB is going to be used on a device that does not ' 'support SVG, like the iPhone or the JetBook Lite. ' 'Without this option, such devices will display the cover ' 'as a blank page.') @@ -380,10 +380,9 @@ class EPUBOutput(OutputFormatPlugin): sel = '.'+lb.get('class') for rule in stylesheet.data.cssRules.rulesOfType(CSSRule.STYLE_RULE): if sel == rule.selectorList.selectorText: - val = rule.style.removeProperty('margin-left') - pval = rule.style.getProperty('padding-left') - if val and not pval: - rule.style.setProperty('padding-left', val) + rule.style.removeProperty('margin-left') + # padding-left breaks rendering in webkit and gecko + rule.style.removeProperty('padding-left') # }}} diff --git a/src/calibre/ebooks/html/input.py b/src/calibre/ebooks/html/input.py index 6108aa329d..73bc22be66 100644 --- a/src/calibre/ebooks/html/input.py +++ b/src/calibre/ebooks/html/input.py @@ -20,7 +20,7 @@ from itertools import izip from calibre.customize.conversion import InputFormatPlugin from calibre.ebooks.chardet import xml_to_unicode from calibre.customize.conversion import OptionRecommendation -from calibre.constants import islinux, isfreebsd +from calibre.constants import islinux, isfreebsd, iswindows from calibre import unicode_path from calibre.utils.localization import get_lang from calibre.utils.filenames import ascii_filename @@ -32,9 +32,14 @@ class Link(object): @classmethod def url_to_local_path(cls, url, base): - path = urlunparse(('', '', url.path, url.params, url.query, '')) + path = url.path + isabs = False + if iswindows and path.startswith('/'): + path = path[1:] + isabs = True + path = urlunparse(('', '', path, url.params, url.query, '')) path = unquote(path) - if os.path.isabs(path): + if isabs or os.path.isabs(path): return path return os.path.abspath(os.path.join(base, path)) @@ -307,6 +312,7 @@ class HTMLInput(InputFormatPlugin): xpath from calibre import guess_type import cssutils + self.OEB_STYLES = OEB_STYLES oeb = create_oebbook(log, None, opts, self, encoding=opts.input_encoding, populate=False) self.oeb = oeb @@ -323,7 +329,7 @@ class HTMLInput(InputFormatPlugin): metadata.add('identifier', mi.isbn, attrib={'scheme':'ISBN'}) if not metadata.language: oeb.logger.warn(u'Language not specified') - metadata.add('language', get_lang()) + metadata.add('language', get_lang().replace('_', '-')) if not metadata.creator: oeb.logger.warn('Creator not specified') metadata.add('creator', self.oeb.translate(__('Unknown'))) @@ -371,7 +377,7 @@ class HTMLInput(InputFormatPlugin): rewrite_links(item.data, partial(self.resource_adder, base=dpath)) for item in oeb.manifest.values(): - if item.media_type in OEB_STYLES: + if item.media_type in self.OEB_STYLES: dpath = None for path, href in self.added_resources.items(): if href == item.href: @@ -409,12 +415,30 @@ class HTMLInput(InputFormatPlugin): oeb.container = DirContainer(os.getcwdu(), oeb.log) return oeb + def link_to_local_path(self, link_, base=None): + if not isinstance(link_, unicode): + try: + link_ = link_.decode('utf-8', 'error') + except: + self.log.warn('Failed to decode link %r. Ignoring'%link_) + return None, None + try: + l = Link(link_, base if base else os.getcwdu()) + except: + self.log.exception('Failed to process link: %r'%link_) + return None, None + if l.path is None: + # Not a local resource + return None, None + link = l.path.replace('/', os.sep).strip() + frag = l.fragment + if not link: + return None, None + return link, frag def resource_adder(self, link_, base=None): - link = self.urlnormalize(link_) - link, frag = self.urldefrag(link) - link = unquote(link).replace('/', os.sep) - if not link.strip(): + link, frag = self.link_to_local_path(link_, base=base) + if link is None: return link_ try: if base and not os.path.isabs(link): @@ -442,6 +466,9 @@ class HTMLInput(InputFormatPlugin): item = self.oeb.manifest.add(id, href, media_type) item.html_input_href = bhref + if guessed in self.OEB_STYLES: + item.override_css_fetch = partial( + self.css_import_handler, os.path.dirname(link)) item.data self.added_resources[link] = href @@ -450,7 +477,17 @@ class HTMLInput(InputFormatPlugin): nlink = '#'.join((nlink, frag)) return nlink - + def css_import_handler(self, base, href): + link, frag = self.link_to_local_path(href, base=base) + if link is None or not os.access(link, os.R_OK) or os.path.isdir(link): + return (None, None) + try: + raw = open(link, 'rb').read().decode('utf-8', 'replace') + raw = self.oeb.css_preprocessor(raw, add_namespace=True) + except: + self.log.exception('Failed to read CSS file: %r'%link) + return (None, None) + return (None, raw) diff --git a/src/calibre/ebooks/lrf/input.py b/src/calibre/ebooks/lrf/input.py index f511ba7f09..256ab6fdf2 100644 --- a/src/calibre/ebooks/lrf/input.py +++ b/src/calibre/ebooks/lrf/input.py @@ -367,7 +367,7 @@ class LRFInput(InputFormatPlugin): xml = d.to_xml(write_files=True) if options.verbose > 2: open('lrs.xml', 'wb').write(xml.encode('utf-8')) - parser = etree.XMLParser(recover=True, no_network=True) + parser = etree.XMLParser(no_network=True, huge_tree=True) doc = etree.fromstring(xml, parser=parser) char_button_map = {} for x in doc.xpath('//CharButton[@refobj]'): diff --git a/src/calibre/ebooks/lrf/objects.py b/src/calibre/ebooks/lrf/objects.py index 8f69e94013..9f0dd4211c 100644 --- a/src/calibre/ebooks/lrf/objects.py +++ b/src/calibre/ebooks/lrf/objects.py @@ -870,7 +870,7 @@ class Text(LRFStream): open_containers = collections.deque() for c in self.content: if isinstance(c, basestring): - s += prepare_string_for_xml(c) + s += prepare_string_for_xml(c).replace('\0', '') elif c is None: if open_containers: p = open_containers.pop() diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index 690cca511a..0dbffd5f7f 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -268,7 +268,7 @@ class MetaInformation(object): ): prints(x, getattr(self, x, 'None')) - def smart_update(self, mi): + def smart_update(self, mi, replace_tags=False): ''' Merge the information in C{mi} into self. In case of conflicts, the information in C{mi} takes precedence, unless the information in mi is NULL. @@ -282,7 +282,7 @@ class MetaInformation(object): for attr in ('author_sort', 'title_sort', 'category', 'publisher', 'series', 'series_index', 'rating', 'isbn', 'application_id', 'manifest', 'spine', 'toc', - 'cover', 'language', 'guide', 'book_producer', + 'cover', 'guide', 'book_producer', 'timestamp', 'lccn', 'lcc', 'ddc', 'pubdate', 'rights', 'publication_type', 'uuid'): if hasattr(mi, attr): @@ -291,7 +291,10 @@ class MetaInformation(object): setattr(self, attr, val) if mi.tags: - self.tags += mi.tags + if replace_tags: + self.tags = mi.tags + else: + self.tags += mi.tags self.tags = list(set(self.tags)) if mi.author_sort_map: @@ -314,6 +317,11 @@ class MetaInformation(object): if len(other_comments.strip()) > len(my_comments.strip()): self.comments = other_comments + other_lang = getattr(mi, 'language', None) + if other_lang and other_lang.lower() != 'und': + self.language = other_lang + + def format_series_index(self): try: x = float(self.series_index) diff --git a/src/calibre/ebooks/metadata/covers.py b/src/calibre/ebooks/metadata/covers.py new file mode 100644 index 0000000000..af213d1a6c --- /dev/null +++ b/src/calibre/ebooks/metadata/covers.py @@ -0,0 +1,15 @@ +#!/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.customize import Plugin + +class CoverDownload(Plugin): + + supported_platforms = ['windows', 'osx', 'linux'] + author = 'Kovid Goyal' + type = _('Cover download') diff --git a/src/calibre/ebooks/metadata/douban.py b/src/calibre/ebooks/metadata/douban.py index c881721fcc..c6a34b6162 100644 --- a/src/calibre/ebooks/metadata/douban.py +++ b/src/calibre/ebooks/metadata/douban.py @@ -15,7 +15,6 @@ from calibre.utils.config import OptionParser from calibre.ebooks.metadata.fetch import MetadataSource from calibre.utils.date import parse_date, utcnow -DOUBAN_API_KEY = None NAMESPACES = { 'openSearch':'http://a9.com/-/spec/opensearchrss/1.0/', 'atom' : 'http://www.w3.org/2005/Atom', @@ -35,13 +34,15 @@ date = XPath("descendant::db:attribute[@name='pubdate']") creator = XPath("descendant::db:attribute[@name='author']") tag = XPath("descendant::db:tag") +CALIBRE_DOUBAN_API_KEY = '0bd1672394eb1ebf2374356abec15c3d' + class DoubanBooks(MetadataSource): name = 'Douban Books' description = _('Downloads metadata from Douban.com') supported_platforms = ['windows', 'osx', 'linux'] # Platforms this plugin will run on author = 'Li Fanxi ' # The author of this plugin - version = (1, 0, 0) # The version number of this plugin + version = (1, 0, 1) # The version number of this plugin def fetch(self): try: @@ -65,7 +66,7 @@ class Query(object): type = "search" def __init__(self, title=None, author=None, publisher=None, isbn=None, - max_results=20, start_index=1): + max_results=20, start_index=1, api_key=''): assert not(title is None and author is None and publisher is None and \ isbn is None) assert (int(max_results) < 21) @@ -89,16 +90,16 @@ class Query(object): if self.type == "isbn": self.url = self.ISBN_URL + q - if DOUBAN_API_KEY is not None: - self.url = self.url + "?apikey=" + DOUBAN_API_KEY + if api_key != '': + self.url = self.url + "?apikey=" + api_key else: self.url = self.SEARCH_URL+urlencode({ 'q':q, 'max-results':max_results, 'start-index':start_index, }) - if DOUBAN_API_KEY is not None: - self.url = self.url + "&apikey=" + DOUBAN_API_KEY + if api_key != '': + self.url = self.url + "&apikey=" + api_key def __call__(self, browser, verbose): if verbose: @@ -177,7 +178,7 @@ class ResultList(list): d = None return d - def populate(self, entries, browser, verbose=False): + def populate(self, entries, browser, verbose=False, api_key=''): for x in entries: try: id_url = entry_id(x)[0].text @@ -186,8 +187,8 @@ class ResultList(list): report(verbose) mi = MetaInformation(title, self.get_authors(x)) try: - if DOUBAN_API_KEY is not None: - id_url = id_url + "?apikey=" + DOUBAN_API_KEY + if api_key != '': + id_url = id_url + "?apikey=" + api_key raw = browser.open(id_url).read() feed = etree.fromstring(raw) x = entry(feed)[0] @@ -203,12 +204,16 @@ class ResultList(list): self.append(mi) def search(title=None, author=None, publisher=None, isbn=None, - verbose=False, max_results=40): + verbose=False, max_results=40, api_key=None): br = browser() start, entries = 1, [] + + if api_key is None: + api_key = CALIBRE_DOUBAN_API_KEY + while start > 0 and len(entries) <= max_results: - new, start = Query(title=title, author=author, publisher=publisher, - isbn=isbn, max_results=max_results, start_index=start)(br, verbose) + new, start = Query(title=title, author=author, publisher=publisher, + isbn=isbn, max_results=max_results, start_index=start, api_key=api_key)(br, verbose) if not new: break entries.extend(new) @@ -216,7 +221,7 @@ def search(title=None, author=None, publisher=None, isbn=None, entries = entries[:max_results] ans = ResultList() - ans.populate(entries, br, verbose) + ans.populate(entries, br, verbose, api_key) return ans def option_parser(): diff --git a/src/calibre/ebooks/metadata/fetch.py b/src/calibre/ebooks/metadata/fetch.py index d12c668e0d..0613f64bfb 100644 --- a/src/calibre/ebooks/metadata/fetch.py +++ b/src/calibre/ebooks/metadata/fetch.py @@ -10,10 +10,11 @@ from calibre import prints from calibre.utils.config import OptionParser from calibre.utils.logging import default_log from calibre.customize import Plugin +from calibre.ebooks.metadata.library_thing import check_for_cover metadata_config = None -class MetadataSource(Plugin): +class MetadataSource(Plugin): # {{{ author = 'Kovid Goyal' @@ -130,7 +131,9 @@ class MetadataSource(Plugin): def customization_help(self): return 'This plugin can only be customized using the GUI' -class GoogleBooks(MetadataSource): + # }}} + +class GoogleBooks(MetadataSource): # {{{ name = 'Google Books' description = _('Downloads metadata from Google Books') @@ -145,8 +148,9 @@ class GoogleBooks(MetadataSource): self.exception = e self.tb = traceback.format_exc() + # }}} -class ISBNDB(MetadataSource): +class ISBNDB(MetadataSource): # {{{ name = 'IsbnDB' description = _('Downloads metadata from isbndb.com') @@ -181,7 +185,9 @@ class ISBNDB(MetadataSource): 'and enter your access key below.') return '

'+ans%('', '') -class Amazon(MetadataSource): + # }}} + +class Amazon(MetadataSource): # {{{ name = 'Amazon' metadata_type = 'social' @@ -198,37 +204,27 @@ class Amazon(MetadataSource): self.exception = e self.tb = traceback.format_exc() -class LibraryThing(MetadataSource): + # }}} + +class LibraryThing(MetadataSource): # {{{ name = 'LibraryThing' metadata_type = 'social' - description = _('Downloads series information from librarything.com') + description = _('Downloads series/tags/rating information from librarything.com') def fetch(self): if not self.isbn: return - from calibre import browser - from calibre.ebooks.metadata import MetaInformation - import json - br = browser() + from calibre.ebooks.metadata.library_thing import get_social_metadata try: - raw = br.open( - 'http://status.calibre-ebook.com/library_thing/metadata/'+self.isbn - ).read() - data = json.loads(raw) - if not data: - return - if 'error' in data: - raise Exception(data['error']) - if 'series' in data and 'series_index' in data: - mi = MetaInformation(self.title, []) - mi.series = data['series'] - mi.series_index = data['series_index'] - self.results = mi + self.results = get_social_metadata(self.title, self.book_author, + self.publisher, self.isbn) except Exception, e: self.exception = e self.tb = traceback.format_exc() + # }}} + def result_index(source, result): if not result.isbn: @@ -268,6 +264,26 @@ class MetadataSources(object): for s in self.sources: s.join() +def filter_metadata_results(item): + keywords = ["audio", "tape", "cassette", "abridged", "playaway"] + for keyword in keywords: + if item.publisher and keyword in item.publisher.lower(): + return False + return True + +def do_cover_check(item): + item.has_cover = False + if item.isbn: + try: + item.has_cover = check_for_cover(item.isbn) + except: + pass # Cover not found + +def check_for_covers(items): + threads = [Thread(target=do_cover_check, args=(item,)) for item in items] + for t in threads: t.start() + for t in threads: t.join() + def search(title=None, author=None, publisher=None, isbn=None, isbndb_key=None, verbose=0): assert not(title is None and author is None and publisher is None and \ @@ -285,10 +301,73 @@ def search(title=None, author=None, publisher=None, isbn=None, isbndb_key=None, for fetcher in fetchers[1:]: merge_results(results, fetcher.results) - results = sorted(results, cmp=lambda x, y : cmp( - (x.comments.strip() if x.comments else ''), - (y.comments.strip() if y.comments else '') - ), reverse=True) + results = list(filter(filter_metadata_results, results)) + + check_for_covers(results) + + words = ("the", "a", "an", "of", "and") + prefix_pat = re.compile(r'^(%s)\s+'%("|".join(words))) + trailing_paren_pat = re.compile(r'\(.*\)$') + whitespace_pat = re.compile(r'\s+') + + def sort_func(x, y): + + def cleanup_title(s): + if s is None: + s = _('Unknown') + s = s.strip().lower() + s = prefix_pat.sub(' ', s) + s = trailing_paren_pat.sub('', s) + s = whitespace_pat.sub(' ', s) + return s.strip() + + t = cleanup_title(title) + x_title = cleanup_title(x.title) + y_title = cleanup_title(y.title) + + # prefer titles that start with the search title + tx = cmp(t, x_title) + ty = cmp(t, y_title) + result = 0 if abs(tx) == abs(ty) else abs(tx) - abs(ty) + + # then prefer titles that have a cover image + if result == 0: + result = -cmp(x.has_cover, y.has_cover) + + # then prefer titles with the longest comment, with in 10% + if result == 0: + cx = len(x.comments.strip() if x.comments else '') + cy = len(y.comments.strip() if y.comments else '') + t = (cx + cy) / 20 + result = cy - cx + if abs(result) < t: + result = 0 + + return result + + results = sorted(results, cmp=sort_func) + + # if for some reason there is no comment in the top selection, go looking for one + if len(results) > 1: + if not results[0].comments or len(results[0].comments) == 0: + for r in results[1:]: + try: + if title and title.lower() == r.title[:len(title)].lower() \ + and r.comments and len(r.comments): + results[0].comments = r.comments + break + except: + pass + # Find a pubdate + pubdate = None + for r in results: + if r.pubdate is not None: + pubdate = r.pubdate + break + if pubdate is not None: + for r in results: + if r.pubdate is None: + r.pubdate = pubdate return results, [(x.name, x.exception, x.tb) for x in fetchers] diff --git a/src/calibre/ebooks/metadata/isbndb.py b/src/calibre/ebooks/metadata/isbndb.py index d9f376c83d..356cc3f1b1 100644 --- a/src/calibre/ebooks/metadata/isbndb.py +++ b/src/calibre/ebooks/metadata/isbndb.py @@ -34,7 +34,8 @@ def fetch_metadata(url, max=100, timeout=5.): errmsg = soup.find('errormessage').string raise ISBNDBError('Error fetching metadata: '+errmsg) total_results = int(book_list['total_results']) - np = '&page_number=%s&'%(page_number+1) + page_number += 1 + np = '&page_number=%s&'%page_number url = re.sub(r'\&page_number=\d+\&', np, url) books.extend(book_list.findAll('bookdata')) max -= 1 diff --git a/src/calibre/ebooks/metadata/library_thing.py b/src/calibre/ebooks/metadata/library_thing.py index d10d80bc61..669d9478a3 100644 --- a/src/calibre/ebooks/metadata/library_thing.py +++ b/src/calibre/ebooks/metadata/library_thing.py @@ -6,13 +6,31 @@ Fetch cover from LibraryThing.com based on ISBN number. import sys, socket, os, re -from calibre import browser as _browser +from lxml import html +import mechanize + +from calibre import browser, prints from calibre.utils.config import OptionParser from calibre.ebooks.BeautifulSoup import BeautifulSoup -browser = None OPENLIBRARY = 'http://covers.openlibrary.org/b/isbn/%s-L.jpg?default=false' +class HeadRequest(mechanize.Request): + + def get_method(self): + return 'HEAD' + +def check_for_cover(isbn, timeout=5.): + br = browser() + br.set_handle_redirect(False) + try: + br.open_novisit(HeadRequest(OPENLIBRARY%isbn), timeout=timeout) + return True + except Exception, e: + if callable(getattr(e, 'getcode', None)) and e.getcode() == 302: + return True + return False + class LibraryThingError(Exception): pass @@ -22,31 +40,28 @@ class ISBNNotFound(LibraryThingError): class ServerBusy(LibraryThingError): pass -def login(username, password, force=True): - global browser - if browser is not None and not force: - return - browser = _browser() - browser.open('http://www.librarything.com') - browser.select_form('signup') - browser['formusername'] = username - browser['formpassword'] = password - browser.submit() +def login(br, username, password, force=True): + br.open('http://www.librarything.com') + br.select_form('signup') + br['formusername'] = username + br['formpassword'] = password + br.submit() def cover_from_isbn(isbn, timeout=5., username=None, password=None): - global browser - if browser is None: - browser = _browser() src = None + br = browser() try: - return browser.open(OPENLIBRARY%isbn, timeout=timeout).read(), 'jpg' + return br.open(OPENLIBRARY%isbn, timeout=timeout).read(), 'jpg' except: pass # Cover not found if username and password: - login(username, password, force=False) + try: + login(br, username, password, force=False) + except: + pass try: - src = browser.open('http://www.librarything.com/isbn/'+isbn, + src = br.open_novisit('http://www.librarything.com/isbn/'+isbn, timeout=timeout).read().decode('utf-8', 'replace') except Exception, err: if isinstance(getattr(err, 'args', [None])[0], socket.timeout): @@ -63,7 +78,7 @@ def cover_from_isbn(isbn, timeout=5., username=None, password=None): if url is None: raise LibraryThingError(_('LibraryThing.com server error. Try again later.')) url = re.sub(r'_S[XY]\d+', '', url['src']) - cover_data = browser.open(url).read() + cover_data = br.open_novisit(url).read() return cover_data, url.rpartition('.')[-1] def option_parser(): @@ -71,7 +86,7 @@ def option_parser(): _(''' %prog [options] ISBN -Fetch a cover image for the book identified by ISBN from LibraryThing.com +Fetch a cover image/social metadata for the book identified by ISBN from LibraryThing.com ''')) parser.add_option('-u', '--username', default=None, help='Username for LibraryThing.com') @@ -79,6 +94,61 @@ Fetch a cover image for the book identified by ISBN from LibraryThing.com help='Password for LibraryThing.com') return parser +def get_social_metadata(title, authors, publisher, isbn, username=None, + password=None): + from calibre.ebooks.metadata import MetaInformation + mi = MetaInformation(title, authors) + if isbn: + br = browser() + if username and password: + try: + login(br, username, password, force=False) + except: + pass + + raw = br.open_novisit('http://www.librarything.com/isbn/' + +isbn).read() + if not raw: + return mi + root = html.fromstring(raw) + h1 = root.xpath('//div[@class="headsummary"]/h1') + if h1 and not mi.title: + mi.title = html.tostring(h1[0], method='text', encoding=unicode) + h2 = root.xpath('//div[@class="headsummary"]/h2/a') + if h2 and not mi.authors: + mi.authors = [html.tostring(x, method='text', encoding=unicode) for + x in h2] + h3 = root.xpath('//div[@class="headsummary"]/h3/a') + if h3: + match = None + for h in h3: + series = html.tostring(h, method='text', encoding=unicode) + match = re.search(r'(.+) \((.+)\)', series) + if match is not None: + break + if match is not None: + mi.series = match.group(1).strip() + match = re.search(r'[0-9.]+', match.group(2)) + si = 1.0 + if match is not None: + si = float(match.group()) + mi.series_index = si + #tags = root.xpath('//div[@class="tags"]/span[@class="tag"]/a') + #if tags: + # mi.tags = [html.tostring(x, method='text', encoding=unicode) for x + # in tags] + span = root.xpath( + '//table[@class="wsltable"]/tr[@class="wslcontent"]/td[4]//span') + if span: + raw = html.tostring(span[0], method='text', encoding=unicode) + match = re.search(r'([0-9.]+)', raw) + if match is not None: + rating = float(match.group()) + if rating > 0 and rating <= 5: + mi.rating = rating + return mi + + def main(args=sys.argv): parser = option_parser() opts, args = parser.parse_args(args) @@ -86,6 +156,8 @@ def main(args=sys.argv): parser.print_help() return 1 isbn = args[1] + mi = get_social_metadata('', [], '', isbn) + prints(mi) cover_data, ext = cover_from_isbn(isbn, username=opts.username, password=opts.password) if not ext: diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index 46924cad1f..36588471f2 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -18,7 +18,7 @@ from calibre.constants import __appname__, __version__, filesystem_encoding from calibre.ebooks.metadata.toc import TOC from calibre.ebooks.metadata import MetaInformation, string_to_authors from calibre.utils.date import parse_date, isoformat - +from calibre.utils.localization import get_lang class Resource(object): ''' @@ -1069,7 +1069,10 @@ class OPFCreator(MetaInformation): dc_attrs={'id':__appname__+'_id'})) if getattr(self, 'pubdate', None) is not None: a(DC_ELEM('date', self.pubdate.isoformat())) - a(DC_ELEM('language', self.language if self.language else 'UND')) + lang = self.language + if not lang or lang.lower() == 'und': + lang = get_lang().replace('_', '-') + a(DC_ELEM('language', lang)) if self.comments: a(DC_ELEM('description', self.comments)) if self.publisher: @@ -1184,7 +1187,6 @@ def metadata_to_opf(mi, as_string=True): factory(DC('contributor'), mi.book_producer, __appname__, 'bkp') if hasattr(mi.pubdate, 'isoformat'): factory(DC('date'), isoformat(mi.pubdate)) - factory(DC('language'), mi.language) if mi.category: factory(DC('type'), mi.category) if mi.comments: @@ -1195,6 +1197,8 @@ def metadata_to_opf(mi, as_string=True): factory(DC('identifier'), mi.isbn, scheme='ISBN') if mi.rights: factory(DC('rights'), mi.rights) + factory(DC('language'), mi.language if mi.language and mi.language.lower() + != 'und' else get_lang().replace('_', '-')) if mi.tags: for tag in mi.tags: factory(DC('subject'), tag) diff --git a/src/calibre/ebooks/metadata/pdf.py b/src/calibre/ebooks/metadata/pdf.py index b4bc6f962f..2d1935539e 100644 --- a/src/calibre/ebooks/metadata/pdf.py +++ b/src/calibre/ebooks/metadata/pdf.py @@ -8,7 +8,7 @@ from functools import partial from calibre import prints from calibre.constants import plugins -from calibre.ebooks.metadata import MetaInformation, string_to_authors, authors_to_string +from calibre.ebooks.metadata import MetaInformation, string_to_authors pdfreflow, pdfreflow_error = plugins['pdfreflow'] @@ -56,66 +56,10 @@ def get_metadata(stream, cover=True): get_quick_metadata = partial(get_metadata, cover=False) -import cStringIO -from threading import Thread - -from calibre.utils.pdftk import set_metadata as pdftk_set_metadata -from calibre.utils.podofo import set_metadata as podofo_set_metadata, Unavailable +from calibre.utils.podofo import set_metadata as podofo_set_metadata def set_metadata(stream, mi): stream.seek(0) - try: - return podofo_set_metadata(stream, mi) - except Unavailable: - pass - try: - return pdftk_set_metadata(stream, mi) - except: - pass - set_metadata_pypdf(stream, mi) - - -class MetadataWriter(Thread): - - def __init__(self, out_pdf, buf): - self.out_pdf = out_pdf - self.buf = buf - Thread.__init__(self) - self.daemon = True - - def run(self): - try: - self.out_pdf.write(self.buf) - except RuntimeError: - pass - -def set_metadata_pypdf(stream, mi): - # Use a StringIO object for the pdf because we will want to over - # write it later and if we are working on the stream directly it - # could cause some issues. - - from pyPdf import PdfFileReader, PdfFileWriter - raw = cStringIO.StringIO(stream.read()) - orig_pdf = PdfFileReader(raw) - title = mi.title if mi.title else orig_pdf.documentInfo.title - author = authors_to_string(mi.authors) if mi.authors else orig_pdf.documentInfo.author - out_pdf = PdfFileWriter(title=title, author=author) - out_str = cStringIO.StringIO() - writer = MetadataWriter(out_pdf, out_str) - for page in orig_pdf.pages: - out_pdf.addPage(page) - writer.start() - writer.join(10) # Wait 10 secs for writing to complete - out_pdf.killed = True - writer.join() - if out_pdf.killed: - print 'Failed to set metadata: took too long' - return - - stream.seek(0) - stream.truncate() - out_str.seek(0) - stream.write(out_str.read()) - stream.seek(0) + return podofo_set_metadata(stream, mi) diff --git a/src/calibre/ebooks/mobi/mobiml.py b/src/calibre/ebooks/mobi/mobiml.py index bfa8758c85..231ad51eee 100644 --- a/src/calibre/ebooks/mobi/mobiml.py +++ b/src/calibre/ebooks/mobi/mobiml.py @@ -58,6 +58,7 @@ class FormatState(object): self.fsize = 3 self.ids = set() self.valign = 'baseline' + self.nest = False self.italic = False self.bold = False self.strikethrough = False @@ -233,9 +234,17 @@ class MobiMLizer(object): inline = etree.SubElement(inline, XHTML('a'), href=href) bstate.anchor = inline if valign == 'super': - inline = etree.SubElement(inline, XHTML('sup')) + parent = inline + if istate.nest and bstate.inline is not None: + parent = bstate.inline + istate.nest = False + inline = etree.SubElement(parent, XHTML('sup')) elif valign == 'sub': - inline = etree.SubElement(inline, XHTML('sub')) + parent = inline + if istate.nest and bstate.inline is not None: + parent = bstate.inline + istate.nest = False + inline = etree.SubElement(parent, XHTML('sub')) elif fsize != 3: inline = etree.SubElement(inline, XHTML('font'), size=str(fsize)) @@ -343,8 +352,10 @@ class MobiMLizer(object): istate.family = 'serif' valign = style['vertical-align'] if valign in ('super', 'text-top') or asfloat(valign) > 0: + istate.nest = istate.valign in ('sub', 'super') istate.valign = 'super' elif valign == 'sub' or asfloat(valign) < 0: + istate.nest = istate.valign in ('sub', 'super') istate.valign = 'sub' else: istate.valign = 'baseline' diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py index 76e2cef3bb..b5f61db3ac 100644 --- a/src/calibre/ebooks/oeb/base.py +++ b/src/calibre/ebooks/oeb/base.py @@ -17,6 +17,7 @@ from urlparse import urljoin from lxml import etree, html from cssutils import CSSParser +from cssutils.css import CSSRule import calibre from calibre.constants import filesystem_encoding @@ -25,6 +26,8 @@ from calibre.ebooks.chardet import xml_to_unicode from calibre.ebooks.oeb.entitydefs import ENTITYDEFS from calibre.ebooks.conversion.preprocess import CSSPreProcessor +RECOVER_PARSER = etree.XMLParser(recover=True, no_network=True) + XML_NS = 'http://www.w3.org/XML/1998/namespace' XHTML_NS = 'http://www.w3.org/1999/xhtml' OEB_DOC_NS = 'http://openebook.org/namespaces/oeb-document/1.0/' @@ -232,8 +235,6 @@ PREFIXNAME_RE = re.compile(r'^[^:]+[:][^:]+') XMLDECL_RE = re.compile(r'^\s*<[?]xml.*?[?]>') CSSURL_RE = re.compile(r'''url[(](?P["']?)(?P[^)]+)(?P=q)[)]''') -RECOVER_PARSER = etree.XMLParser(recover=True) - def element(parent, *args, **kwargs): if parent is not None: @@ -762,6 +763,7 @@ class Manifest(object): self.href = self.path = urlnormalize(href) self.media_type = media_type self.fallback = fallback + self.override_css_fetch = None self.spine_position = None self.linear = True if loader is None and data is None: @@ -778,8 +780,7 @@ class Manifest(object): assume_utf8=True, resolve_entities=True)[0] if not data: return None - parser = etree.XMLParser(recover=True) - return etree.fromstring(data, parser=parser) + return etree.fromstring(data, parser=RECOVER_PARSER) def _parse_xhtml(self, data): self.oeb.log.debug('Parsing', self.href, '...') @@ -807,16 +808,18 @@ class Manifest(object): pat = re.compile(r'&(%s);'%('|'.join(user_entities.keys()))) data = pat.sub(lambda m:user_entities[m.group(1)], data) + # Setting huge_tree=True causes crashes in windows with large files + parser = etree.XMLParser(no_network=True) # Try with more & more drastic measures to parse def first_pass(data): try: - data = etree.fromstring(data) + data = etree.fromstring(data, parser=parser) except etree.XMLSyntaxError, err: self.oeb.log.exception('Initial parse failed:') repl = lambda m: ENTITYDEFS.get(m.group(1), m.group(0)) data = ENTITY_RE.sub(repl, data) try: - data = etree.fromstring(data) + data = etree.fromstring(data, parser=parser) except etree.XMLSyntaxError, err: self.oeb.logger.warn('Parsing file %r as HTML' % self.href) if err.args and err.args[0].startswith('Excessive depth'): @@ -830,7 +833,7 @@ class Manifest(object): elem.text = elem.text.strip('-') data = etree.tostring(data, encoding=unicode) try: - data = etree.fromstring(data) + data = etree.fromstring(data, parser=parser) except etree.XMLSyntaxError: data = etree.fromstring(data, parser=RECOVER_PARSER) return data @@ -842,7 +845,7 @@ class Manifest(object): nroot = etree.fromstring('') has_body = False for child in list(data): - if barename(child.tag) == 'body': + if isinstance(child.tag, (unicode, str)) and barename(child.tag) == 'body': has_body = True break parent = nroot @@ -864,12 +867,12 @@ class Manifest(object): data = etree.tostring(data, encoding=unicode) try: - data = etree.fromstring(data) + data = etree.fromstring(data, parser=parser) except: data = data.replace(':=', '=').replace(':>', '>') data = data.replace('', '') try: - data = etree.fromstring(data) + data = etree.fromstring(data, parser=parser) except etree.XMLSyntaxError: self.oeb.logger.warn('Stripping comments and meta tags from %s'% self.href) @@ -880,7 +883,7 @@ class Manifest(object): "", '') data = data.replace("", '') - data = etree.fromstring(data) + data = etree.fromstring(data, parser=RECOVER_PARSER) elif namespace(data.tag) != XHTML_NS: # OEB_DOC_NS, but possibly others ns = namespace(data.tag) @@ -982,15 +985,40 @@ class Manifest(object): def _parse_css(self, data): + + def get_style_rules_from_import(import_rule): + ans = [] + if not import_rule.styleSheet: + return ans + rules = import_rule.styleSheet.cssRules + for rule in rules: + if rule.type == CSSRule.IMPORT_RULE: + ans.extend(get_style_rules_from_import(rule)) + elif rule.type in (CSSRule.FONT_FACE_RULE, + CSSRule.STYLE_RULE): + ans.append(rule) + return ans + self.oeb.log.debug('Parsing', self.href, '...') data = self.oeb.decode(data) - data = self.oeb.css_preprocessor(data) - data = XHTML_CSS_NAMESPACE + data + data = self.oeb.css_preprocessor(data, add_namespace=True) parser = CSSParser(loglevel=logging.WARNING, - fetcher=self._fetch_css, + fetcher=self.override_css_fetch or self._fetch_css, log=_css_logger) data = parser.parseString(data, href=self.href) data.namespaces['h'] = XHTML_NS + import_rules = list(data.cssRules.rulesOfType(CSSRule.IMPORT_RULE)) + rules_to_append = [] + insert_index = None + for r in data.cssRules.rulesOfType(CSSRule.STYLE_RULE): + insert_index = data.cssRules.index(r) + break + for rule in import_rules: + rules_to_append.extend(get_style_rules_from_import(rule)) + for r in reversed(rules_to_append): + data.insertRule(r, index=insert_index) + for rule in import_rules: + data.deleteRule(rule) return data def _fetch_css(self, path): diff --git a/src/calibre/ebooks/oeb/iterator.py b/src/calibre/ebooks/oeb/iterator.py index 3fdd6aaf99..7f56cb4d2d 100644 --- a/src/calibre/ebooks/oeb/iterator.py +++ b/src/calibre/ebooks/oeb/iterator.py @@ -139,11 +139,18 @@ class EbookIterator(object): if id != -1: families = [unicode(f) for f in QFontDatabase.applicationFontFamilies(id)] if family: - family = family.group(1).strip().replace('"', '') - bad_map[family] = families[0] - if family not in families: + family = family.group(1) + specified_families = [x.strip().replace('"', + '').replace("'", '') for x in family.split(',')] + aliasing_ok = False + for f in specified_families: + bad_map[f] = families[0] + if not aliasing_ok and f in families: + aliasing_ok = True + + if not aliasing_ok: prints('WARNING: Family aliasing not fully supported.') - prints('\tDeclared family: %s not in actual families: %s' + prints('\tDeclared family: %r not in actual families: %r' % (family, families)) else: prints('Loaded embedded font:', repr(family)) diff --git a/src/calibre/ebooks/oeb/reader.py b/src/calibre/ebooks/oeb/reader.py index ebe6e78d08..d7d7bbf725 100644 --- a/src/calibre/ebooks/oeb/reader.py +++ b/src/calibre/ebooks/oeb/reader.py @@ -131,7 +131,7 @@ class OEBReader(object): stream = cStringIO.StringIO(etree.tostring(opf)) mi = MetaInformation(OPF(stream)) if not mi.language: - mi.language = get_lang() + mi.language = get_lang().replace('_', '-') self.oeb.metadata.add('language', mi.language) if not mi.title: mi.title = self.oeb.translate(__('Unknown')) diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py index 0637dddfb6..4789899fbf 100644 --- a/src/calibre/ebooks/oeb/stylizer.py +++ b/src/calibre/ebooks/oeb/stylizer.py @@ -25,10 +25,17 @@ from calibre.ebooks.oeb.base import XHTML, XHTML_NS, CSS_MIME, OEB_STYLES from calibre.ebooks.oeb.base import XPNSMAP, xpath, urlnormalize from calibre.ebooks.oeb.profile import PROFILES -html_css = open(P('templates/html.css'), 'rb').read() +_html_css_stylesheet = None + +def html_css_stylesheet(): + global _html_css_stylesheet + if _html_css_stylesheet is None: + html_css = open(P('templates/html.css'), 'rb').read() + _html_css_stylesheet = cssutils.parseString(html_css) + _html_css_stylesheet.namespaces['h'] = XHTML_NS + return _html_css_stylesheet + XHTML_CSS_NAMESPACE = '@namespace "%s";\n' % XHTML_NS -HTML_CSS_STYLESHEET = cssutils.parseString(html_css) -HTML_CSS_STYLESHEET.namespaces['h'] = XHTML_NS INHERITED = set(['azimuth', 'border-collapse', 'border-spacing', 'caption-side', 'color', 'cursor', 'direction', 'elevation', @@ -120,12 +127,19 @@ class Stylizer(object): item = oeb.manifest.hrefs[path] basename = os.path.basename(path) cssname = os.path.splitext(basename)[0] + '.css' - stylesheets = [HTML_CSS_STYLESHEET] + stylesheets = [html_css_stylesheet()] head = xpath(tree, '/h:html/h:head') if head: head = head[0] else: head = [] + + # Add cssutils parsing profiles from output_profile + for profile in self.opts.output_profile.extra_css_modules: + cssutils.profile.addProfile(profile['name'], + profile['props'], + profile['macros']) + parser = cssutils.CSSParser(fetcher=self._fetch_css_file, log=logging.getLogger('calibre.css')) self.font_face_rules = [] diff --git a/src/calibre/ebooks/pdf/writer.py b/src/calibre/ebooks/pdf/writer.py index ff624f6831..03519a2cbb 100644 --- a/src/calibre/ebooks/pdf/writer.py +++ b/src/calibre/ebooks/pdf/writer.py @@ -154,20 +154,24 @@ class PDFWriter(QObject): # {{{ self.view.load(QUrl.fromLocalFile(item)) - def get_printer(self): + def get_printer(self, set_horz_margins=False): printer = get_pdf_printer() printer.setPaperSize(QSizeF(self.size[0] * 10, self.size[1] * 10), QPrinter.Millimeter) - printer.setPageMargins(0, 0, 0, 0, QPrinter.Point) + if set_horz_margins: + printer.setPageMargins(0., self.opts.margin_top, 0., + self.opts.margin_bottom, QPrinter.Point) + else: + printer.setPageMargins(0, 0, 0, 0, QPrinter.Point) printer.setOrientation(orientation(self.opts.orientation)) printer.setOutputFormat(QPrinter.PdfFormat) - printer.setFullPage(True) + printer.setFullPage(not set_horz_margins) return printer def _render_html(self, ok): if ok: item_path = os.path.join(self.tmp_path, '%i.pdf' % len(self.combine_queue)) self.logger.debug('\tRendering item %s as %i' % (os.path.basename(str(self.view.url().toLocalFile())), len(self.combine_queue))) - printer = self.get_printer() + printer = self.get_printer(set_horz_margins=True) printer.setOutputFileName(item_path) self.view.print_(printer) self._render_book() diff --git a/src/calibre/ebooks/txt/input.py b/src/calibre/ebooks/txt/input.py index a0570c07ae..b444bf1cf4 100644 --- a/src/calibre/ebooks/txt/input.py +++ b/src/calibre/ebooks/txt/input.py @@ -10,6 +10,7 @@ from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation from calibre.ebooks.txt.processor import convert_basic, convert_markdown, \ separate_paragraphs_single_line, separate_paragraphs_print_formatted, \ preserve_spaces +from calibre import _ent_pat, xml_entity_to_unicode class TXTInput(InputFormatPlugin): @@ -55,6 +56,8 @@ class TXTInput(InputFormatPlugin): if options.preserve_spaces: txt = preserve_spaces(txt) + txt = _ent_pat.sub(xml_entity_to_unicode, txt) + if options.markdown: log.debug('Running text though markdown conversion...') try: @@ -63,7 +66,8 @@ class TXTInput(InputFormatPlugin): raise ValueError('This txt file has malformed markup, it cannot be' ' converted by calibre. See http://daringfireball.net/projects/markdown/syntax') else: - html = convert_basic(txt) + flow_size = getattr(options, 'flow_size', 0) + html = convert_basic(txt, epub_split_size_kb=flow_size) from calibre.customize.ui import plugin_for_input_format html_input = plugin_for_input_format('html') diff --git a/src/calibre/ebooks/txt/processor.py b/src/calibre/ebooks/txt/processor.py index baebf2f298..c53d630ed6 100644 --- a/src/calibre/ebooks/txt/processor.py +++ b/src/calibre/ebooks/txt/processor.py @@ -17,14 +17,11 @@ __docformat__ = 'restructuredtext en' HTML_TEMPLATE = u'%s\n%s\n' -def convert_basic(txt, title=''): - lines = [] +def convert_basic(txt, title='', epub_split_size_kb=0): # Strip whitespace from the beginning and end of the line. Also replace # all line breaks with \n. - for line in txt.splitlines(): - lines.append(line.strip()) - txt = '\n'.join(lines) - + txt = '\n'.join([line.strip() for line in txt.splitlines()]) + # Condense redundant spaces txt = re.sub('[ ]{2,}', ' ', txt) @@ -34,6 +31,15 @@ def convert_basic(txt, title=''): # Remove excessive line breaks. txt = re.sub('\n{3,}', '\n\n', txt) + #Takes care if there is no point to split + if epub_split_size_kb > 0: + length_byte = len(txt.encode('utf-8')) + #Calculating the average chunk value for easy splitting as EPUB (+2 as a safe margin) + chunk_size = long(length_byte / (int(length_byte / (epub_split_size_kb * 1024) ) + 2 )) + #if there are chunks with a superior size then go and break + if (len(filter(lambda x: len(x.encode('utf-8')) > chunk_size, txt.split('\n\n')))) : + txt = u'\n\n'.join([split_string_separator(line, chunk_size) for line in txt.split('\n\n')]) + lines = [] # Split into paragraphs based on having a blank line between text. for line in txt.split('\n\n'): @@ -71,3 +77,10 @@ def opf_writer(path, opf_name, manifest, spine, mi): with open(os.path.join(path, opf_name), 'wb') as opffile: opf.render(opffile) +def split_string_separator(txt, size) : + if len(txt.encode('utf-8')) > size: + txt = u''.join([re.sub(u'\.(?P[^.]*)$', u'.\n\n\g', + txt[i:i+size], 1) for i in + xrange(0, len(txt.encode('utf-8')), size)]) + return txt + diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 1056f6ced6..d922af0914 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -1,18 +1,18 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' """ The GUI """ -import os +import os, sys from threading import RLock -from PyQt4.QtCore import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, Qt, QSize, \ +from PyQt4.Qt import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, Qt, QSize, \ QByteArray, QTranslator, QCoreApplication, QThread, \ - QEvent, QTimer, pyqtSignal, QDate -from PyQt4.QtGui import QFileDialog, QMessageBox, QPixmap, QFileIconProvider, \ - QIcon, QApplication, QDialog, QPushButton + QEvent, QTimer, pyqtSignal, QDate, QDesktopServices, \ + QFileDialog, QMessageBox, QPixmap, QFileIconProvider, \ + QIcon, QApplication, QDialog, QPushButton, QUrl ORG_NAME = 'KovidsBrain' APP_UID = 'libprs500' -from calibre import islinux, iswindows, isosx, isfreebsd +from calibre.constants import islinux, iswindows, isosx, isfreebsd, isfrozen from calibre.utils.config import Config, ConfigProxy, dynamic, JSONConfig from calibre.utils.localization import set_qt_translator from calibre.ebooks.metadata.meta import get_metadata, metadata_from_formats @@ -103,6 +103,8 @@ def _config(): help=_('The layout of the user interface'), default='wide') c.add_opt('show_avg_rating', default=True, help=_('Show the average rating per item indication in the tag browser')) + c.add_opt('disable_animations', default=False, + help=_('Disable UI animations')) return ConfigProxy(c) config = _config() @@ -224,10 +226,11 @@ def error_dialog(parent, title, msg, det_msg='', show=False, return d.exec_() return d -def question_dialog(parent, title, msg, det_msg='', show_copy_button=True): - d = MessageBox(QMessageBox.Question, title, msg, QMessageBox.Yes|QMessageBox.No, +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_information.svg'))) + d.setIconPixmap(QPixmap(I('dialog_question.svg'))) d.setEscapeButton(QMessageBox.No) if not show_copy_button: d.cb.setVisible(False) @@ -246,7 +249,7 @@ def info_dialog(parent, title, msg, det_msg='', show=False): class Dispatcher(QObject): '''Convenience class to ensure that a function call always happens in the - thread the reciver was created in.''' + thread the receiver was created in.''' dispatch_signal = pyqtSignal(object, object) def __init__(self, func): @@ -505,7 +508,7 @@ def pixmap_to_data(pixmap, format='JPEG'): buf = QBuffer(ba) buf.open(QBuffer.WriteOnly) pixmap.save(buf, format) - return str(ba.data()) + return bytes(ba.data()) class ResizableDialog(QDialog): @@ -577,6 +580,25 @@ class Application(QApplication): _store_app = None +def open_url(qurl): + paths = os.environ.get('LD_LIBRARY_PATH', + '').split(os.pathsep) + paths = [x for x in paths if x] + if isfrozen and islinux and paths: + npaths = [x for x in paths if x != sys.frozen_path] + os.environ['LD_LIBRARY_PATH'] = os.pathsep.join(npaths) + QDesktopServices.openUrl(qurl) + if isfrozen and islinux and paths: + os.environ['LD_LIBRARY_PATH'] = os.pathsep.join(paths) + + +def open_local_file(path): + if iswindows: + os.startfile(os.path.normpath(path)) + else: + url = QUrl.fromLocalFile(path) + open_url(url) + def is_ok_to_use_qt(): global gui_thread, _store_app if (islinux or isfreebsd) and ':' not in os.environ.get('DISPLAY', ''): diff --git a/src/calibre/gui2/actions.py b/src/calibre/gui2/actions.py index 32552dde71..9522083b98 100644 --- a/src/calibre/gui2/actions.py +++ b/src/calibre/gui2/actions.py @@ -5,26 +5,28 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import shutil, os, datetime, sys, time +import shutil, os, datetime, time from functools import partial from PyQt4.Qt import QInputDialog, pyqtSignal, QModelIndex, QThread, Qt, \ - SIGNAL, QPixmap, QTimer, QDesktopServices, QUrl, QDialog + SIGNAL, QPixmap, QTimer, QDialog from calibre import strftime from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config import prefs, dynamic from calibre.gui2 import error_dialog, Dispatcher, gprefs, choose_files, \ - choose_dir, warning_dialog, info_dialog, question_dialog, config + choose_dir, warning_dialog, info_dialog, question_dialog, config, \ + open_local_file from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag, NavigableString from calibre.utils.filenames import ascii_filename from calibre.gui2.widgets import IMAGE_EXTENSIONS from calibre.gui2.dialogs.metadata_single import MetadataSingleDialog from calibre.gui2.dialogs.metadata_bulk import MetadataBulkDialog +from calibre.gui2.dialogs.tag_list_editor import TagListEditor from calibre.gui2.tools import convert_single_ebook, convert_bulk_ebook, \ fetch_scheduled_recipe, generate_catalog from calibre.constants import preferred_encoding, filesystem_encoding, \ - isosx, isfrozen, islinux + isosx from calibre.gui2.dialogs.choose_format import ChooseFormatDialog from calibre.ebooks import BOOK_EXTENSIONS from calibre.gui2.dialogs.confirm_delete import confirm @@ -176,7 +178,8 @@ class AnnotationsAction(object): # {{{ def mark_book_as_read(self,id): read_tag = gprefs.get('catalog_epub_mobi_read_tag') - self.db.set_tags(id, [read_tag], append=True) + if read_tag: + self.db.set_tags(id, [read_tag], append=True) def canceled(self): self.pd.hide() @@ -320,7 +323,6 @@ class AddAction(object): # {{{ accept = True if accept: event.accept() - self.cover_cache.refresh([cid]) self.library_view.model().current_changed(current_idx, current_idx) def __add_filesystem_book(self, paths, allow_device=True): @@ -411,6 +413,34 @@ class AddAction(object): # {{{ if hasattr(self._adder, 'cleanup'): self._adder.cleanup() self._adder = None + + def _add_from_device_adder(self, paths=[], names=[], infos=[], + on_card=None, model=None): + self._files_added(paths, names, infos, on_card=on_card) + # set the in-library flags, and as a consequence send the library's + # metadata for this book to the device. This sets the uuid to the + # correct value. + self.set_books_in_library(booklists=[model.db], reset=True) + model.reset() + + def add_books_from_device(self, view): + rows = view.selectionModel().selectedRows() + if not rows or len(rows) == 0: + d = error_dialog(self, _('Add to library'), _('No book selected')) + d.exec_() + return + paths = [p for p in view._model.paths(rows) if p is not None] + if not paths or len(paths) == 0: + d = error_dialog(self, _('Add to library'), _('No book files found')) + d.exec_() + return + from calibre.gui2.add import Adder + self.__adder_func = partial(self._add_from_device_adder, on_card=None, + model=view._model) + self._adder = Adder(self, self.library_view.model().db, + Dispatcher(self.__adder_func), spare_server=self.spare_server) + self._adder.add(paths) + # }}} class DeleteAction(object): # {{{ @@ -615,6 +645,8 @@ class EditMetadataAction(object): # {{{ if x.exception is None: self.library_view.model().refresh_ids( x.updated, cr) + if self.cover_flow: + self.cover_flow.dataChanged() if x.failures: details = ['%s: %s'%(title, reason) for title, reason in x.failures.values()] @@ -659,7 +691,6 @@ class EditMetadataAction(object): # {{{ if rows: current = self.library_view.currentIndex() m = self.library_view.model() - m.refresh_cover_cache(map(m.id, rows)) if self.cover_flow: self.cover_flow.dataChanged() m.current_changed(current, previous) @@ -681,6 +712,8 @@ class EditMetadataAction(object): # {{{ self.library_view.model().resort(reset=False) self.library_view.model().research() self.tags_view.recount() + if self.cover_flow: + self.cover_flow.dataChanged() # Merge books {{{ def merge_books(self, safe_merge=False): @@ -802,6 +835,23 @@ class EditMetadataAction(object): # {{{ db.set_metadata(dest_id, dest_mi, ignore_errors=False) # }}} + def edit_device_collections(self, view, oncard=None): + model = view.model() + result = model.get_collections_with_ids() + compare = (lambda x,y:cmp(x.lower(), y.lower())) + d = TagListEditor(self, tag_to_match=None, data=result, compare=compare) + d.exec_() + if d.result() == d.Accepted: + to_rename = d.to_rename # dict of new text to old ids + to_delete = d.to_delete # list of ids + for text in to_rename: + for old_id in to_rename[text]: + model.rename_collection(old_id, new_name=unicode(text)) + for item in to_delete: + model.delete_collection_using_id(item) + self.upload_collections(model.db, view=view, oncard=oncard) + view.reset() + # }}} class SaveToDiskAction(object): # {{{ @@ -870,7 +920,7 @@ class SaveToDiskAction(object): # {{{ _('Could not save some books') + ', ' + _('Click the show details button to see which ones.'), u'\n\n'.join(failures), show=True) - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + open_local_file(path) def books_saved(self, job): if job.failed: @@ -1136,15 +1186,7 @@ class ViewAction(object): # {{{ self.job_manager.launch_gui_app(viewer, kwargs=dict(args=args)) else: - paths = os.environ.get('LD_LIBRARY_PATH', - '').split(os.pathsep) - paths = [x for x in paths if x] - if isfrozen and islinux and paths: - npaths = [x for x in paths if x != sys.frozen_path] - os.environ['LD_LIBRARY_PATH'] = os.pathsep.join(npaths) - QDesktopServices.openUrl(QUrl.fromLocalFile(name))#launch(name) - if isfrozen and islinux and paths: - os.environ['LD_LIBRARY_PATH'] = os.pathsep.join(paths) + open_local_file(name) time.sleep(2) # User feedback finally: self.unsetCursor() @@ -1190,11 +1232,11 @@ class ViewAction(object): # {{{ return for row in rows: path = self.library_view.model().db.abspath(row.row()) - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + open_local_file(path) def view_folder_for_id(self, id_): path = self.library_view.model().db.abspath(id_, index_is_id=True) - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + open_local_file(path) def view_book(self, triggered): rows = self.current_view().selectionModel().selectedRows() diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index 64743e914b..74f5a2148e 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -15,7 +15,7 @@ from calibre.ebooks.metadata import MetaInformation from calibre.constants import preferred_encoding, filesystem_encoding from calibre.utils.config import prefs -class DuplicatesAdder(QThread): +class DuplicatesAdder(QThread): # {{{ # Add duplicate books def __init__(self, parent, db, duplicates, db_adder): QThread.__init__(self, parent) @@ -34,9 +34,9 @@ class DuplicatesAdder(QThread): self.emit(SIGNAL('added(PyQt_PyObject)'), count) count += 1 self.emit(SIGNAL('adding_done()')) +# }}} - -class RecursiveFind(QThread): +class RecursiveFind(QThread): # {{{ def __init__(self, parent, db, root, single): QThread.__init__(self, parent) @@ -79,7 +79,9 @@ class RecursiveFind(QThread): if not self.canceled: self.emit(SIGNAL('found(PyQt_PyObject)'), self.books) -class DBAdder(Thread): +# }}} + +class DBAdder(Thread): # {{{ def __init__(self, db, ids, nmap): self.db, self.ids, self.nmap = db, dict(**ids), dict(**nmap) @@ -219,8 +221,9 @@ class DBAdder(Thread): self.db.add_format(id, fmt, f, index_is_id=True, notify=False, replace=replace) +# }}} -class Adder(QObject): +class Adder(QObject): # {{{ ADD_TIMEOUT = 600 # seconds @@ -410,6 +413,7 @@ class Adder(QObject): return getattr(getattr(self, 'db_adder', None), 'infos', []) +# }}} ############################################################################### ############################## END ADDER ###################################### diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 8759dd360b..f08dd09429 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -9,13 +9,14 @@ import os, collections from PyQt4.Qt import QLabel, QPixmap, QSize, QWidget, Qt, pyqtSignal, \ QVBoxLayout, QScrollArea, QPropertyAnimation, QEasingCurve, \ - QSizePolicy, QPainter, QRect, pyqtProperty, QDesktopServices, QUrl + QSizePolicy, QPainter, QRect, pyqtProperty from calibre import fit_image, prepare_string_for_xml from calibre.gui2.widgets import IMAGE_EXTENSIONS from calibre.ebooks import BOOK_EXTENSIONS from calibre.constants import preferred_encoding from calibre.library.comments import comments_to_html +from calibre.gui2 import config, open_local_file # render_rows(data) {{{ WEIGHTS = collections.defaultdict(lambda : 100) @@ -93,10 +94,16 @@ class CoverView(QWidget): # {{{ self._current_pixmap_size = val def do_layout(self): + if self.rect().width() == 0 or self.rect().height() == 0: + return pixmap = self.pixmap pwidth, pheight = pixmap.width(), pixmap.height() - self.pwidth, self.pheight = fit_image(pwidth, pheight, + try: + self.pwidth, self.pheight = fit_image(pwidth, pheight, self.rect().width(), self.rect().height())[1:] + except: + self.pwidth, self.pheight = self.rect().width()-1, \ + self.rect().height()-1 self.current_pixmap_size = QSize(self.pwidth, self.pheight) self.animation.setEndValue(self.current_pixmap_size) @@ -120,13 +127,14 @@ class CoverView(QWidget): # {{{ self.data = {'id':data.get('id', None)} if data.has_key('cover'): self.pixmap = QPixmap.fromImage(data.pop('cover')) - if self.pixmap.isNull(): + if self.pixmap.isNull() or self.pixmap.width() < 5 or \ + self.pixmap.height() < 5: self.pixmap = self.default_pixmap else: self.pixmap = self.default_pixmap self.do_layout() self.update() - if not same_item: + if not same_item and not config['disable_animations']: self.animation.start() def paintEvent(self, event): @@ -165,6 +173,7 @@ class Label(QLabel): self.setTextFormat(Qt.RichText) self.setText('') self.setWordWrap(True) + self.setAlignment(Qt.AlignTop) self.linkActivated.connect(self.link_activated) self._link_clicked = False self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) @@ -197,15 +206,15 @@ class BookInfo(QScrollArea): rows = render_rows(data) rows = u'\n'.join([u'%s:%s'%(k,t) for k, t in rows]) + comments = '' + if data.get(_('Comments'), '') not in ('', u'None'): + comments = data[_('Comments')] + comments = comments_to_html(comments) if self.vertical: - if _('Comments') in data and data[_('Comments')]: - comments = comments_to_html(data[_('Comments')]) + if comments: rows += u'%s'%comments self.label.setText(u'%s
'%rows) else: - comments = '' - if _('Comments') in data: - comments = comments_to_html(data[_('Comments')]) left_pane = u'%s
'%rows right_pane = u'

%s
'%comments self.label.setText(u''%(key, txt) self.text.setText(u'
%s'%prepare_string_for_xml( + '\n'.join(w.wrap(help))) + g.setToolTip(htext) + g.setWhatsThis(htext) g.__class__.enterEvent = lambda obj, event: self.set_help(getattr(obj, '_help', obj.toolTip())) diff --git a/src/calibre/gui2/convert/metadata.py b/src/calibre/gui2/convert/metadata.py index 3ddd5674bb..cb5b99c525 100644 --- a/src/calibre/gui2/convert/metadata.py +++ b/src/calibre/gui2/convert/metadata.py @@ -87,6 +87,9 @@ class MetadataWidget(Widget, Ui_Form): if not pm.isNull(): self.cover.setPixmap(pm) self.cover_data = cover + else: + self.cover.setPixmap(QPixmap(I('default_cover.svg'))) + def initialize_combos(self): self.initalize_authors() diff --git a/src/calibre/gui2/convert/metadata.ui b/src/calibre/gui2/convert/metadata.ui index 5d3cc432d7..ec5a913f18 100644 --- a/src/calibre/gui2/convert/metadata.ui +++ b/src/calibre/gui2/convert/metadata.ui @@ -20,36 +20,6 @@ Book Cover - - - - - - - - - :/images/book.svg - - - true - - - Qt::AlignCenter - - - - - - - - - Use cover from &source file - - - true - - - @@ -101,6 +71,30 @@ + + + + Use cover from &source file + + + true + + + + + + + + + + 0 + 0 + + + + + + opt_prefer_metadata_cover @@ -308,11 +302,6 @@ - - ImageView - QLabel -
widgets.h
-
EnLineEdit QLineEdit @@ -328,6 +317,12 @@ QLineEdit
widgets.h
+ + ImageView + QWidget +
calibre/gui2/widgets.h
+ 1 +
title diff --git a/src/calibre/gui2/convert/txt_input.ui b/src/calibre/gui2/convert/txt_input.ui index 5a9527ebc5..186783c277 100644 --- a/src/calibre/gui2/convert/txt_input.ui +++ b/src/calibre/gui2/convert/txt_input.ui @@ -43,6 +43,9 @@ true + + true + diff --git a/src/calibre/gui2/cover_flow.py b/src/calibre/gui2/cover_flow.py index 6a9709cd8b..c72f53201f 100644 --- a/src/calibre/gui2/cover_flow.py +++ b/src/calibre/gui2/cover_flow.py @@ -67,6 +67,13 @@ if pictureflow is not None: ans = '' return ans + def subtitle(self, index): + try: + return u'\u2605'*self.model.rating(index) + except: + pass + return '' + def reset(self): self.dataChanged.emit() @@ -115,6 +122,7 @@ class CoverFlowMixin(object): self.sync_cf_to_listview) self.db_images = DatabaseImages(self.library_view.model()) self.cover_flow.setImages(self.db_images) + self.cover_flow.itemActivated.connect(self.view_specific_book) else: self.cover_flow = QLabel('

'+_('Cover browser could not be loaded') +'
'+pictureflowerror) @@ -205,8 +213,8 @@ class CoverFlowMixin(object): sm.select(index, sm.ClearAndSelect|sm.Rows) self.library_view.setCurrentIndex(index) except: - pass - + import traceback + traceback.print_exc() def sync_listview_to_cf(self, row): self.cf_last_updated_at = time.time() diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 90ac7dbbaf..2a9c81e8ee 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -162,7 +162,6 @@ class DateTime(Base): val = qt_to_dt(val) return val - class Comments(Base): def setup_ui(self, parent): @@ -199,11 +198,7 @@ class Text(Base): w = EnComboBox(parent) w.setSizeAdjustPolicy(w.AdjustToMinimumContentsLengthWithIcon) w.setMinimumContentsLength(25) - - - - self.widgets = [QLabel('&'+self.col_metadata['name']+':', parent), - w] + self.widgets = [QLabel('&'+self.col_metadata['name']+':', parent), w] def initialize(self, book_id): val = self.db.get_custom(book_id, num=self.col_id, index_is_id=True) @@ -222,7 +217,6 @@ class Text(Base): if idx is not None: self.widgets[1].setCurrentIndex(idx) - def setter(self, val): if self.col_metadata['is_multiple']: if not val: @@ -241,6 +235,58 @@ class Text(Base): val = None return val +class Series(Base): + + def setup_ui(self, parent): + values = self.all_values = list(self.db.all_custom(num=self.col_id)) + values.sort(cmp = lambda x,y: cmp(x.lower(), y.lower())) + w = EnComboBox(parent) + w.setSizeAdjustPolicy(w.AdjustToMinimumContentsLengthWithIcon) + w.setMinimumContentsLength(25) + self.name_widget = w + self.widgets = [QLabel('&'+self.col_metadata['name']+':', parent), w] + + self.widgets.append(QLabel('&'+self.col_metadata['name']+_(' index:'), parent)) + w = QDoubleSpinBox(parent) + w.setRange(-100., float(sys.maxint)) + w.setDecimals(2) + w.setSpecialValueText(_('Undefined')) + w.setSingleStep(1) + self.idx_widget=w + self.widgets.append(w) + + def initialize(self, book_id): + val = self.db.get_custom(book_id, num=self.col_id, index_is_id=True) + s_index = self.db.get_custom_extra(book_id, num=self.col_id, index_is_id=True) + if s_index is None: + s_index = 0.0 + self.idx_widget.setValue(s_index) + self.initial_index = s_index + self.initial_val = val + val = self.normalize_db_val(val) + idx = None + for i, c in enumerate(self.all_values): + if c == val: + idx = i + self.name_widget.addItem(c) + self.name_widget.setEditText('') + if idx is not None: + self.widgets[1].setCurrentIndex(idx) + + def commit(self, book_id, notify=False): + val = unicode(self.name_widget.currentText()).strip() + val = self.normalize_ui_val(val) + s_index = self.idx_widget.value() + if val != self.initial_val or s_index != self.initial_index: + if s_index == 0.0: + if tweaks['series_index_auto_increment'] == 'next': + s_index = self.db.get_next_cc_series_num_for(val, + num=self.col_id) + else: + s_index = None + self.db.set_custom(book_id, val, extra=s_index, + num=self.col_id, notify=notify) + widgets = { 'bool' : Bool, 'rating' : Rating, @@ -249,6 +295,7 @@ widgets = { 'datetime': DateTime, 'text' : Text, 'comments': Comments, + 'series': Series, } def field_sort(y, z, x=None): @@ -257,35 +304,65 @@ def field_sort(y, z, x=None): n2 = 'zzzzz' if m2['datatype'] == 'comments' else m2['name'] return cmp(n1.lower(), n2.lower()) -def populate_single_metadata_page(left, right, db, book_id, parent=None): +def populate_metadata_page(layout, db, book_id, bulk=False, two_column=False, parent=None): + def widget_factory(type, col): + if bulk: + w = bulk_widgets[type](db, col, parent) + else: + w = widgets[type](db, col, parent) + w.initialize(book_id) + return w x = db.custom_column_num_map cols = list(x) cols.sort(cmp=partial(field_sort, x=x)) + count_non_comment = len([c for c in cols if x[c]['datatype'] != 'comments']) + + layout.setColumnStretch(1, 10) + if two_column: + turnover_point = (count_non_comment+1)/2 + layout.setColumnStretch(3, 10) + else: + # Avoid problems with multi-line widgets + turnover_point = count_non_comment + 1000 ans = [] - for i, col in enumerate(cols): - w = widgets[x[col]['datatype']](db, col, parent) + column = row = comments_row = 0 + for col in cols: + dt = x[col]['datatype'] + if dt == 'comments': + continue + w = widget_factory(dt, col) ans.append(w) - w.initialize(book_id) - layout = left if i%2 == 0 else right - row = layout.rowCount() - if len(w.widgets) == 1: - layout.addWidget(w.widgets[0], row, 0, 1, -1) - else: - w.widgets[0].setBuddy(w.widgets[1]) - for c, widget in enumerate(w.widgets): - layout.addWidget(widget, row, c) + for c in range(0, len(w.widgets), 2): + w.widgets[c].setBuddy(w.widgets[c+1]) + layout.addWidget(w.widgets[c], row, column) + layout.addWidget(w.widgets[c+1], row, column+1) + row += 1 + comments_row = max(comments_row, row) + if row >= turnover_point: + column += 2 + turnover_point = count_non_comment + 1000 + row = 0 + if not bulk: # Add the comments fields + row = comments_row + column = 0 + for col in cols: + dt = x[col]['datatype'] + if dt != 'comments': + continue + w = widget_factory(dt, col) + ans.append(w) + layout.addWidget(w.widgets[0], row, column, 1, 2) + if two_column and column == 0: + column = 2 + continue + column = 0 + row += 1 items = [] if len(ans) > 0: items.append(QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding)) - left.addItem(items[-1], left.rowCount(), 0, 1, 1) - left.setRowStretch(left.rowCount()-1, 100) - if len(ans) > 1: - items.append(QSpacerItem(10, 100, QSizePolicy.Minimum, - QSizePolicy.Expanding)) - right.addItem(items[-1], left.rowCount(), 0, 1, 1) - right.setRowStretch(right.rowCount()-1, 100) - + layout.addItem(items[-1], layout.rowCount(), 0, 1, 1) + layout.setRowStretch(layout.rowCount()-1, 100) return ans, items class BulkBase(Base): @@ -342,6 +419,47 @@ class BulkRating(BulkBase, Rating): class BulkDateTime(BulkBase, DateTime): pass +class BulkSeries(BulkBase): + def setup_ui(self, parent): + values = self.all_values = list(self.db.all_custom(num=self.col_id)) + values.sort(cmp = lambda x,y: cmp(x.lower(), y.lower())) + w = EnComboBox(parent) + w.setSizeAdjustPolicy(w.AdjustToMinimumContentsLengthWithIcon) + w.setMinimumContentsLength(25) + self.name_widget = w + self.widgets = [QLabel('&'+self.col_metadata['name']+':', parent), w] + + self.widgets.append(QLabel(_('Automatically number books in this series'), parent)) + self.idx_widget=QCheckBox(parent) + self.widgets.append(self.idx_widget) + + def initialize(self, book_id): + self.idx_widget.setChecked(False) + for c in self.all_values: + self.name_widget.addItem(c) + self.name_widget.setEditText('') + + def commit(self, book_ids, notify=False): + val = unicode(self.name_widget.currentText()).strip() + val = self.normalize_ui_val(val) + update_indices = self.idx_widget.checkState() + if val != '': + for book_id in book_ids: + if update_indices: + if tweaks['series_index_auto_increment'] == 'next': + s_index = self.db.get_next_cc_series_num_for\ + (val, num=self.col_id) + else: + s_index = 1.0 + else: + s_index = self.db.get_custom_extra(book_id, num=self.col_id, + index_is_id=True) + self.db.set_custom(book_id, val, extra=s_index, + num=self.col_id, notify=notify) + + def process_each_book(self): + return True + class RemoveTags(QWidget): def __init__(self, parent, values): @@ -431,35 +549,5 @@ bulk_widgets = { 'float': BulkFloat, 'datetime': BulkDateTime, 'text' : BulkText, + 'series': BulkSeries, } - -def populate_bulk_metadata_page(layout, db, book_ids, parent=None): - x = db.custom_column_num_map - cols = list(x) - cols.sort(cmp=partial(field_sort, x=x)) - ans = [] - for i, col in enumerate(cols): - dt = x[col]['datatype'] - if dt == 'comments': - continue - w = bulk_widgets[dt](db, col, parent) - ans.append(w) - w.initialize(book_ids) - row = layout.rowCount() - if len(w.widgets) == 1: - layout.addWidget(w.widgets[0], row, 0, 1, -1) - else: - for c in range(0, len(w.widgets), 2): - w.widgets[c].setBuddy(w.widgets[c+1]) - layout.addWidget(w.widgets[c], row, 0) - layout.addWidget(w.widgets[c+1], row, 1) - row += 1 - items = [] - if len(ans) > 0: - items.append(QSpacerItem(10, 10, QSizePolicy.Minimum, - QSizePolicy.Expanding)) - layout.addItem(items[-1], layout.rowCount(), 0, 1, 1) - layout.setRowStretch(layout.rowCount()-1, 100) - - return ans, items - diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 07b5063e6c..e2a99864ec 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -10,7 +10,7 @@ from functools import partial from binascii import unhexlify from PyQt4.Qt import QMenu, QAction, QActionGroup, QIcon, SIGNAL, QPixmap, \ - Qt, pyqtSignal, QColor, QPainter + Qt, pyqtSignal, QColor, QPainter, QDialog, QMessageBox from PyQt4.QtSvg import QSvgRenderer from calibre.customize.ui import available_input_formats, available_output_formats, \ @@ -29,7 +29,10 @@ from calibre.utils.filenames import ascii_filename from calibre.devices.errors import FreeSpaceError from calibre.utils.smtp import compose_mail, sendmail, extract_email_address, \ config as email_config +from calibre.devices.apple.driver import ITUNES_ASYNC from calibre.devices.folder_device.driver import FOLDER_DEVICE +from calibre.ebooks.metadata.meta import set_metadata +from calibre.constants import DEBUG # }}} @@ -75,10 +78,16 @@ class DeviceJob(BaseJob): # {{{ self.job_done() def abort(self, err): + call_job_done = False + if self.run_state == self.WAITING: + self.start_work() + call_job_done = True self._aborted = True self.failed = True self._details = unicode(err) self.exception = err + if call_job_done: + self.job_done() @property def log_file(self): @@ -104,9 +113,9 @@ class DeviceManager(Thread): # {{{ self.current_job = None self.scanner = DeviceScanner() self.connected_device = None + self.connected_device_kind = None self.ejected_devices = set([]) - self.connected_device_is_folder = False - self.folder_connection_requests = Queue.Queue(0) + self.mount_connection_requests = Queue.Queue(0) self.open_feedback_slot = open_feedback_slot def report_progress(self, *args): @@ -120,7 +129,7 @@ class DeviceManager(Thread): # {{{ def device(self): return self.connected_device - def do_connect(self, connected_devices, is_folder_device): + def do_connect(self, connected_devices, device_kind): for dev, detected_device in connected_devices: if dev.OPEN_FEEDBACK_MESSAGE is not None: self.open_feedback_slot(dev.OPEN_FEEDBACK_MESSAGE) @@ -133,8 +142,8 @@ class DeviceManager(Thread): # {{{ traceback.print_exc() continue self.connected_device = dev - self.connected_device_is_folder = is_folder_device - self.connected_slot(True, is_folder_device) + self.connected_device_kind = device_kind + self.connected_slot(True, device_kind) return True return False @@ -152,7 +161,7 @@ class DeviceManager(Thread): # {{{ if self.connected_device in self.ejected_devices: self.ejected_devices.remove(self.connected_device) else: - self.connected_slot(False, self.connected_device_is_folder) + self.connected_slot(False, self.connected_device_kind) self.connected_device = None def detect_device(self): @@ -174,18 +183,30 @@ class DeviceManager(Thread): # {{{ possibly_connected_devices.append((device, detected_device)) if possibly_connected_devices: if not self.do_connect(possibly_connected_devices, - is_folder_device=False): + device_kind='device'): prints('Connect to device failed, retrying in 5 seconds...') time.sleep(5) if not self.do_connect(possibly_connected_devices, - is_folder_device=False): + device_kind='usb'): prints('Device connect failed again, giving up') + # Mount devices that don't use USB, such as the folder device and iTunes + # This will be called on the GUI thread. Because of this, we must store + # information that the scanner thread will use to do the real work. + def mount_device(self, kls, kind, path): + self.mount_connection_requests.put((kls, kind, path)) + + # disconnect a device def umount_device(self, *args): if self.is_device_connected and not self.job_manager.has_device_jobs(): - self.connected_device.eject() - self.ejected_devices.add(self.connected_device) - self.connected_slot(False, self.connected_device_is_folder) + if self.connected_device_kind == 'device': + self.connected_device.eject() + self.ejected_devices.add(self.connected_device) + self.connected_slot(False, self.connected_device_kind) + elif hasattr(self.connected_device, 'unmount_device'): + # As we are on the wrong thread, this call must *not* do + # anything besides set a flag that the right thread will see. + self.connected_device.unmount_device() def next(self): if not self.jobs.empty(): @@ -196,20 +217,19 @@ class DeviceManager(Thread): # {{{ def run(self): while self.keep_going: - folder_path = None + kls = None while True: try: - folder_path = self.folder_connection_requests.get_nowait() + (kls,device_kind, folder_path) = \ + self.mount_connection_requests.get_nowait() except Queue.Empty: break - if not folder_path or not os.access(folder_path, os.R_OK): - folder_path = None - if not self.is_device_connected and folder_path is not None: + if kls is not None: try: - dev = FOLDER_DEVICE(folder_path) - self.do_connect([[dev, None],], is_folder_device=True) + dev = kls(folder_path) + self.do_connect([[dev, None],], device_kind=device_kind) except: - prints('Unable to open folder as device', folder_path) + prints('Unable to open %s as device (%s)'%(device_kind, folder_path)) traceback.print_exc() else: self.detect_device() @@ -249,21 +269,6 @@ class DeviceManager(Thread): # {{{ return self.create_job(self._get_device_information, done, description=_('Get device information')) - # This will be called on the GUI thread. Because of this, we must store - # information that the scanner thread will use to do the real work. - def connect_to_folder(self, path): - self.folder_connection_requests.put(path) - - # This is called on the GUI thread. No problem here, because it calls the - # device driver, telling it to tell the scanner when it passes by that the - # folder has disconnected. - def disconnect_folder(self): - if self.connected_device is not None: - if hasattr(self.connected_device, 'disconnect_from_folder'): - # As we are on the wrong thread, this call must *not* do - # anything besides set a flag that the right thread will see. - self.connected_device.disconnect_from_folder() - def _books(self): '''Get metadata from device''' mainlist = self.device.books(oncard=None, end_session=False) @@ -294,8 +299,28 @@ class DeviceManager(Thread): # {{{ return self.create_job(self._sync_booklists, done, args=[booklists], description=_('Send metadata to device')) + def upload_collections(self, done, booklist, on_card): + return self.create_job(booklist.rebuild_collections, done, + args=[booklist, on_card], + description=_('Send collections to device')) + def _upload_books(self, files, names, on_card=None, metadata=None): '''Upload books to device: ''' + if metadata and files and len(metadata) == len(files): + for f, mi in zip(files, metadata): + if isinstance(f, unicode): + ext = f.rpartition('.')[-1].lower() + if ext: + try: + if DEBUG: + prints('Setting metadata in:', mi.title, 'at:', + f, file=sys.__stdout__) + with open(f, 'r+b') as stream: + set_metadata(stream, mi, stream_type=ext) + except: + if DEBUG: + prints(traceback.format_exc(), file=sys.__stdout__) + return self.device.upload_books(files, names, on_card, metadata=metadata, end_session=False) @@ -370,7 +395,8 @@ class DeviceMenu(QMenu): # {{{ fetch_annotations = pyqtSignal() connect_to_folder = pyqtSignal() - disconnect_from_folder = pyqtSignal() + connect_to_itunes = pyqtSignal() + disconnect_mounted_device = pyqtSignal() def __init__(self, parent=None): QMenu.__init__(self, parent) @@ -485,10 +511,16 @@ class DeviceMenu(QMenu): # {{{ mitem.triggered.connect(lambda x : self.connect_to_folder.emit()) self.connect_to_folder_action = mitem - mitem = self.addAction(QIcon(I('eject.svg')), _('Disconnect from folder')) + mitem = self.addAction(QIcon(I('devices/itunes.png')), + _('Connect to iTunes')) + mitem.setEnabled(True) + mitem.triggered.connect(lambda x : self.connect_to_itunes.emit()) + self.connect_to_itunes_action = mitem + + mitem = self.addAction(QIcon(I('eject.svg')), _('Eject device')) mitem.setEnabled(False) - mitem.triggered.connect(lambda x : self.disconnect_from_folder.emit()) - self.disconnect_from_folder_action = mitem + mitem.triggered.connect(lambda x : self.disconnect_mounted_device.emit()) + self.disconnect_mounted_device_action = mitem self.addSeparator() self.addMenu(self.set_default_menu) @@ -602,7 +634,6 @@ class Emailer(Thread): # {{{ class DeviceMixin(object): # {{{ def __init__(self): - self.db_book_uuid_cache = set() self.device_error_dialog = error_dialog(self, _('Error'), _('Error communicating with device'), ' ') self.device_error_dialog.setModal(Qt.NonModal) @@ -625,12 +656,17 @@ class DeviceMixin(object): # {{{ def connect_to_folder(self): dir = choose_dir(self, 'Select Device Folder', - _('Select folder to open as device')) - if dir is not None: - self.device_manager.connect_to_folder(dir) + _('Select folder to open as device')) + kls = FOLDER_DEVICE + self.device_manager.mount_device(kls=kls, kind='folder', path=dir) - def disconnect_from_folder(self): - self.device_manager.disconnect_folder() + def connect_to_itunes(self): + kls = ITUNES_ASYNC + self.device_manager.mount_device(kls=kls, kind='itunes', path=None) + + # disconnect from both folder and itunes devices + def disconnect_mounted_device(self): + self.device_manager.umount_device() def _sync_action_triggered(self, *args): m = getattr(self, '_sync_menu', None) @@ -645,18 +681,16 @@ class DeviceMixin(object): # {{{ self.dispatch_sync_event) self._sync_menu.fetch_annotations.connect(self.fetch_annotations) self._sync_menu.connect_to_folder.connect(self.connect_to_folder) - self._sync_menu.disconnect_from_folder.connect(self.disconnect_from_folder) + self._sync_menu.connect_to_itunes.connect(self.connect_to_itunes) + self._sync_menu.disconnect_mounted_device.connect(self.disconnect_mounted_device) if self.device_connected: self._sync_menu.connect_to_folder_action.setEnabled(False) - if self.device_connected == 'folder': - self._sync_menu.disconnect_from_folder_action.setEnabled(True) - else: - self._sync_menu.disconnect_from_folder_action.setEnabled(False) + self._sync_menu.connect_to_itunes_action.setEnabled(False) + self._sync_menu.disconnect_mounted_device_action.setEnabled(True) else: self._sync_menu.connect_to_folder_action.setEnabled(True) - self._sync_menu.disconnect_from_folder_action.setEnabled(False) - - + self._sync_menu.connect_to_itunes_action.setEnabled(True) + self._sync_menu.disconnect_mounted_device_action.setEnabled(False) def device_job_exception(self, job): ''' @@ -690,26 +724,27 @@ class DeviceMixin(object): # {{{ # Device connected {{{ - def set_device_menu_items_state(self, connected, is_folder_device): + def set_device_menu_items_state(self, connected): if connected: self._sync_menu.connect_to_folder_action.setEnabled(False) - if is_folder_device: - self._sync_menu.disconnect_from_folder_action.setEnabled(True) + self._sync_menu.connect_to_itunes_action.setEnabled(False) + self._sync_menu.disconnect_mounted_device_action.setEnabled(True) self._sync_menu.enable_device_actions(True, self.device_manager.device.card_prefix(), self.device_manager.device) self.eject_action.setEnabled(True) else: self._sync_menu.connect_to_folder_action.setEnabled(True) - self._sync_menu.disconnect_from_folder_action.setEnabled(False) + self._sync_menu.connect_to_itunes_action.setEnabled(True) + self._sync_menu.disconnect_mounted_device_action.setEnabled(False) self._sync_menu.enable_device_actions(False) self.eject_action.setEnabled(False) - def device_detected(self, connected, is_folder_device): + def device_detected(self, connected, device_kind): ''' Called when a device is connected to the computer. ''' - self.set_device_menu_items_state(connected, is_folder_device) + self.set_device_menu_items_state(connected) if connected: self.device_manager.get_device_information(\ Dispatcher(self.info_read)) @@ -718,15 +753,13 @@ class DeviceMixin(object): # {{{ self.status_bar.show_message(_('Device: ')+\ self.device_manager.device.__class__.get_gui_name()+\ _(' detected.'), 3000) - self.device_connected = 'device' if not is_folder_device else 'folder' + self.device_connected = device_kind self.location_view.model().device_connected(self.device_manager.device) self.refresh_ondevice_info (device_connected = True, reset_only = True) else: self.device_connected = None + self.status_bar.device_disconnected() self.location_view.model().update_devices() - self.vanity.setText(self.vanity_template%\ - dict(version=self.latest_version, device=' ')) - self.device_info = ' ' if self.current_view() != self.library_view: self.book_details.reset_info() self.location_view.setCurrentIndex(self.location_view.model().index(0)) @@ -740,10 +773,7 @@ class DeviceMixin(object): # {{{ return self.device_job_exception(job) info, cp, fs = job.result self.location_view.model().update_devices(cp, fs) - self.device_info = _('Connected ')+info[0] - self.vanity.setText(self.vanity_template%\ - dict(version=self.latest_version, device=self.device_info)) - + self.status_bar.device_connected(info[0]) self.device_manager.books(Dispatcher(self.metadata_downloaded)) def metadata_downloaded(self, job): @@ -815,7 +845,8 @@ class DeviceMixin(object): # {{{ if specific: d = ChooseFormatDialog(self, _('Choose format to send to device'), self.device_manager.device.settings().format_map) - d.exec_() + if d.exec_() != QDialog.Accepted: + return if d.format(): fmt = d.format().lower() dest, sub_dest = dest.split(':') @@ -921,7 +952,8 @@ class DeviceMixin(object): # {{{ autos = '\n'.join('%s'%i for i in autos) if question_dialog(self, _('No suitable formats'), _('Auto convert the following books before sending via ' - 'email?'), det_msg=autos): + 'email?'), det_msg=autos, + buttons=QMessageBox.Yes|QMessageBox.Cancel): self.auto_convert_mail(to, fmts, delete_from_library, auto, format) if bad: @@ -1020,7 +1052,8 @@ class DeviceMixin(object): # {{{ autos = '\n'.join('%s'%i for i in autos) if question_dialog(self, _('No suitable formats'), _('Auto convert the following books before uploading to ' - 'the device?'), det_msg=autos): + 'the device?'), det_msg=autos, + buttons=QMessageBox.Yes|QMessageBox.Cancel): self.auto_convert_catalogs(auto, format) files = [f for f in files if f is not None] if not files: @@ -1081,7 +1114,8 @@ class DeviceMixin(object): # {{{ autos = '\n'.join('%s'%i for i in autos) if question_dialog(self, _('No suitable formats'), _('Auto convert the following books before uploading to ' - 'the device?'), det_msg=autos): + 'the device?'), det_msg=autos, + buttons=QMessageBox.Yes|QMessageBox.Cancel): self.auto_convert_news(auto, format) files = [f for f in files if f is not None] for f in files: @@ -1126,7 +1160,6 @@ class DeviceMixin(object): # {{{ _files, _auto_ids = self.library_view.model().get_preferred_formats_from_ids(ids, settings.format_map, - set_metadata=True, specific_format=specific_format, exclude_auto=do_auto_convert) if do_auto_convert: @@ -1200,7 +1233,8 @@ class DeviceMixin(object): # {{{ autos = '\n'.join('%s'%i for i in autos) if question_dialog(self, _('No suitable formats'), _('Auto convert the following books before uploading to ' - 'the device?'), det_msg=autos): + 'the device?'), det_msg=autos, + buttons=QMessageBox.Yes|QMessageBox.Cancel): self.auto_convert(auto, on_card, format) if bad: @@ -1228,6 +1262,19 @@ class DeviceMixin(object): # {{{ return cp, fs = job.result self.location_view.model().update_devices(cp, fs) + # reset the views so that up-to-date info is shown. These need to be + # here because the sony driver updates collections in sync_booklists + self.memory_view.reset() + self.card_a_view.reset() + self.card_b_view.reset() + + def _upload_collections(self, job): + if job.failed: + self.device_job_exception(job) + + def upload_collections(self, booklist, view=None, oncard=None): + return self.device_manager.upload_collections(self._upload_collections, + booklist, oncard) def upload_books(self, files, names, metadata, on_card=None, memory=None): ''' @@ -1350,11 +1397,18 @@ class DeviceMixin(object): # {{{ return loc def set_books_in_library(self, booklists, reset=False): - if reset: - # First build a cache of the library, so the search isn't On**2 + # 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: + 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 = {} - db = self.library_view.model().db for id in db.data.iterallids(): mi = db.get_metadata(id, index_is_id=True) title = re.sub('(?u)\W|[_]', '', mi.title.lower()) @@ -1377,7 +1431,6 @@ class DeviceMixin(object): # {{{ # 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 - resend_metadata = False for booklist in booklists: for book in booklist: if getattr(book, 'uuid', None) in self.db_book_uuid_cache: @@ -1394,12 +1447,10 @@ class DeviceMixin(object): # {{{ if getattr(book, 'application_id', None) in d['db_ids']: book.in_library = True book.smart_update(d['db_ids'][book.application_id]) - resend_metadata = True continue if book.db_id in d['db_ids']: book.in_library = True book.smart_update(d['db_ids'][book.db_id]) - resend_metadata = True continue if book.authors: # Compare against both author and author sort, because @@ -1409,21 +1460,13 @@ class DeviceMixin(object): # {{{ if book_authors in d['authors']: book.in_library = True book.smart_update(d['authors'][book_authors]) - resend_metadata = True elif book_authors in d['author_sort']: book.in_library = True book.smart_update(d['author_sort'][book_authors]) - resend_metadata = True # Set author_sort if it isn't already asort = getattr(book, 'author_sort', None) if not asort and book.authors: book.author_sort = self.library_view.model().db.author_sort_from_authors(book.authors) - resend_metadata = True - - if resend_metadata: - # Correct the metadata cache on device. - if self.device_manager.is_device_connected: - self.device_manager.sync_booklists(None, booklists) # }}} diff --git a/src/calibre/gui2/dialogs/book_info.py b/src/calibre/gui2/dialogs/book_info.py index 20ddfae0b4..9770ef864f 100644 --- a/src/calibre/gui2/dialogs/book_info.py +++ b/src/calibre/gui2/dialogs/book_info.py @@ -5,11 +5,11 @@ __docformat__ = 'restructuredtext en' import textwrap, os, re -from PyQt4.QtCore import QCoreApplication, SIGNAL, QModelIndex, QUrl, QTimer, Qt -from PyQt4.QtGui import QDialog, QPixmap, QGraphicsScene, QIcon, QDesktopServices +from PyQt4.QtCore import QCoreApplication, SIGNAL, QModelIndex, QTimer, Qt +from PyQt4.QtGui import QDialog, QPixmap, QGraphicsScene, QIcon from calibre.gui2.dialogs.book_info_ui import Ui_BookInfo -from calibre.gui2 import dynamic +from calibre.gui2 import dynamic, open_local_file from calibre import fit_image from calibre.library.comments import comments_to_html @@ -49,12 +49,12 @@ class BookInfo(QDialog, Ui_BookInfo): def open_book_path(self, path): if os.sep in unicode(path): - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + open_local_file(path) else: format = unicode(path) path = self.view.model().db.format_abspath(self.current_row, format) if path is not None: - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + open_local_file(path) def next(self): @@ -123,6 +123,7 @@ class BookInfo(QDialog, Ui_BookInfo): for key in info.keys(): if key == 'id': continue txt = info[key] - txt = u'
\n'.join(textwrap.wrap(txt, 120)) + if key != _('Path'): + txt = u'
\n'.join(textwrap.wrap(txt, 120)) rows += u'

%s:%s
'+rows+'
') diff --git a/src/calibre/gui2/dialogs/choose_format.ui b/src/calibre/gui2/dialogs/choose_format.ui index 0ae0fa8b94..50dd4b4fc1 100644 --- a/src/calibre/gui2/dialogs/choose_format.ui +++ b/src/calibre/gui2/dialogs/choose_format.ui @@ -39,7 +39,7 @@ Qt::Horizontal - QDialogButtonBox::Ok + QDialogButtonBox::Ok|QDialogButtonBox::Cancel diff --git a/src/calibre/gui2/dialogs/config/__init__.py b/src/calibre/gui2/dialogs/config/__init__.py index ad49848b7b..bf9dc0a623 100644 --- a/src/calibre/gui2/dialogs/config/__init__.py +++ b/src/calibre/gui2/dialogs/config/__init__.py @@ -4,7 +4,7 @@ __copyright__ = '2008, Kovid Goyal ' import os, re, time, textwrap, copy, sys from PyQt4.Qt import QDialog, QListWidgetItem, QIcon, \ - QDesktopServices, QVBoxLayout, QLabel, QPlainTextEdit, \ + QVBoxLayout, QLabel, QPlainTextEdit, \ QStringListModel, QAbstractItemModel, QFont, \ SIGNAL, QThread, Qt, QSize, QVariant, QUrl, \ QModelIndex, QAbstractTableModel, \ @@ -15,8 +15,9 @@ 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 import choose_dir, error_dialog, config, gprefs, \ - ALL_COLUMNS, NONE, info_dialog, choose_files, \ - warning_dialog, ResizableDialog, question_dialog + open_url, open_local_file, \ + ALL_COLUMNS, NONE, info_dialog, choose_files, \ + warning_dialog, ResizableDialog, question_dialog from calibre.utils.config import prefs from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.oeb.iterator import is_supported @@ -493,6 +494,8 @@ class ConfigDialog(ResizableDialog, Ui_Dialog): if x == config['gui_layout']: li = i self.opt_gui_layout.setCurrentIndex(li) + self.opt_disable_animations.setChecked(config['disable_animations']) + self.opt_show_donate_button.setChecked(config['show_donate_button']) def check_port_value(self, *args): port = self.port.value() @@ -511,7 +514,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog): def open_config_dir(self): from calibre.utils.config import config_dir - QDesktopServices.openUrl(QUrl.fromLocalFile(config_dir)) + open_local_file(config_dir) def create_symlinks(self): from calibre.utils.osx_symlinks import create_symlinks @@ -804,7 +807,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog): self.stop.setEnabled(False) def test_server(self): - QDesktopServices.openUrl(QUrl('http://127.0.0.1:'+str(self.port.value()))) + open_url(QUrl('http://127.0.0.1:'+str(self.port.value()))) def compact(self, toggled): d = CheckIntegrity(self.db, self) @@ -868,6 +871,8 @@ class ConfigDialog(ResizableDialog, Ui_Dialog): 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()) + config['show_donate_button'] = bool(self.opt_show_donate_button.isChecked()) gprefs['show_splash_screen'] = bool(self.show_splash_screen.isChecked()) fmts = [] for i in range(self.viewer.count()): diff --git a/src/calibre/gui2/dialogs/config/add_save.py b/src/calibre/gui2/dialogs/config/add_save.py index aff995d84f..b1f5621f44 100644 --- a/src/calibre/gui2/dialogs/config/add_save.py +++ b/src/calibre/gui2/dialogs/config/add_save.py @@ -45,6 +45,7 @@ class AddSave(QTabWidget, Ui_TabWidget): 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']) + self.preserve_user_collections.setChecked(prefs['preserve_user_collections']) 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) @@ -71,6 +72,7 @@ class AddSave(QTabWidget, Ui_TabWidget): 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()) + prefs['preserve_user_collections'] = bool(self.preserve_user_collections.isChecked()) return True diff --git a/src/calibre/gui2/dialogs/config/add_save.ui b/src/calibre/gui2/dialogs/config/add_save.ui index 7fda2dbc7f..64a8137aa1 100644 --- a/src/calibre/gui2/dialogs/config/add_save.ui +++ b/src/calibre/gui2/dialogs/config/add_save.ui @@ -51,7 +51,7 @@ - If an existing book with a similar title and author is found that does not have the format being added, the format is added + 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. @@ -179,7 +179,31 @@ Title match ignores leading indefinite articles ("the", "a", - + + + Preserve device collections. + + + + + + + If checked, collections will not be deleted even if a book with changed metadata is resent and the collection is not in the book's metadata. In addition, editing collections in the device view will be enabled. If unchecked, collections will be always reflect only the metadata in the calibre library. + + + 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 diff --git a/src/calibre/gui2/dialogs/config/config.ui b/src/calibre/gui2/dialogs/config/config.ui index efda00fc97..b473ee7846 100644 --- a/src/calibre/gui2/dialogs/config/config.ui +++ b/src/calibre/gui2/dialogs/config/config.ui @@ -89,8 +89,8 @@ 0 0 - 720 - 679 + 724 + 683 @@ -356,7 +356,7 @@ - + Show &splash screen at startup @@ -655,6 +655,23 @@ + + + + Disable all animations. Useful if you have a slow/old computer. + + + Disable &animations + + + + + + + Show &donate button (restart) + + + diff --git a/src/calibre/gui2/dialogs/config/create_custom_column.py b/src/calibre/gui2/dialogs/config/create_custom_column.py index a66b7b6642..2aae567b1c 100644 --- a/src/calibre/gui2/dialogs/config/create_custom_column.py +++ b/src/calibre/gui2/dialogs/config/create_custom_column.py @@ -24,16 +24,19 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): 2:{'datatype':'comments', 'text':_('Long text, like comments, not shown in the tag browser'), 'is_multiple':False}, - 3:{'datatype':'datetime', + 3:{'datatype':'series', + 'text':_('Text column for keeping series-like information'), + 'is_multiple':False}, + 4:{'datatype':'datetime', 'text':_('Date'), 'is_multiple':False}, - 4:{'datatype':'float', + 5:{'datatype':'float', 'text':_('Floating point numbers'), 'is_multiple':False}, - 5:{'datatype':'int', + 6:{'datatype':'int', 'text':_('Integers'), 'is_multiple':False}, - 6:{'datatype':'rating', + 7:{'datatype':'rating', 'text':_('Ratings, shown with stars'), 'is_multiple':False}, - 7:{'datatype':'bool', + 8:{'datatype':'bool', 'text':_('Yes/No'), 'is_multiple':False}, } diff --git a/src/calibre/gui2/dialogs/delete_matching_from_device.py b/src/calibre/gui2/dialogs/delete_matching_from_device.py index dbac2fe4ad..2135cc0d52 100644 --- a/src/calibre/gui2/dialogs/delete_matching_from_device.py +++ b/src/calibre/gui2/dialogs/delete_matching_from_device.py @@ -25,6 +25,12 @@ class tableItem(QTableWidgetItem): def __lt__(self, other): return self.sort < other.sort +class centeredTableItem(tableItem): + + def __init__(self, text): + tableItem.__init__(self, text) + self.setTextAlignment(Qt.AlignCenter) + class titleTableItem(tableItem): def __init__(self, text): @@ -60,14 +66,14 @@ class DeleteMatchingFromDeviceDialog(QDialog, Ui_DeleteMatchingFromDeviceDialog) self.explanation.setText('

'+_('All checked books will be ' 'permanently deleted from your ' - 'device. Please verify the list.'+'

')) + 'device. Please verify the list.')+'

') self.buttonBox.accepted.connect(self.accepted) self.table.cellClicked.connect(self.cell_clicked) self.table.setSelectionMode(QAbstractItemView.NoSelection) - self.table.setColumnCount(5) + self.table.setColumnCount(7) self.table.setHorizontalHeaderLabels( - ['', _('Location'), _('Title'), - _('Author'), _('Date'), _('Format')]) + ['', _('Location'), _('Title'), _('Author'), + _('Date'), _('Format'), _('Path')]) rows = 0 for card in items: rows += len(items[card][1]) @@ -85,7 +91,8 @@ class DeleteMatchingFromDeviceDialog(QDialog, Ui_DeleteMatchingFromDeviceDialog) self.table.setItem(row, 2, titleTableItem(book.title)) self.table.setItem(row, 3, authorTableItem(book)) self.table.setItem(row, 4, dateTableItem(book.datetime)) - self.table.setItem(row, 5, tableItem(book.path.rpartition('.')[2])) + self.table.setItem(row, 5, centeredTableItem(book.path.rpartition('.')[2])) + self.table.setItem(row, 6, tableItem(book.path)) row += 1 self.table.setCurrentCell(0, 1) self.table.resizeColumnsToContents() diff --git a/src/calibre/gui2/dialogs/fetch_metadata.py b/src/calibre/gui2/dialogs/fetch_metadata.py index f9e2c4da55..eb6edce75d 100644 --- a/src/calibre/gui2/dialogs/fetch_metadata.py +++ b/src/calibre/gui2/dialogs/fetch_metadata.py @@ -42,9 +42,6 @@ class Matches(QAbstractTableModel): def __init__(self, matches): self.matches = matches - self.matches.sort(cmp=lambda b, a: \ - cmp(len(a.comments if a.comments else ''), - len(b.comments if b.comments else ''))) QAbstractTableModel.__init__(self) def rowCount(self, *args): diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 8b27ff1999..9fcfe13253 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -10,7 +10,7 @@ from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog from calibre.gui2.dialogs.tag_editor import TagEditor from calibre.ebooks.metadata import string_to_authors, \ authors_to_string -from calibre.gui2.custom_column_widgets import populate_bulk_metadata_page +from calibre.gui2.custom_column_widgets import populate_metadata_page class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): @@ -44,15 +44,14 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.central_widget.tabBar().setVisible(False) else: self.create_custom_column_editors() - self.exec_() def create_custom_column_editors(self): w = self.central_widget.widget(1) layout = QGridLayout() - - self.custom_column_widgets, self.__cc_spacers = populate_bulk_metadata_page( - layout, self.db, self.ids, w) + self.custom_column_widgets, self.__cc_spacers = \ + populate_metadata_page(layout, self.db, self.ids, parent=w, + two_column=False, bulk=True) w.setLayout(layout) self.__custom_col_layouts = [layout] ans = self.custom_column_widgets diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 96323ac596..5a4eaec9d7 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -11,11 +11,10 @@ import re import time import traceback -import sip -from PyQt4.Qt import SIGNAL, QObject, QCoreApplication, Qt, QTimer, QThread, QDate, \ - QPixmap, QListWidgetItem, QDialog, QHBoxLayout, QGridLayout +from PyQt4.Qt import SIGNAL, QObject, Qt, QTimer, QThread, QDate, \ + QPixmap, QListWidgetItem, QDialog -from calibre.gui2 import error_dialog, file_icon_provider, \ +from calibre.gui2 import error_dialog, file_icon_provider, dynamic, \ choose_files, choose_images, ResizableDialog, \ warning_dialog from calibre.gui2.dialogs.metadata_single_ui import Ui_MetadataSingleDialog @@ -26,13 +25,12 @@ from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata import string_to_authors, \ authors_to_string, check_isbn from calibre.ebooks.metadata.library_thing import cover_from_isbn -from calibre import islinux, isfreebsd from calibre.ebooks.metadata.meta import get_metadata from calibre.utils.config import prefs, tweaks from calibre.utils.date import qt_to_dt from calibre.customize.ui import run_plugins_on_import, get_isbndb_key from calibre.gui2.dialogs.config.social import SocialMetadata -from calibre.gui2.custom_column_widgets import populate_single_metadata_page +from calibre.gui2.custom_column_widgets import populate_metadata_page class CoverFetcher(QThread): @@ -91,7 +89,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): COVER_FETCH_TIMEOUT = 240 # seconds def do_reset_cover(self, *args): - pix = QPixmap(I('book.svg')) + pix = QPixmap(I('default_cover.svg')) self.cover.setPixmap(pix) self.cover_changed = True self.cover_data = None @@ -105,7 +103,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): if _file: _file = os.path.abspath(_file) if not os.access(_file, os.R_OK): - d = error_dialog(self.window, _('Cannot read'), + d = error_dialog(self, _('Cannot read'), _('You do not have permission to read the file: ') + _file) d.exec_() return @@ -114,14 +112,14 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): cf = open(_file, "rb") cover = cf.read() except IOError, e: - d = error_dialog(self.window, _('Error reading file'), + d = error_dialog(self, _('Error reading file'), _("

There was an error reading from file:
") + _file + "


"+str(e)) d.exec_() if cover: pix = QPixmap() pix.loadFromData(cover) if pix.isNull(): - d = error_dialog(self.window, + d = error_dialog(self, _("Not a valid picture"), _file + _(" is not a valid picture")) d.exec_() @@ -164,7 +162,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.formats_changed = True added = True if bad_perms: - error_dialog(self.window, _('No permission'), + error_dialog(self, _('No permission'), _('You do not have ' 'permission to read the following files:'), det_msg='\n'.join(bad_perms), show=True) @@ -301,6 +299,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.connect(self.__abort_button, SIGNAL('clicked()'), self.do_cancel_all) self.splitter.setStretchFactor(100, 1) + self.read_state() self.db = db self.pi = ProgressIndicator(self) self.accepted_callback = accepted_callback @@ -311,7 +310,6 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.formats.setAcceptDrops(True) self.cover_changed = False self.cpixmap = None - self.cover.setAcceptDrops(True) self.pubdate.setMinimumDate(QDate(100,1,1)) pubdate_format = tweaks['gui_pubdate_display_format'] if pubdate_format is not None: @@ -399,16 +397,11 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.series.lineEdit().editingFinished.connect(self.increment_series_index) self.show() - height_of_rest = self.frameGeometry().height() - self.cover.height() - width_of_rest = self.frameGeometry().width() - self.cover.width() - ag = QCoreApplication.instance().desktop().availableGeometry(self) - self.cover.MAX_HEIGHT = ag.height()-(25 if (islinux or isfreebsd) else 0)-height_of_rest - self.cover.MAX_WIDTH = ag.width()-(25 if (islinux or isfreebsd) else 0)-width_of_rest pm = QPixmap() if cover: pm.loadFromData(cover) if pm.isNull(): - pm = QPixmap(I('book.svg')) + pm = QPixmap(I('default_cover.svg')) else: self.cover_data = cover self.cover.setPixmap(pm) @@ -420,23 +413,19 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): def create_custom_column_editors(self): w = self.central_widget.widget(1) - top_layout = QHBoxLayout() - top_layout.setSpacing(20) - left_layout = QGridLayout() - right_layout = QGridLayout() - top_layout.addLayout(left_layout) - - self.custom_column_widgets, self.__cc_spacers = populate_single_metadata_page( - left_layout, right_layout, self.db, self.id, w) - top_layout.addLayout(right_layout) - sip.delete(w.layout()) - w.setLayout(top_layout) - self.__custom_col_layouts = [top_layout, left_layout, right_layout] + layout = w.layout() + self.custom_column_widgets, self.__cc_spacers = \ + populate_metadata_page(layout, self.db, self.id, + parent=w, bulk=False, two_column=True) + self.__custom_col_layouts = [layout] ans = self.custom_column_widgets for i in range(len(ans)-1): - w.setTabOrder(ans[i].widgets[-1], ans[i+1].widgets[-1]) - - + if len(ans[i+1].widgets) == 2: + w.setTabOrder(ans[i].widgets[-1], ans[i+1].widgets[1]) + else: + w.setTabOrder(ans[i].widgets[-1], ans[i+1].widgets[0]) + for c in range(2, len(ans[i].widgets), 2): + w.setTabOrder(ans[i].widgets[c-1], ans[i].widgets[c+1]) def validate_isbn(self, isbn): isbn = unicode(isbn).strip() @@ -720,7 +709,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): _('Could not open %s. Is it being used by another' ' program?')%fname, show=True) raise - + self.save_state() QDialog.accept(self) if callable(self.accepted_callback): self.accepted_callback(self.id) @@ -732,3 +721,16 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): cf.wait() QDialog.reject(self, *args) + + def read_state(self): + wg = dynamic.get('metasingle_window_geometry', None) + ss = dynamic.get('metasingle_splitter_state', None) + if wg is not None: + self.restoreGeometry(wg) + if ss is not None: + self.splitter.restoreState(ss) + + def save_state(self): + dynamic.set('metasingle_window_geometry', bytes(self.saveGeometry())) + dynamic.set('metasingle_splitter_state', + bytes(self.splitter.saveState())) diff --git a/src/calibre/gui2/dialogs/metadata_single.ui b/src/calibre/gui2/dialogs/metadata_single.ui index 36375589a7..4efb48d870 100644 --- a/src/calibre/gui2/dialogs/metadata_single.ui +++ b/src/calibre/gui2/dialogs/metadata_single.ui @@ -576,22 +576,13 @@ - + 0 - 0 + 100 - - - - - :/images/book.svg - - - true - @@ -707,11 +698,6 @@
- - ImageView - QLabel -
widgets.h
-
EnLineEdit QLineEdit @@ -732,6 +718,12 @@ QListWidget
calibre/gui2/widgets.h
+ + ImageView + QWidget +
calibre/gui2/widgets.h
+ 1 +
title diff --git a/src/calibre/gui2/dialogs/tag_list_editor.py b/src/calibre/gui2/dialogs/tag_list_editor.py index 1ec80f4b4a..2e5d2ace28 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.py +++ b/src/calibre/gui2/dialogs/tag_list_editor.py @@ -1,54 +1,64 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -from functools import partial from PyQt4.QtCore import SIGNAL, Qt from PyQt4.QtGui import QDialog, QListWidgetItem from calibre.gui2.dialogs.tag_list_editor_ui import Ui_TagListEditor from calibre.gui2 import question_dialog, error_dialog -from calibre.ebooks.metadata import title_sort + +class ListWidgetItem(QListWidgetItem): + + def __init__(self, txt): + QListWidgetItem.__init__(self, txt) + self.old_value = txt + self.cur_value = txt + + def data(self, role): + if role == Qt.DisplayRole: + if self.old_value != self.cur_value: + return _('%s (was %s)')%(self.cur_value, self.old_value) + else: + return self.cur_value + elif role == Qt.EditRole: + return self.cur_value + else: + return QListWidgetItem.data(self, role) + + def setData(self, role, data): + if role == Qt.EditRole: + self.cur_value = data.toString() + QListWidgetItem.setData(self, role, data) + + def text(self): + return self.cur_value + + def setText(self, txt): + self.cur_value = txt + QListWidgetItem.setText(txt) class TagListEditor(QDialog, Ui_TagListEditor): - def __init__(self, window, db, tag_to_match, category): + def __init__(self, window, tag_to_match, data, compare): QDialog.__init__(self, window) Ui_TagListEditor.__init__(self) self.setupUi(self) self.to_rename = {} self.to_delete = [] - self.db = db self.all_tags = {} - self.category = category - if category == 'tags': - result = db.get_tags_with_ids() - compare = (lambda x,y:cmp(x.lower(), y.lower())) - elif category == 'series': - result = db.get_series_with_ids() - compare = (lambda x,y:cmp(title_sort(x).lower(), title_sort(y).lower())) - elif category == 'publisher': - result = db.get_publishers_with_ids() - compare = (lambda x,y:cmp(x.lower(), y.lower())) - else: # should be a custom field - self.cc_label = None - if category in db.field_metadata: - self.cc_label = db.field_metadata[category]['label'] - result = self.db.get_custom_items_with_ids(label=self.cc_label) - else: - result = [] - compare = (lambda x,y:cmp(x.lower(), y.lower())) - for k,v in result: + for k,v in data: self.all_tags[v] = k for tag in sorted(self.all_tags.keys(), cmp=compare): - item = QListWidgetItem(tag) + item = ListWidgetItem(tag) item.setData(Qt.UserRole, self.all_tags[tag]) self.available_tags.addItem(item) - items = self.available_tags.findItems(tag_to_match, Qt.MatchExactly) - if len(items) == 1: - self.available_tags.setCurrentItem(items[0]) + if tag_to_match is not None: + items = self.available_tags.findItems(tag_to_match, Qt.MatchExactly) + if len(items) == 1: + self.available_tags.setCurrentItem(items[0]) self.connect(self.delete_button, SIGNAL('clicked()'), self.delete_tags) self.connect(self.rename_button, SIGNAL('clicked()'), self.rename_tag) @@ -62,13 +72,11 @@ class TagListEditor(QDialog, Ui_TagListEditor): item.setText(self.item_before_editing.text()) return if item.text() != self.item_before_editing.text(): - if item.text() in self.all_tags.keys() or item.text() in self.to_rename.keys(): - error_dialog(self, _('Item already used'), - _('The item %s is already used.')%(item.text())).exec_() - item.setText(self.item_before_editing.text()) - return (id,ign) = self.item_before_editing.data(Qt.UserRole).toInt() - self.to_rename[item.text()] = id + if item.text() not in self.to_rename: + self.to_rename[item.text()] = [id] + else: + self.to_rename[item.text()].append(id) def rename_tag(self): item = self.available_tags.currentItem() @@ -99,30 +107,3 @@ class TagListEditor(QDialog, Ui_TagListEditor): self.to_delete.append(id) self.available_tags.takeItem(self.available_tags.row(item)) - def accept(self): - rename_func = None - if self.category == 'tags': - rename_func = self.db.rename_tag - delete_func = self.db.delete_tag_using_id - elif self.category == 'series': - rename_func = self.db.rename_series - delete_func = self.db.delete_series_using_id - elif self.category == 'publisher': - rename_func = self.db.rename_publisher - delete_func = self.db.delete_publisher_using_id - else: - rename_func = partial(self.db.rename_custom_item, label=self.cc_label) - delete_func = partial(self.db.delete_custom_item_using_id, label=self.cc_label) - - work_done = False - if rename_func: - for text in self.to_rename: - work_done = True - rename_func(id=self.to_rename[text], new_name=unicode(text)) - for item in self.to_delete: - work_done = True - delete_func(item) - if not work_done: - QDialog.reject(self) - else: - QDialog.accept(self) diff --git a/src/calibre/gui2/dialogs/user_profiles.py b/src/calibre/gui2/dialogs/user_profiles.py index 7b26fea0ae..16f5d383ed 100644 --- a/src/calibre/gui2/dialogs/user_profiles.py +++ b/src/calibre/gui2/dialogs/user_profiles.py @@ -3,13 +3,13 @@ __copyright__ = '2008, Kovid Goyal ' import time, os -from PyQt4.Qt import SIGNAL, QUrl, QDesktopServices, QAbstractListModel, Qt, \ +from PyQt4.Qt import SIGNAL, QUrl, QAbstractListModel, Qt, \ QVariant, QInputDialog from calibre.web.feeds.recipes import compile_recipe from calibre.web.feeds.news import AutomaticNewsRecipe from calibre.gui2.dialogs.user_profiles_ui import Ui_Dialog -from calibre.gui2 import error_dialog, question_dialog, \ +from calibre.gui2 import error_dialog, question_dialog, open_url, \ choose_files, ResizableDialog, NONE from calibre.gui2.widgets import PythonHighlighter from calibre.ptempfile import PersistentTemporaryFile @@ -135,7 +135,7 @@ class UserProfiles(ResizableDialog, Ui_Dialog): url.addQueryItem('subject', subject) url.addQueryItem('body', body) url.addQueryItem('attachment', pt.name) - QDesktopServices.openUrl(url) + open_url(url) def current_changed(self, current, previous): diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index 699978a92f..8aaeab3a8a 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -5,22 +5,22 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import functools +import functools, sys, os from PyQt4.Qt import QMenu, Qt, pyqtSignal, QToolButton, QIcon, QStackedWidget, \ - QSize, QSizePolicy, QStatusBar + QSize, QSizePolicy, QStatusBar, QUrl, QLabel, QFont from calibre.utils.config import prefs from calibre.ebooks import BOOK_EXTENSIONS -from calibre.constants import isosx, __appname__, preferred_encoding -from calibre.gui2 import config, is_widescreen +from calibre.constants import isosx, __appname__, preferred_encoding, \ + __version__ +from calibre.gui2 import config, is_widescreen, open_url from calibre.gui2.library.views import BooksView, DeviceBooksView from calibre.gui2.widgets import Splitter from calibre.gui2.tag_view import TagBrowserWidget from calibre.gui2.book_details import BookDetails from calibre.gui2.notify import get_notifier - _keep_refs = [] def partial(*args, **kwargs): @@ -48,6 +48,7 @@ class SaveMenu(QMenu): # {{{ class ToolbarMixin(object): # {{{ def __init__(self): + self.action_help.triggered.connect(self.show_help) md = QMenu() md.addAction(_('Edit metadata individually'), partial(self.edit_metadata, False, bulk=False)) @@ -56,7 +57,8 @@ class ToolbarMixin(object): # {{{ partial(self.edit_metadata, False, bulk=True)) md.addSeparator() md.addAction(_('Download metadata and covers'), - partial(self.download_metadata, False, covers=True)) + partial(self.download_metadata, False, covers=True), + Qt.ControlModifier+Qt.Key_D) md.addAction(_('Download only metadata'), partial(self.download_metadata, False, covers=False)) md.addAction(_('Download only covers'), @@ -181,9 +183,13 @@ class ToolbarMixin(object): # {{{ for ch in self.tool_bar.children(): if isinstance(ch, QToolButton): ch.setCursor(Qt.PointingHandCursor) + ch.setStatusTip(ch.toolTip()) self.tool_bar.contextMenuEvent = self.no_op + def show_help(self, *args): + open_url(QUrl('http://calibre-ebook.com/user_manual')) + def read_toolbar_settings(self): self.tool_bar.setIconSize(config['toolbar_icon_size']) self.tool_bar.setToolButtonStyle( @@ -218,20 +224,38 @@ class LibraryViewMixin(object): # {{{ partial(self.show_similar_books, 'tag')) self.action_books_by_this_publisher.triggered.connect( partial(self.show_similar_books, 'publisher')) + self.library_view.set_context_menu(self.action_edit, self.action_sync, self.action_convert, self.action_view, self.action_save, self.action_open_containing_folder, self.action_show_book_details, self.action_del, + add_to_library = None, + edit_device_collections=None, similar_menu=similar_menu) + add_to_library = (_('Add books to library'), self.add_books_from_device) + edit_device_collections = (_('Manage collections'), + partial(self.edit_device_collections, oncard=None)) self.memory_view.set_context_menu(None, None, None, - self.action_view, self.action_save, None, None, self.action_del) + self.action_view, self.action_save, None, None, self.action_del, + add_to_library=add_to_library, + edit_device_collections=edit_device_collections) + + edit_device_collections = (_('Manage collections'), + partial(self.edit_device_collections, oncard='carda')) self.card_a_view.set_context_menu(None, None, None, - self.action_view, self.action_save, None, None, self.action_del) + self.action_view, self.action_save, None, None, self.action_del, + add_to_library=add_to_library, + edit_device_collections=edit_device_collections) + + edit_device_collections = (_('Manage collections'), + partial(self.edit_device_collections, oncard='cardb')) self.card_b_view.set_context_menu(None, None, None, - self.action_view, self.action_save, None, None, self.action_del) + self.action_view, self.action_save, None, None, self.action_del, + add_to_library=add_to_library, + edit_device_collections=edit_device_collections) self.library_view.files_dropped.connect(self.files_dropped, type=Qt.QueuedConnection) for func, args in [ @@ -244,9 +268,14 @@ class LibraryViewMixin(object): # {{{ getattr(view, func)(*args) self.memory_view.connect_dirtied_signal(self.upload_booklists) + self.memory_view.connect_upload_collections_signal( + func=self.upload_collections, oncard=None) self.card_a_view.connect_dirtied_signal(self.upload_booklists) + self.card_a_view.connect_upload_collections_signal( + func=self.upload_collections, oncard='carda') self.card_b_view.connect_dirtied_signal(self.upload_booklists) - + self.card_b_view.connect_upload_collections_signal( + func=self.upload_collections, oncard='cardb') self.book_on_device(None, reset=True) db.set_book_on_device_func(self.book_on_device) self.library_view.set_database(db) @@ -338,12 +367,50 @@ class Stack(QStackedWidget): # {{{ class StatusBar(QStatusBar): # {{{ + def __init__(self, parent=None): + QStatusBar.__init__(self, parent) + self.default_message = __appname__ + ' ' + _('version') + ' ' + \ + self.get_version() + ' ' + _('created by Kovid Goyal') + self.device_string = '' + self.update_label = QLabel('') + self.update_label.setOpenExternalLinks(True) + self.addPermanentWidget(self.update_label) + self.update_label.setVisible(False) + self._font = QFont() + self._font.setBold(True) + self.setFont(self._font) + 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.clearMessage() + + def device_disconnected(self): + self.device_string = '' + self.clearMessage() + + def new_version_available(self, ver, url): + msg = (u'%s: %s') % ( + _('Update found'), url, ver) + self.update_label.setText(msg) + self.update_label.setCursor(Qt.PointingHandCursor) + self.update_label.setVisible(True) + + def get_version(self): + dv = os.environ.get('CALIBRE_DEVELOP_FROM', None) + v = __version__ + if getattr(sys, 'frozen', False) and dv and os.path.abspath(dv) in sys.path: + v += '*' + return v def show_message(self, msg, timeout=0): - QStatusBar.showMessage(self, msg, timeout) + self.showMessage(msg, timeout) if self.notifier is not None and not config['disable_tray_notification']: if isosx and isinstance(msg, unicode): try: @@ -353,7 +420,15 @@ class StatusBar(QStatusBar): # {{{ self.notifier(msg) def clear_message(self): - QStatusBar.clearMessage(self) + self.clearMessage() + + def message_changed(self, msg): + if not msg or msg.isEmpty() or msg.isNull(): + extra = '' + if self.device_string: + extra = ' ..::.. ' + self.device_string + self.showMessage(self.default_message + extra) + # }}} diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index ca1afbe6b4..3bbab52b33 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -16,11 +16,13 @@ from calibre.gui2 import NONE, config, UNDEFINED_QDATE from calibre.utils.pyparsing import ParseException from calibre.ebooks.metadata import fmt_sidx, authors_to_string, string_to_authors from calibre.ptempfile import PersistentTemporaryFile -from calibre.utils.config import tweaks +from calibre.utils.config import tweaks, prefs from calibre.utils.date import dt_factory, qt_to_dt, isoformat from calibre.ebooks.metadata.meta import set_metadata as _set_metadata from calibre.utils.search_query_parser import SearchQueryParser -from calibre.library.caches import _match, CONTAINS_MATCH, EQUALS_MATCH, REGEXP_MATCH +from calibre.library.caches import _match, CONTAINS_MATCH, EQUALS_MATCH, \ + REGEXP_MATCH, CoverCache +from calibre.library.cli import parse_series_string from calibre import strftime, isbytestring, prepare_string_for_xml from calibre.constants import filesystem_encoding from calibre.gui2.library import DEFAULT_SORT @@ -42,6 +44,14 @@ class FormatPath(unicode): ans.deleted_after_upload = False return ans +_default_image = None + +def default_image(): + global _default_image + if _default_image is None: + _default_image = QImage(I('default_cover.svg')) + return _default_image + class BooksModel(QAbstractTableModel): # {{{ about_to_be_sorted = pyqtSignal(object, name='aboutToBeSorted') @@ -70,7 +80,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.book_on_device = None self.editable_cols = ['title', 'authors', 'rating', 'publisher', 'tags', 'series', 'timestamp', 'pubdate'] - self.default_image = QImage(I('book.svg')) + self.default_image = default_image() self.sorted_on = DEFAULT_SORT self.sort_history = [self.sorted_on] self.last_search = '' # The last search performed on this model @@ -140,21 +150,22 @@ class BooksModel(QAbstractTableModel): # {{{ self.build_data_convertors() self.reset() self.database_changed.emit(db) + if self.cover_cache is not None: + self.cover_cache.stop() + self.cover_cache = CoverCache(db) + self.cover_cache.start() + def refresh_cover(event, ids): + if event == 'cover' and self.cover_cache is not None: + self.cover_cache.refresh(ids) + db.add_listener(refresh_cover) def refresh_ids(self, ids, current_row=-1): rows = self.db.refresh_ids(ids) if rows: self.refresh_rows(rows, current_row=current_row) - def refresh_cover_cache(self, ids): - if self.cover_cache: - self.cover_cache.refresh(ids) - def refresh_rows(self, rows, current_row=-1): for row in rows: - if self.cover_cache: - id = self.db.id(row) - self.cover_cache.refresh([id]) if row == current_row: self.new_bookdisplay_data.emit( self.get_book_display_info(row)) @@ -317,7 +328,7 @@ class BooksModel(QAbstractTableModel): # {{{ def set_cache(self, idx): l, r = 0, self.count()-1 - if self.cover_cache: + if self.cover_cache is not None: l = max(l, idx-self.buffer_size) r = min(r, idx+self.buffer_size) k = min(r-idx, idx-l) @@ -481,15 +492,18 @@ class BooksModel(QAbstractTableModel): # {{{ def title(self, row_number): return self.db.title(row_number) + def rating(self, row_number): + ans = self.db.rating(row_number) + ans = ans/2 if ans else 0 + return int(ans) + def cover(self, row_number): data = None try: id = self.db.id(row_number) - if self.cover_cache: + if self.cover_cache is not None: img = self.cover_cache.cover(id) - if img: - if img.isNull(): - img = self.default_image + if not img.isNull(): return img if not data: data = self.db.cover(row_number) @@ -520,7 +534,7 @@ class BooksModel(QAbstractTableModel): # {{{ return QVariant(', '.join(sorted(tags.split(',')))) return None - def series(r, idx=-1, siix=-1): + def series_type(r, idx=-1, siix=-1): series = self.db.data[r][idx] if series: idx = fmt_sidx(self.db.data[r][siix]) @@ -591,7 +605,7 @@ class BooksModel(QAbstractTableModel): # {{{ idx=self.db.field_metadata['publisher']['rec_index'], mult=False), 'tags' : functools.partial(tags, idx=self.db.field_metadata['tags']['rec_index']), - 'series' : functools.partial(series, + 'series' : functools.partial(series_type, idx=self.db.field_metadata['series']['rec_index'], siix=self.db.field_metadata['series_index']['rec_index']), 'ondevice' : functools.partial(text_type, @@ -620,6 +634,9 @@ class BooksModel(QAbstractTableModel): # {{{ bool_cols_are_tristate=tweaks['bool_custom_columns_are_tristate'] == 'yes') elif datatype == 'rating': self.dc[col] = functools.partial(rating_type, idx=idx) + elif datatype == 'series': + self.dc[col] = functools.partial(series_type, idx=idx, + siix=self.db.field_metadata.cc_series_index_column_for(col)) else: print 'What type is this?', col, datatype # build a index column to data converter map, to remove the string lookup in the data loop @@ -681,6 +698,8 @@ class BooksModel(QAbstractTableModel): # {{{ def set_custom_column_data(self, row, colhead, value): typ = self.custom_columns[colhead]['datatype'] + label=self.db.field_metadata.key_to_label(colhead) + s_index = None if typ in ('text', 'comments'): val = unicode(value.toString()).strip() val = val if val else None @@ -702,9 +721,10 @@ class BooksModel(QAbstractTableModel): # {{{ if not val.isValid(): return False val = qt_to_dt(val, as_utc=False) - self.db.set_custom(self.db.id(row), val, - label=self.db.field_metadata.key_to_label(colhead), - num=None, append=False, notify=True) + elif typ == 'series': + val, s_index = parse_series_string(self.db, label, value.toString()) + self.db.set_custom(self.db.id(row), val, extra=s_index, + label=label, num=None, append=False, notify=True) return True def setData(self, index, value, role): @@ -850,6 +870,7 @@ class OnDeviceSearch(SearchQueryParser): # {{{ class DeviceBooksModel(BooksModel): # {{{ booklist_dirtied = pyqtSignal() + upload_collections = pyqtSignal(object) def __init__(self, parent): BooksModel.__init__(self, parent) @@ -919,12 +940,14 @@ class DeviceBooksModel(BooksModel): # {{{ flags = QAbstractTableModel.flags(self, index) if index.isValid() and self.editable: cname = self.column_map[index.column()] - if cname in ('title', 'authors') or (cname == 'collection' and \ - self.db.supports_collections()): + if cname in ('title', 'authors') or \ + (cname == 'collections' and \ + callable(getattr(self.db, 'supports_collections', None)) and \ + self.db.supports_collections() and \ + prefs['preserve_user_collections']): flags |= Qt.ItemIsEditable return flags - def search(self, text, reset=True): if not text or not text.strip(): self.map = list(range(len(self.db))) @@ -970,8 +993,8 @@ class DeviceBooksModel(BooksModel): # {{{ x, y = int(self.db[x].size), int(self.db[y].size) return cmp(x, y) def tagscmp(x, y): - x = ','.join(self.db[x].device_collections) - y = ','.join(self.db[y].device_collections) + x = ','.join(sorted(getattr(self.db[x], 'device_collections', []))).lower() + y = ','.join(sorted(getattr(self.db[y], 'device_collections', []))).lower() return cmp(x, y) def libcmp(x, y): x, y = self.db[x].in_library, self.db[y].in_library @@ -1072,6 +1095,36 @@ class DeviceBooksModel(BooksModel): # {{{ res.append((r,b)) return res + def get_collections_with_ids(self): + collections = set() + for book in self.db: + if book.device_collections is not None: + collections.update(set(book.device_collections)) + self.collections = [] + result = [] + for i,collection in enumerate(collections): + result.append((i, collection)) + self.collections.append(collection) + return result + + def rename_collection(self, old_id, new_name): + old_name = self.collections[old_id] + for book in self.db: + if book.device_collections is None: + continue + if old_name in book.device_collections: + book.device_collections.remove(old_name) + if new_name not in book.device_collections: + book.device_collections.append(new_name) + + def delete_collection_using_id(self, old_id): + old_name = self.collections[old_id] + for book in self.db: + if book.device_collections is None: + continue + if old_name in book.device_collections: + book.device_collections.remove(old_name) + def indices(self, rows): ''' Return indices into underlying database from rows @@ -1102,6 +1155,7 @@ class DeviceBooksModel(BooksModel): # {{{ elif cname == 'collections': tags = self.db[self.map[row]].device_collections if tags: + tags.sort(cmp=lambda x,y: cmp(x.lower(), y.lower())) return QVariant(', '.join(tags)) elif role == Qt.ToolTipRole and index.isValid(): if self.map[row] in self.indices_to_be_deleted(): @@ -1144,14 +1198,18 @@ class DeviceBooksModel(BooksModel): # {{{ return False val = unicode(value.toString()).strip() idx = self.map[row] + if cname == 'collections': + tags = [i.strip() for i in val.split(',')] + tags = [t for t in tags if t] + self.db[idx].device_collections = tags + self.dataChanged.emit(index, index) + self.upload_collections.emit(self.db) + return True + if cname == 'title' : self.db[idx].title = val elif cname == 'authors': self.db[idx].authors = string_to_authors(val) - elif cname == 'collections': - tags = [i.strip() for i in val.split(',')] - tags = [t for t in tags if t] - self.db[idx].device_collections = tags self.dataChanged.emit(index, index) self.booklist_dirtied.emit() done = True diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index ad26e50b0e..9d85dce075 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -15,7 +15,7 @@ from calibre.gui2.library.delegates import RatingDelegate, PubDateDelegate, \ TextDelegate, DateDelegate, TagsDelegate, CcTextDelegate, \ CcBoolDelegate, CcCommentsDelegate, CcDateDelegate from calibre.gui2.library.models import BooksModel, DeviceBooksModel -from calibre.utils.config import tweaks +from calibre.utils.config import tweaks, prefs from calibre.gui2 import error_dialog, gprefs from calibre.gui2.library import DEFAULT_SORT @@ -347,7 +347,7 @@ class BooksView(QTableView): # {{{ self.setItemDelegateForColumn(cm.index(colhead), delegate) elif cc['datatype'] == 'comments': self.setItemDelegateForColumn(cm.index(colhead), self.cc_comments_delegate) - elif cc['datatype'] == 'text': + elif cc['datatype'] in ('text', 'series'): if cc['is_multiple']: self.setItemDelegateForColumn(cm.index(colhead), self.tags_delegate) else: @@ -370,7 +370,9 @@ class BooksView(QTableView): # {{{ # Context Menu {{{ def set_context_menu(self, edit_metadata, send_to_device, convert, view, - save, open_folder, book_details, delete, similar_menu=None): + save, open_folder, book_details, delete, + similar_menu=None, add_to_library=None, + edit_device_collections=None): self.setContextMenuPolicy(Qt.DefaultContextMenu) self.context_menu = QMenu(self) if edit_metadata is not None: @@ -389,6 +391,13 @@ class BooksView(QTableView): # {{{ self.context_menu.addAction(book_details) if similar_menu is not None: self.context_menu.addMenu(similar_menu) + if add_to_library is not None: + func = partial(add_to_library[1], view=self) + self.context_menu.addAction(add_to_library[0], func) + if edit_device_collections is not None: + func = partial(edit_device_collections[1], view=self) + self.edit_collections_menu = \ + self.context_menu.addAction(edit_device_collections[0], func) def contextMenuEvent(self, event): self.context_menu.popup(event.globalPos()) @@ -490,6 +499,14 @@ class DeviceBooksView(BooksView): # {{{ self.setDragDropMode(self.NoDragDrop) self.setAcceptDrops(False) + def contextMenuEvent(self, event): + self.edit_collections_menu.setVisible( + callable(getattr(self._model.db, 'supports_collections', None)) and \ + self._model.db.supports_collections() and \ + prefs['preserve_user_collections']) + self.context_menu.popup(event.globalPos()) + event.accept() + def set_database(self, db): self._model.set_database(db) self.restore_state() @@ -501,6 +518,9 @@ class DeviceBooksView(BooksView): # {{{ def connect_dirtied_signal(self, slot): self._model.booklist_dirtied.connect(slot) + def connect_upload_collections_signal(self, func=None, oncard=None): + self._model.upload_collections.connect(partial(func, view=self, oncard=oncard)) + def dropEvent(self, *args): error_dialog(self, _('Not allowed'), _('Dropping onto a device is not supported. First add the book to the calibre library.')).exec_() diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index bd24af1619..ca896fc014 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -56,6 +56,8 @@ def init_qt(args): def get_default_library_path(): fname = _('Calibre Library') + if iswindows: + fname = 'Calibre Library' if isinstance(fname, unicode): try: fname = fname.encode(filesystem_encoding) diff --git a/src/calibre/gui2/main.ui b/src/calibre/gui2/main.ui index c863ff28f5..d89a451cda 100644 --- a/src/calibre/gui2/main.ui +++ b/src/calibre/gui2/main.ui @@ -96,10 +96,7 @@
- - - PointingHandCursor - + ... @@ -107,45 +104,13 @@ :/images/donate.svg:/images/donate.svg - - - 64 - 64 - - true - - - - - - 0 - 0 - - - - - 16777215 - 90 - - - - - - - Qt::RichText - - - true - - - - + @@ -259,7 +224,7 @@ - Choose saved search or enter name for new saved search + 15 @@ -353,6 +318,8 @@ + + @@ -544,6 +511,21 @@ Ctrl+P + + + + :/images/help.svg:/images/help.svg + + + Help + + + Browse the calibre User Manual + + + F1 + + @@ -561,6 +543,11 @@ QComboBox
calibre.gui2.search_box
+ + ThrobbingButton + QToolButton +
calibre/gui2/throbber.h
+
diff --git a/src/calibre/gui2/pictureflow/pictureflow.cpp b/src/calibre/gui2/pictureflow/pictureflow.cpp index e96fc00cc2..1c63ec410c 100644 --- a/src/calibre/gui2/pictureflow/pictureflow.cpp +++ b/src/calibre/gui2/pictureflow/pictureflow.cpp @@ -75,10 +75,6 @@ #include -// uncomment this to enable bilinear filtering for texture mapping -// gives much better rendering, at the cost of memory space -// #define PICTUREFLOW_BILINEAR_FILTER - // for fixed-point arithmetic, we need minimum 32-bit long // long long (64-bit) might be useful for multiplication and division typedef long PFreal; @@ -88,6 +84,7 @@ typedef unsigned short QRgb565; #define REFLECTION_FACTOR 1.5 #define MAX(x, y) ((x > y) ? x : y) +#define MIN(x, y) ((x < y) ? x : y) #define RGB565_RED_MASK 0xF800 #define RGB565_GREEN_MASK 0x07E0 @@ -376,7 +373,6 @@ private: int slideWidth; int slideHeight; int fontSize; - int zoom; int queueLength; int centerIndex; @@ -401,6 +397,7 @@ private: void recalc(int w, int h); QRect renderSlide(const SlideInfo &slide, int alpha=256, int col1=-1, int col=-1); + QRect renderCenterSlide(const SlideInfo &slide); QImage* surface(int slideIndex); void triggerRender(); void resetSlides(); @@ -414,7 +411,6 @@ PictureFlowPrivate::PictureFlowPrivate(PictureFlow* w, int queueLength_) slideWidth = 200; slideHeight = 200; fontSize = 10; - zoom = 100; centerIndex = 0; queueLength = queueLength_; @@ -464,21 +460,6 @@ void PictureFlowPrivate::setSlideSize(QSize size) triggerRender(); } -int PictureFlowPrivate::zoomFactor() const -{ - return zoom; -} - -void PictureFlowPrivate::setZoomFactor(int z) -{ - if(z <= 0) - return; - - zoom = z; - recalc(buffer.width(), buffer.height()); - triggerRender(); -} - QImage PictureFlowPrivate::slide(int index) const { return slideImages->image(index); @@ -496,6 +477,7 @@ int PictureFlowPrivate::currentSlide() const void PictureFlowPrivate::setCurrentSlide(int index) { + animateTimer.stop(); step = 0; centerIndex = qBound(index, 0, slideImages->count()-1); target = centerIndex; @@ -553,7 +535,8 @@ void PictureFlowPrivate::resize(int w, int h) if (w < 10) w = 10; if (h < 10) h = 10; slideHeight = int(float(h)/REFLECTION_FACTOR); - slideWidth = int(float(slideHeight) * 2/3.); + slideWidth = int(float(slideHeight) * 3./4.); + //qDebug() << slideHeight << "x" << slideWidth; fontSize = MAX(int(h/15.), 12); recalc(w, h); resetSlides(); @@ -594,17 +577,12 @@ void PictureFlowPrivate::resetSlides() } } -#define BILINEAR_STRETCH_HOR 4 -#define BILINEAR_STRETCH_VER 4 - static QImage prepareSurface(QImage img, int w, int h) { - Qt::TransformationMode mode = Qt::SmoothTransformation; - img = img.scaled(w, h, Qt::IgnoreAspectRatio, mode); + img = img.scaled(w, h, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - // slightly larger, to accomodate for the reflection + // slightly larger, to accommodate for the reflection int hs = int(h * REFLECTION_FACTOR); - int hofs = 0; // offscreen buffer: black is sweet QImage result(hs, w, QImage::Format_RGB16); @@ -615,29 +593,22 @@ static QImage prepareSurface(QImage img, int w, int h) // (and much better and faster to work row-wise, i.e in one scanline) for(int x = 0; x < w; x++) for(int y = 0; y < h; y++) - result.setPixel(hofs + y, x, img.pixel(x, y)); + result.setPixel(y, x, img.pixel(x, y)); // create the reflection - int ht = hs - h - hofs; - int hte = ht; + int ht = hs - h; for(int x = 0; x < w; x++) for(int y = 0; y < ht; y++) { QRgb color = img.pixel(x, img.height()-y-1); //QRgb565 color = img.scanLine(img.height()-y-1) + x*sizeof(QRgb565); //img.pixel(x, img.height()-y-1); int a = qAlpha(color); - int r = qRed(color) * a / 256 * (hte - y) / hte * 3/5; - int g = qGreen(color) * a / 256 * (hte - y) / hte * 3/5; - int b = qBlue(color) * a / 256 * (hte - y) / hte * 3/5; - result.setPixel(h+hofs+y, x, qRgb(r, g, b)); + int r = qRed(color) * a / 256 * (ht - y) / ht * 3/5; + int g = qGreen(color) * a / 256 * (ht - y) / ht * 3/5; + int b = qBlue(color) * a / 256 * (ht - y) / ht * 3/5; + result.setPixel(h+y, x, qRgb(r, g, b)); } -#ifdef PICTUREFLOW_BILINEAR_FILTER - int hh = BILINEAR_STRETCH_VER*hs; - int ww = BILINEAR_STRETCH_HOR*w; - result = result.scaled(hh, ww, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); -#endif - return result; } @@ -698,8 +669,12 @@ void PictureFlowPrivate::render() int nleft = leftSlides.count(); int nright = rightSlides.count(); + QRect r; - QRect r = renderSlide(centerSlide); + if (step == 0) + r = renderCenterSlide(centerSlide); + else + r = renderSlide(centerSlide); int c1 = r.left(); int c2 = r.right(); @@ -731,9 +706,12 @@ void PictureFlowPrivate::render() painter.setPen(Qt::white); //painter.setPen(QColor(255,255,255,127)); - if (centerIndex < slideCount() && centerIndex > -1) - painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2-fontSize*3), + if (centerIndex < slideCount() && centerIndex > -1) { + painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2-fontSize*4), Qt::AlignCenter, slideImages->caption(centerIndex)); + painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2-fontSize*2), + Qt::AlignCenter, slideImages->subtitle(centerIndex)); + } painter.end(); @@ -784,15 +762,22 @@ void PictureFlowPrivate::render() int sc = slideCount(); painter.setPen(QColor(255,255,255, (255-fade) )); - if (leftTextIndex < sc && leftTextIndex > -1) - painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2 - fontSize*3), + if (leftTextIndex < sc && leftTextIndex > -1) { + painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2 - fontSize*4), Qt::AlignCenter, slideImages->caption(leftTextIndex)); + painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2 - fontSize*2), + Qt::AlignCenter, slideImages->subtitle(leftTextIndex)); + + } painter.setPen(QColor(255,255,255, fade)); - if (leftTextIndex+1 < sc && leftTextIndex > -2) - painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2 - fontSize*3), + if (leftTextIndex+1 < sc && leftTextIndex > -2) { + painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2 - fontSize*4), Qt::AlignCenter, slideImages->caption(leftTextIndex+1)); + painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2 - fontSize*2), + Qt::AlignCenter, slideImages->subtitle(leftTextIndex+1)); + } painter.end(); } @@ -812,7 +797,31 @@ static inline uint BYTE_MUL_RGB16_32(uint x, uint a) { return t; } +QRect PictureFlowPrivate::renderCenterSlide(const SlideInfo &slide) { + QImage* src = surface(slide.slideIndex); + if(!src) + return QRect(); + int sw = src->height(); + int sh = src->width(); + int h = buffer.height(); + int srcoff = 0; + int left = buffer.width()/2 - sw/2; + if (left < 0) { + srcoff = -left; + sw += left; + left = 0; + } + QRect rect(left, 0, sw, h-1); + int xcon = MIN(h-1, sh-1); + int ycon = MIN(sw, buffer.width() - left); + + for(int x = 0; x < xcon; x++) + for(int y = 0; y < ycon; y++) + buffer.setPixel(left + y, 1+x, src->pixel(x, srcoff+y)); + + return rect; +} // Renders a slide to offscreen buffer. Returns a rect of the rendered area. // alpha=256 means normal, alpha=0 is fully black, alpha=128 half transparent // col1 and col2 limit the column for rendering. @@ -825,13 +834,8 @@ int col1, int col2) QRect rect(0, 0, 0, 0); -#ifdef PICTUREFLOW_BILINEAR_FILTER - int sw = src->height() / BILINEAR_STRETCH_HOR; - int sh = src->width() / BILINEAR_STRETCH_VER; -#else int sw = src->height(); int sh = src->width(); -#endif int h = buffer.height(); int w = buffer.width(); @@ -847,7 +851,7 @@ int col1, int col2) col1 = qMin(col1, w-1); col2 = qMin(col2, w-1); - int distance = h * 100 / zoom; + int distance = h; PFreal sdx = fcos(slide.angle); PFreal sdy = fsin(slide.angle); PFreal xs = slide.cx - slideWidth * sdx/2; @@ -877,15 +881,9 @@ int col1, int col2) PFreal hitx = fmul(dist, rays[x]); PFreal hitdist = fdiv(hitx - slide.cx, sdx); -#ifdef PICTUREFLOW_BILINEAR_FILTER - int column = sw*BILINEAR_STRETCH_HOR/2 + (hitdist*BILINEAR_STRETCH_HOR >> PFREAL_SHIFT); - if(column >= sw*BILINEAR_STRETCH_HOR) - break; -#else int column = sw/2 + (hitdist >> PFREAL_SHIFT); if(column >= sw) break; -#endif if(column < 0) continue; @@ -900,13 +898,8 @@ int col1, int col2) QRgb565* pixel2 = (QRgb565*)(buffer.scanLine(y2)) + x; int pixelstep = pixel2 - pixel1; -#ifdef PICTUREFLOW_BILINEAR_FILTER - int center = (sh*BILINEAR_STRETCH_VER/2); - int dy = dist*BILINEAR_STRETCH_VER / h; -#else int center = sh/2; int dy = dist / h; -#endif int p1 = center*PFREAL_ONE - dy/2; int p2 = center*PFREAL_ONE + dy/2; @@ -1154,16 +1147,6 @@ void PictureFlow::setSlideSize(QSize size) d->setSlideSize(size); } -int PictureFlow::zoomFactor() const -{ - return d->zoomFactor(); -} - -void PictureFlow::setZoomFactor(int z) -{ - d->setZoomFactor(z); -} - QImage PictureFlow::slide(int index) const { return d->slide(index); @@ -1399,5 +1382,6 @@ void PictureFlow::emitcurrentChanged(int index) { emit currentChanged(index); } int FlowImages::count() { return 0; } QImage FlowImages::image(int index) { index=0; return QImage(); } QString FlowImages::caption(int index) {index=0; return QString(); } +QString FlowImages::subtitle(int index) {index=0; return QString(); } // }}} diff --git a/src/calibre/gui2/pictureflow/pictureflow.h b/src/calibre/gui2/pictureflow/pictureflow.h index 8cce025180..f2c2c947e6 100644 --- a/src/calibre/gui2/pictureflow/pictureflow.h +++ b/src/calibre/gui2/pictureflow/pictureflow.h @@ -67,6 +67,7 @@ public: virtual int count(); virtual QImage image(int index); virtual QString caption(int index); + virtual QString subtitle(int index); signals: void dataChanged(); @@ -91,7 +92,6 @@ Q_OBJECT Q_PROPERTY(int currentSlide READ currentSlide WRITE setCurrentSlide) Q_PROPERTY(QSize slideSize READ slideSize WRITE setSlideSize) - Q_PROPERTY(int zoomFactor READ zoomFactor WRITE setZoomFactor) public: /*! @@ -120,16 +120,6 @@ public: */ void setSlideSize(QSize size); - /*! - Sets the zoom factor (in percent). - */ - void setZoomFactor(int zoom); - - /*! - Returns the zoom factor (in percent). - */ - int zoomFactor() const; - /*! Clears any caches held to free up memory */ diff --git a/src/calibre/gui2/pictureflow/pictureflow.sip b/src/calibre/gui2/pictureflow/pictureflow.sip index 9202dd8ad5..f05f0ee3d1 100644 --- a/src/calibre/gui2/pictureflow/pictureflow.sip +++ b/src/calibre/gui2/pictureflow/pictureflow.sip @@ -16,6 +16,7 @@ public: virtual int count(); virtual QImage image(int index); virtual QString caption(int index); + virtual QString subtitle(int index); signals: void dataChanged(); @@ -40,10 +41,6 @@ public : void setSlideSize(QSize size); - void setZoomFactor(int zoom); - - int zoomFactor() const; - void clearCaches(); virtual QImage slide(int index) const; diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 35bf7374a0..dd7d0a63a0 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -6,6 +6,8 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' +import re + from PyQt4.Qt import QComboBox, Qt, QLineEdit, QStringList, pyqtSlot, \ pyqtSignal, SIGNAL, QObject, QDialog, QCompleter, \ QAction, QKeySequence @@ -56,7 +58,8 @@ class SearchBox2(QComboBox): To use this class: * Call initialize() - * Connect to the search() and cleared() signals from this widget + * Connect to the search() and cleared() signals from this widget. + * Connect to the cleared() signal to know when the box content changes * Call search_done() after every search is complete * Use clear() to clear back to the help message ''' @@ -75,6 +78,7 @@ class SearchBox2(QComboBox): type=Qt.DirectConnection) self.line_edit.mouse_released.connect(self.mouse_released, type=Qt.DirectConnection) + self.activated.connect(self.history_selected) self.setEditable(True) self.help_state = False self.as_you_type = True @@ -139,6 +143,9 @@ class SearchBox2(QComboBox): def key_pressed(self, event): self.normalize_state() + if self._in_a_search: + self.emit(SIGNAL('changed()')) + self._in_a_search = False if event.key() in (Qt.Key_Return, Qt.Key_Enter): self.do_search() self.timer = self.startTimer(self.__class__.INTERVAL) @@ -154,6 +161,10 @@ class SearchBox2(QComboBox): self.timer = None self.do_search() + def history_selected(self, text): + self.emit(SIGNAL('changed()')) + self.do_search() + @property def smart_text(self): text = unicode(self.currentText()).strip() @@ -345,6 +356,7 @@ class SearchBoxMixin(object): self.search.initialize('main_search_history', colorize=True, help_text=_('Search (For Advanced Search click the button to the left)')) self.connect(self.search, SIGNAL('cleared()'), self.search_box_cleared) + self.connect(self.search, SIGNAL('changed()'), self.search_box_changed) self.connect(self.clear_button, SIGNAL('clicked()'), self.search.clear) QObject.connect(self.advanced_search_button, SIGNAL('clicked(bool)'), self.do_advanced_search) @@ -358,12 +370,19 @@ class SearchBoxMixin(object): self.action_focus_search.triggered.connect(lambda x: self.search.setFocus(Qt.OtherFocusReason)) self.addAction(self.action_focus_search) + self.search.setStatusTip(re.sub(r'<\w+>', ' ', + unicode(self.search.toolTip()))) + self.advanced_search_button.setStatusTip(self.advanced_search_button.toolTip()) + self.clear_button.setStatusTip(self.clear_button.toolTip()) def search_box_cleared(self): self.tags_view.clear() self.saved_search.clear_to_help() self.set_number_of_books_shown() + def search_box_changed(self): + self.tags_view.clear() + def do_advanced_search(self, *args): d = SearchDialog(self) if d.exec_() == QDialog.Accepted: @@ -383,6 +402,12 @@ class SavedSearchBoxMixin(object): self.saved_search.delete_search_button_clicked) self.connect(self.copy_search_button, SIGNAL('clicked()'), self.saved_search.copy_search_button_clicked) + self.saved_search.setToolTip( + _('Choose saved search or enter name for new saved search')) + self.saved_search.setStatusTip(self.saved_search.toolTip()) + for x in ('copy', 'save', 'delete'): + b = getattr(self, x+'_search_button') + b.setStatusTip(b.toolTip()) def saved_searches_changed(self): diff --git a/src/calibre/gui2/search_restriction_mixin.py b/src/calibre/gui2/search_restriction_mixin.py index 287c3b2fc2..3a71fa3de0 100644 --- a/src/calibre/gui2/search_restriction_mixin.py +++ b/src/calibre/gui2/search_restriction_mixin.py @@ -11,6 +11,7 @@ class SearchRestrictionMixin(object): self.library_view.model().count_changed_signal.connect(self.restriction_count_changed) self.search_restriction.setSizeAdjustPolicy(self.search_restriction.AdjustToMinimumContentsLengthWithIcon) self.search_restriction.setMinimumContentsLength(10) + self.search_restriction.setStatusTip(self.search_restriction.toolTip()) ''' Adding and deleting books while restricted creates a complexity. When added, diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index daea4e86ea..2a9fb129ac 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -15,6 +15,7 @@ from PyQt4.Qt import Qt, QTreeView, QApplication, pyqtSignal, \ QAbstractItemModel, QVariant, QModelIndex, QMenu, \ QPushButton, QWidget, QItemDelegate +from calibre.ebooks.metadata import title_sort from calibre.gui2 import config, NONE from calibre.utils.config import prefs from calibre.library.field_metadata import TagsIcons @@ -680,9 +681,50 @@ class TagBrowserMixin(object): # {{{ self.tags_view.recount() def do_tags_list_edit(self, tag, category): - d = TagListEditor(self, self.library_view.model().db, tag, category) + db=self.library_view.model().db + if category == 'tags': + result = db.get_tags_with_ids() + compare = (lambda x,y:cmp(x.lower(), y.lower())) + elif category == 'series': + result = db.get_series_with_ids() + compare = (lambda x,y:cmp(title_sort(x).lower(), title_sort(y).lower())) + elif category == 'publisher': + result = db.get_publishers_with_ids() + compare = (lambda x,y:cmp(x.lower(), y.lower())) + else: # should be a custom field + cc_label = None + if category in db.field_metadata: + cc_label = db.field_metadata[category]['label'] + result = self.db.get_custom_items_with_ids(label=cc_label) + else: + result = [] + compare = (lambda x,y:cmp(x.lower(), y.lower())) + + d = TagListEditor(self, tag_to_match=tag, data=result, compare=compare) d.exec_() if d.result() == d.Accepted: + to_rename = d.to_rename # dict of new text to old id + to_delete = d.to_delete # list of ids + rename_func = None + if category == 'tags': + rename_func = db.rename_tag + delete_func = db.delete_tag_using_id + elif category == 'series': + rename_func = db.rename_series + delete_func = db.delete_series_using_id + elif category == 'publisher': + rename_func = db.rename_publisher + delete_func = db.delete_publisher_using_id + else: + rename_func = partial(db.rename_custom_item, label=cc_label) + delete_func = partial(db.delete_custom_item_using_id, label=cc_label) + if rename_func: + for text in to_rename: + for old_id in to_rename[text]: + rename_func(old_id, new_name=unicode(text)) + for item in to_delete: + delete_func(item) + # Clean up everything, as information could have changed for many books. self.library_view.model().refresh() self.tags_view.set_new_model() @@ -726,6 +768,9 @@ class TagBrowserWidget(QWidget): # {{{ for x in (_('Sort by name'), _('Sort by popularity'), _('Sort by average rating')): parent.sort_by.addItem(x) + parent.sort_by.setToolTip( + _('Set the sort order for entries in the Tag Browser')) + parent.sort_by.setStatusTip(parent.sort_by.toolTip()) parent.sort_by.setCurrentIndex(0) self._layout.addWidget(parent.sort_by) @@ -734,9 +779,16 @@ class TagBrowserWidget(QWidget): # {{{ parent.tag_match.addItem(x) parent.tag_match.setCurrentIndex(0) self._layout.addWidget(parent.tag_match) + parent.tag_match.setToolTip( + _('When selecting multiple entries in the Tag Browser ' + 'match any or all of them')) + parent.tag_match.setStatusTip(parent.tag_match.toolTip()) parent.edit_categories = QPushButton(_('Manage &user categories'), parent) self._layout.addWidget(parent.edit_categories) + parent.edit_categories.setToolTip( + _('Add your own categories to the Tag Browser')) + parent.edit_categories.setStatusTip(parent.edit_categories.toolTip()) # }}} diff --git a/src/calibre/gui2/throbber.py b/src/calibre/gui2/throbber.py new file mode 100644 index 0000000000..99c899c9f3 --- /dev/null +++ b/src/calibre/gui2/throbber.py @@ -0,0 +1,70 @@ +#!/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 QToolButton, QSize, QPropertyAnimation, Qt, \ + QMetaObject + +from calibre.gui2 import config + +class ThrobbingButton(QToolButton): + + def __init__(self, *args): + QToolButton.__init__(self, *args) + self.animation = QPropertyAnimation(self, 'iconSize', self) + self.animation.setDuration(60/72.*1000) + self.animation.setLoopCount(4) + self.normal_icon_size = QSize(64, 64) + self.animation.valueChanged.connect(self.value_changed) + self.setCursor(Qt.PointingHandCursor) + self.animation.finished.connect(self.animation_finished) + + def set_normal_icon_size(self, w, h): + self.normal_icon_size = QSize(w, h) + self.setIconSize(self.normal_icon_size) + self.setMinimumSize(self.sizeHint()) + + def animation_finished(self): + self.setIconSize(self.normal_icon_size) + + def enterEvent(self, ev): + self.start_animation() + + def leaveEvent(self, ev): + self.stop_animation() + + def value_changed(self, val): + self.update() + + def start_animation(self): + if config['disable_animations']: return + if self.animation.state() != self.animation.Stopped or not self.isVisible(): + return + size = self.normal_icon_size.width() + smaller = int(0.7 * size) + self.animation.setStartValue(QSize(smaller, smaller)) + self.animation.setEndValue(self.normal_icon_size) + QMetaObject.invokeMethod(self.animation, 'start', Qt.QueuedConnection) + + def stop_animation(self): + self.animation.stop() + self.animation_finished() + + +if __name__ == '__main__': + from PyQt4.Qt import QApplication, QWidget, QHBoxLayout, QIcon + app = QApplication([]) + w = QWidget() + w.setLayout(QHBoxLayout()) + b = ThrobbingButton() + b.setIcon(QIcon(I('donate.svg'))) + w.layout().addWidget(b) + w.show() + b.set_normal_icon_size(64, 64) + b.start_animation() + + app.exec_() diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index 1f58f85383..9680b616e3 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -221,6 +221,8 @@ def fetch_scheduled_recipe(arg): if lf.get('base_font_size', 0.0) != 0.0: recs.append(('base_font_size', lf['base_font_size'], OptionRecommendation.HIGH)) + recs.append(('keep_ligatures', lf['keep_ligatures'], + OptionRecommendation.HIGH)) lr = load_defaults('lrf_output') if lr.get('header', False): diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 6452890883..80a7e6e004 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -12,18 +12,18 @@ __docformat__ = 'restructuredtext en' import collections, os, sys, textwrap, time from Queue import Queue, Empty from threading import Thread -from PyQt4.Qt import Qt, SIGNAL, QObject, QUrl, QTimer, \ +from PyQt4.Qt import Qt, SIGNAL, QObject, QTimer, \ QPixmap, QMenu, QIcon, pyqtSignal, \ - QDialog, QDesktopServices, \ + QDialog, \ QSystemTrayIcon, QApplication, QKeySequence, QAction, \ QMessageBox, QHelpEvent from calibre import prints, patheq -from calibre.constants import __version__, __appname__, isosx +from calibre.constants import __appname__, isosx from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config import prefs, dynamic from calibre.utils.ipc.server import Server -from calibre.gui2 import error_dialog, GetMetadata, \ +from calibre.gui2 import error_dialog, GetMetadata, open_local_file, \ gprefs, max_available_height, config, info_dialog from calibre.gui2.cover_flow import CoverFlowMixin from calibre.gui2.widgets import ProgressIndicator @@ -38,7 +38,6 @@ from calibre.gui2.dialogs.config import ConfigDialog from calibre.gui2.dialogs.book_info import BookInfo from calibre.library.database2 import LibraryDatabase2 -from calibre.library.caches import CoverCache from calibre.gui2.init import ToolbarMixin, LibraryViewMixin, LayoutMixin from calibre.gui2.search_box import SearchBoxMixin, SavedSearchBoxMixin from calibre.gui2.search_restriction_mixin import SearchRestrictionMixin @@ -138,6 +137,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ self.restriction_in_effect = False self.progress_indicator = ProgressIndicator(self) + self.progress_indicator.pos = (0, 20) self.verbose = opts.verbose self.get_metadata = GetMetadata() self.upload_memory = {} @@ -163,6 +163,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ self.donate_action = self.system_tray_menu.addAction( QIcon(I('donate.svg')), _('&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')) self.eject_action.setEnabled(False) @@ -202,18 +203,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ self.device_manager.umount_device) self.eject_action.triggered.connect(self.device_manager.umount_device) - ####################### Vanity ######################## - self.vanity_template = _('

For help see the: User Manual' - '
')%'http://calibre-ebook.com/user_manual' - dv = os.environ.get('CALIBRE_DEVELOP_FROM', None) - v = __version__ - if getattr(sys, 'frozen', False) and dv and os.path.abspath(dv) in sys.path: - v += '*' - self.vanity_template += _('%s: %s by Kovid Goyal ' - '%%(version)s
%%(device)s

')%(__appname__, v) - self.latest_version = ' ' - self.vanity.setText(self.vanity_template%dict(version=' ', device=' ')) - self.device_info = ' ' + #################### Update notification ################### UpdateMixin.__init__(self, opts) ####################### Setup Toolbar ##################### @@ -230,9 +220,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ if self.system_tray_icon.isVisible() and opts.start_in_tray: self.hide_windows() - self.cover_cache = CoverCache(self.library_path) - self.cover_cache.start() - self.library_view.model().cover_cache = self.cover_cache self.library_view.model().count_changed_signal.connect \ (self.location_view.count_changed) if not gprefs.get('quick_start_guide_added', False): @@ -294,6 +281,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ self.read_settings() self.finalize_layout() + self.donate_button.set_normal_icon_size(64, 64) + self.donate_button.start_animation() def resizeEvent(self, ev): MainWindow.resizeEvent(self, ev) @@ -410,9 +399,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ self.tags_view.set_new_model() # in case columns changed self.tags_view.recount() self.create_device_menu() - self.set_device_menu_items_state(bool(self.device_connected), - self.device_connected == 'folder') - + self.set_device_menu_items_state(bool(self.device_connected)) if not patheq(self.library_path, d.database_location): newloc = d.database_location move_library(self.library_path, newloc, self, @@ -473,6 +460,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ self.search_restriction.setEnabled(False) for action in list(self.delete_menu.actions())[1:]: action.setEnabled(False) + # Reset the view in case something changed while it was invisible + self.current_view().reset() self.set_number_of_books_shown() @@ -557,7 +546,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ ''' MSG = _('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.') + 'donating to support its development. Your donation helps ' + 'keep calibre development going.') HTML = u''' @@ -575,7 +565,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ pt = PersistentTemporaryFile('_donate.htm') pt.write(HTML.encode('utf-8')) pt.close() - QDesktopServices.openUrl(QUrl.fromLocalFile(pt.name)) + open_local_file(pt.name) def confirm_quit(self): @@ -606,9 +596,10 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ while self.spare_servers: self.spare_servers.pop().close() self.device_manager.keep_going = False - self.cover_cache.stop() + cc = self.library_view.model().cover_cache + if cc is not None: + cc.stop() self.hide_windows() - self.cover_cache.terminate() self.emailer.stop() try: try: diff --git a/src/calibre/gui2/update.py b/src/calibre/gui2/update.py index 9dcd4d9084..38612c46f2 100644 --- a/src/calibre/gui2/update.py +++ b/src/calibre/gui2/update.py @@ -3,13 +3,13 @@ __copyright__ = '2008, Kovid Goyal ' import traceback -from PyQt4.Qt import QThread, pyqtSignal, QDesktopServices, QUrl, Qt +from PyQt4.Qt import QThread, pyqtSignal, Qt, QUrl import mechanize from calibre.constants import __appname__, __version__, iswindows, isosx from calibre import browser from calibre.utils.config import prefs -from calibre.gui2 import config, dynamic, question_dialog +from calibre.gui2 import config, dynamic, question_dialog, open_url URL = 'http://status.calibre-ebook.com/latest' @@ -49,12 +49,8 @@ class UpdateMixin(object): def update_found(self, version): os = 'windows' if iswindows else 'osx' if isosx else 'linux' url = 'http://calibre-ebook.com/download_%s'%os - self.latest_version = '
' + _('' - 'Latest version: %s')%(url, version) - self.vanity.setText(self.vanity_template%\ - (dict(version=self.latest_version, - device=self.device_info))) - self.vanity.update() + self.status_bar.new_version_available(version, url) + if config.get('new_version_notification') and \ dynamic.get('update to version %s'%version, True): if question_dialog(self, _('Update available'), @@ -64,7 +60,7 @@ class UpdateMixin(object): 'ge?')%(__appname__, version)): url = 'http://calibre-ebook.com/download_'+\ ('windows' if iswindows else 'osx' if isosx else 'linux') - QDesktopServices.openUrl(QUrl(url)) + open_url(QUrl(url)) dynamic.set('update to version %s'%version, False) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index fca3586f9d..ec88c3f886 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -6,7 +6,7 @@ from functools import partial from threading import Thread from PyQt4.Qt import QApplication, Qt, QIcon, QTimer, SIGNAL, QByteArray, \ - QDesktopServices, QDoubleSpinBox, QLabel, QTextBrowser, \ + QDoubleSpinBox, QLabel, QTextBrowser, \ QPainter, QBrush, QColor, QStandardItemModel, QPalette, \ QStandardItem, QUrl, QRegExpValidator, QRegExp, QLineEdit, \ QToolButton, QMenu, QInputDialog, QAction, QKeySequence @@ -17,7 +17,7 @@ from calibre.gui2.viewer.bookmarkmanager import BookmarkManager from calibre.gui2.widgets import ProgressIndicator from calibre.gui2.main_window import MainWindow from calibre.gui2 import Application, ORG_NAME, APP_UID, choose_files, \ - info_dialog, error_dialog + info_dialog, error_dialog, open_url from calibre.ebooks.oeb.iterator import EbookIterator from calibre.ebooks import DRMError from calibre.constants import islinux, isfreebsd @@ -472,7 +472,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer): elif frag: self.view.scroll_to(frag) else: - QDesktopServices.openUrl(url) + open_url(url) def load_started(self): self.open_progress_indicator(_('Loading flow...')) diff --git a/src/calibre/gui2/viewer/main.ui b/src/calibre/gui2/viewer/main.ui index 9177f2713f..78d0d3b2da 100644 --- a/src/calibre/gui2/viewer/main.ui +++ b/src/calibre/gui2/viewer/main.ui @@ -243,7 +243,7 @@ - :/images/convert.svg:/images/convert.svg + :/images/edit_copy.svg:/images/edit_copy.svg Copy to clipboard diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index c32b79fb7c..d94d8e7292 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -13,7 +13,7 @@ from PyQt4.Qt import QListView, QIcon, QFont, QLabel, QListWidget, \ QRegExp, QSettings, QSize, QModelIndex, QSplitter, \ QAbstractButton, QPainter, QLineEdit, QComboBox, \ QMenu, QStringListModel, QCompleter, QStringList, \ - QTimer + QTimer, QRect from calibre.gui2 import NONE, error_dialog, pixmap_to_data, gprefs @@ -38,12 +38,16 @@ class ProgressIndicator(QWidget): self.status.setWordWrap(True) self.status.setAlignment(Qt.AlignHCenter|Qt.AlignTop) self.setVisible(False) + self.pos = None def start(self, msg=''): view = self.parent() pwidth, pheight = view.size().width(), view.size().height() self.resize(pwidth, min(pheight, 250)) - self.move(0, (pheight-self.size().height())/2.) + if self.pos is None: + self.move(0, (pheight-self.size().height())/2.) + else: + self.move(self.pos[0], self.pos[1]) self.pi.resize(self.pi.sizeHint()) self.pi.move(int((self.size().width()-self.pi.size().width())/2.), 0) self.status.resize(self.size().width(), self.size().height()-self.pi.size().height()-10) @@ -146,10 +150,15 @@ class FormatList(QListWidget): return QListWidget.keyPressEvent(self, event) -class ImageView(QLabel): +class ImageView(QWidget): - MAX_WIDTH = 400 - MAX_HEIGHT = 300 + def __init__(self, parent=None): + QWidget.__init__(self, parent) + self._pixmap = QPixmap(self) + self.setMinimumSize(QSize(150, 200)) + self.setAcceptDrops(True) + + # Drag 'n drop {{{ DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS @classmethod @@ -186,13 +195,45 @@ class ImageView(QLabel): def dragMoveEvent(self, event): event.acceptProposedAction() + # }}} def setPixmap(self, pixmap): - QLabel.setPixmap(self, pixmap) - width, height = fit_image(pixmap.width(), pixmap.height(), self.MAX_WIDTH, self.MAX_HEIGHT)[1:] - self.setMaximumWidth(width) - self.setMaximumHeight(height) + if not isinstance(pixmap, QPixmap): + raise TypeError('Must use a QPixmap') + self._pixmap = pixmap + self.updateGeometry() + self.update() + def pixmap(self): + return self._pixmap + + def sizeHint(self): + if self._pixmap.isNull(): + return self.minimumSize() + return self._pixmap.size() + + def paintEvent(self, event): + QWidget.paintEvent(self, event) + pmap = self._pixmap + if pmap.isNull(): + return + w, h = pmap.width(), pmap.height() + cw, ch = self.rect().width(), self.rect().height() + scaled, nw, nh = fit_image(w, h, cw, ch) + if scaled: + pmap = pmap.scaled(nw, nh, Qt.IgnoreAspectRatio, + Qt.SmoothTransformation) + w, h = pmap.width(), pmap.height() + x = int(abs(cw - w)/2.) + y = int(abs(ch - h)/2.) + target = QRect(x, y, w, h) + p = QPainter(self) + p.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform) + p.drawPixmap(target, pmap) + p.end() + + + # Clipboard copy/paste # {{{ def contextMenuEvent(self, ev): cm = QMenu(self) copy = cm.addAction(_('Copy Image')) @@ -215,6 +256,7 @@ class ImageView(QLabel): self.setPixmap(pmap) self.emit(SIGNAL('cover_changed(PyQt_PyObject)'), pixmap_to_data(pmap)) + # }}} class LocationModel(QAbstractListModel): @@ -225,10 +267,10 @@ class LocationModel(QAbstractListModel): QVariant(QIcon(I('reader.svg'))), QVariant(QIcon(I('sd.svg'))), QVariant(QIcon(I('sd.svg')))] - self.text = [_('Library\n%d\nbooks'), - _('Reader\n%s\navailable'), - _('Card A\n%s\navailable'), - _('Card B\n%s\navailable')] + self.text = [_('Library\n%d books'), + _('Reader\n%s'), + _('Card A\n%s'), + _('Card B\n%s')] self.free = [-1, -1, -1] self.count = 0 self.highlight_row = 0 @@ -256,6 +298,14 @@ class LocationModel(QAbstractListModel): row = 3 return row + def get_tooltip(self, row, drow): + ans = self.tooltips[row] + if row > 0: + fs = self.free[drow-1] + if fs > -1: + ans += '\n\n%s '%(human_readable(fs)) + _('free') + return ans + def data(self, index, role): row = index.row() drow = self.get_device_row(row) @@ -266,8 +316,9 @@ class LocationModel(QAbstractListModel): data = QVariant(text) elif role == Qt.DecorationRole: data = self.icons[drow] - elif role == Qt.ToolTipRole: - data = QVariant(self.tooltips[drow]) + elif role in (Qt.ToolTipRole, Qt.StatusTipRole): + ans = self.get_tooltip(row, drow) + data = QVariant(ans) elif role == Qt.SizeHintRole: data = QVariant(QSize(155, 90)) elif role == Qt.FontRole: @@ -957,16 +1008,21 @@ class LayoutButton(QToolButton): self.splitter = splitter splitter.state_changed.connect(self.update_state) + self.setCursor(Qt.PointingHandCursor) def set_state_to_show(self, *args): self.setChecked(False) label =_('Show') self.setText(label + ' ' + self.label) + self.setToolTip(self.text()) + self.setStatusTip(self.text()) def set_state_to_hide(self, *args): self.setChecked(True) label = _('Hide') self.setText(label + ' ' + self.label) + self.setToolTip(self.text()) + self.setStatusTip(self.text()) def update_state(self, *args): if self.splitter.is_side_index_hidden: diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 57f9d0baaf..d46ae23d90 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -6,11 +6,13 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import collections, glob, os, re, itertools, functools +import re, itertools, functools from itertools import repeat from datetime import timedelta +from threading import Thread, RLock +from Queue import Queue, Empty -from PyQt4.Qt import QThread, QReadWriteLock, QImage, Qt +from PyQt4.Qt import QImage, Qt from calibre.utils.config import tweaks from calibre.utils.date import parse_date, now, UNDEFINED_DATE @@ -19,120 +21,73 @@ from calibre.utils.pyparsing import ParseException from calibre.ebooks.metadata import title_sort from calibre import fit_image -class CoverCache(QThread): +class CoverCache(Thread): - def __init__(self, library_path, parent=None): - QThread.__init__(self, parent) - self.library_path = library_path - self.id_map = None - self.id_map_lock = QReadWriteLock() - self.load_queue = collections.deque() - self.load_queue_lock = QReadWriteLock(QReadWriteLock.Recursive) - self.cache = {} - self.cache_lock = QReadWriteLock() - self.id_map_stale = True + def __init__(self, db): + Thread.__init__(self) + self.daemon = True + self.db = db + self.load_queue = Queue() self.keep_running = True - - def build_id_map(self): - self.id_map_lock.lockForWrite() - self.id_map = {} - for f in glob.glob(os.path.join(self.library_path, '*', '* (*)', 'cover.jpg')): - c = os.path.basename(os.path.dirname(f)) - try: - id = int(re.search(r'\((\d+)\)', c[c.rindex('('):]).group(1)) - self.id_map[id] = f - except: - continue - self.id_map_lock.unlock() - self.id_map_stale = False - - - def set_cache(self, ids): - self.cache_lock.lockForWrite() - already_loaded = set([]) - for id in self.cache.keys(): - if id in ids: - already_loaded.add(id) - else: - self.cache.pop(id) - self.cache_lock.unlock() - ids = [i for i in ids if i not in already_loaded] - self.load_queue_lock.lockForWrite() - self.load_queue = collections.deque(ids) - self.load_queue_lock.unlock() - - - def run(self): - while self.keep_running: - if self.id_map is None or self.id_map_stale: - self.build_id_map() - while True: # Load images from the load queue - self.load_queue_lock.lockForWrite() - try: - id = self.load_queue.popleft() - except IndexError: - break - finally: - self.load_queue_lock.unlock() - - self.cache_lock.lockForRead() - need = True - if id in self.cache.keys(): - need = False - self.cache_lock.unlock() - if not need: - continue - path = None - self.id_map_lock.lockForRead() - if id in self.id_map.keys(): - path = self.id_map[id] - else: - self.id_map_stale = True - self.id_map_lock.unlock() - if path and os.access(path, os.R_OK): - try: - img = QImage() - data = open(path, 'rb').read() - img.loadFromData(data) - if img.isNull(): - continue - scaled, nwidth, nheight = fit_image(img.width(), - img.height(), 600, 800) - if scaled: - img = img.scaled(nwidth, nheight, Qt.KeepAspectRatio, - Qt.SmoothTransformation) - except: - continue - self.cache_lock.lockForWrite() - self.cache[id] = img - self.cache_lock.unlock() - - self.sleep(1) + self.cache = {} + self.lock = RLock() + self.null_image = QImage() def stop(self): self.keep_running = False - def cover(self, id): - val = None - if self.cache_lock.tryLockForRead(50): - val = self.cache.get(id, None) - self.cache_lock.unlock() - return val + def _image_for_id(self, id_): + img = self.db.cover(id_, index_is_id=True, as_image=True) + if img is None: + img = QImage() + if not img.isNull(): + scaled, nwidth, nheight = fit_image(img.width(), + img.height(), 600, 800) + if scaled: + img = img.scaled(nwidth, nheight, Qt.KeepAspectRatio, + Qt.SmoothTransformation) + + return img + + def run(self): + while self.keep_running: + try: + id_ = self.load_queue.get(True, 1) + except Empty: + continue + try: + img = self._image_for_id(id_) + except: + import traceback + traceback.print_exc() + continue + with self.lock: + self.cache[id_] = img + + def set_cache(self, ids): + with self.lock: + already_loaded = set([]) + for id in self.cache.keys(): + if id in ids: + already_loaded.add(id) + else: + self.cache.pop(id) + for id_ in set(ids) - already_loaded: + self.load_queue.put(id_) + + def cover(self, id_): + with self.lock: + return self.cache.get(id_, self.null_image) def clear_cache(self): - self.cache_lock.lockForWrite() - self.cache = {} - self.cache_lock.unlock() + with self.lock: + self.cache = {} def refresh(self, ids): - self.cache_lock.lockForWrite() - for id in ids: - self.cache.pop(id, None) - self.cache_lock.unlock() - self.load_queue_lock.lockForWrite() - for id in ids: - self.load_queue.appendleft(id) - self.load_queue_lock.unlock() + with self.lock: + for id_ in ids: + self.cache.pop(id_, None) + self.load_queue.put(id_) ### Global utility function for get_match here and in gui2/library.py CONTAINS_MATCH = 0 @@ -341,8 +296,15 @@ class ResultCache(SearchQueryParser): cast = lambda x : float (x) adjust = lambda x: x + if len(query) > 1: + mult = query[-1:].lower() + mult = {'k':1024.,'m': 1024.**2, 'g': 1024.**3}.get(mult, 1.0) + if mult != 1.0: + query = query[:-1] + else: + mult = 1.0 try: - q = cast(query) + q = cast(query) * mult except: return matches @@ -401,7 +363,8 @@ class ResultCache(SearchQueryParser): for x in self.field_metadata: if len(self.field_metadata[x]['search_terms']): db_col[x] = self.field_metadata[x]['rec_index'] - if self.field_metadata[x]['datatype'] not in ['text', 'comments']: + if self.field_metadata[x]['datatype'] not in \ + ['text', 'comments', 'series']: exclude_fields.append(db_col[x]) col_datatype[db_col[x]] = self.field_metadata[x]['datatype'] is_multiple_cols[db_col[x]] = self.field_metadata[x]['is_multiple'] @@ -580,16 +543,18 @@ class ResultCache(SearchQueryParser): self.sort(field, ascending) self._map_filtered = list(self._map) - def seriescmp(self, x, y): - sidx = self.FIELD_MAP['series'] + def seriescmp(self, sidx, siidx, x, y, library_order=None): try: - ans = cmp(title_sort(self._data[x][sidx].lower()), - title_sort(self._data[y][sidx].lower())) + if library_order: + ans = cmp(title_sort(self._data[x][sidx].lower()), + title_sort(self._data[y][sidx].lower())) + else: + ans = cmp(self._data[x][sidx].lower(), + self._data[y][sidx].lower()) except AttributeError: # Some entries may be None ans = cmp(self._data[x][sidx], self._data[y][sidx]) if ans != 0: return ans - sidx = self.FIELD_MAP['series_index'] - return cmp(self._data[x][sidx], self._data[y][sidx]) + return cmp(self._data[x][siidx], self._data[y][siidx]) def cmp(self, loc, x, y, asstr=True, subsort=False): try: @@ -617,18 +582,27 @@ class ResultCache(SearchQueryParser): elif field == 'title': field = 'sort' elif field == 'authors': field = 'author_sort' as_string = field not in ('size', 'rating', 'timestamp') - if self.field_metadata[field]['is_custom']: - as_string = self.field_metadata[field]['datatype'] in ('comments', 'text') - field = self.field_metadata[field]['colnum'] if self.first_sort: subsort = True self.first_sort = False - fcmp = self.seriescmp \ - if field == 'series' and \ - tweaks['title_series_sorting'] == 'library_order' \ - else \ - functools.partial(self.cmp, self.FIELD_MAP[field], + if self.field_metadata[field]['is_custom']: + if self.field_metadata[field]['datatype'] == 'series': + fcmp = functools.partial(self.seriescmp, + self.field_metadata[field]['rec_index'], + self.field_metadata.cc_series_index_column_for(field), + library_order=tweaks['title_series_sorting'] == 'library_order') + else: + as_string = self.field_metadata[field]['datatype'] in ('comments', 'text') + field = self.field_metadata[field]['colnum'] + fcmp = functools.partial(self.cmp, self.FIELD_MAP[field], + subsort=subsort, asstr=as_string) + elif field == 'series': + fcmp = functools.partial(self.seriescmp, self.FIELD_MAP['series'], + self.FIELD_MAP['series_index'], + library_order=tweaks['title_series_sorting'] == 'library_order') + else: + fcmp = functools.partial(self.cmp, self.FIELD_MAP[field], subsort=subsort, asstr=as_string) self._map.sort(cmp=fcmp, reverse=not ascending) self._map_filtered = [id for id in self._map if id in self._map_filtered] diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 3f71c98238..058b879b55 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -7,11 +7,11 @@ __docformat__ = 'restructuredtext en' Command line interface to the calibre database. ''' -import sys, os, cStringIO +import sys, os, cStringIO, re from textwrap import TextWrapper from calibre import terminal_controller, preferred_encoding, prints -from calibre.utils.config import OptionParser, prefs +from calibre.utils.config import OptionParser, prefs, tweaks from calibre.ebooks.metadata.meta import get_metadata from calibre.library.database2 import LibraryDatabase2 from calibre.ebooks.metadata.opf2 import OPFCreator, OPF @@ -680,9 +680,31 @@ def command_catalog(args, dbpath): # end of GR additions +def parse_series_string(db, label, value): + val = unicode(value).strip() + s_index = None + pat = re.compile(r'\[([.0-9]+)\]') + match = pat.search(val) + if match is not None: + val = pat.sub('', val).strip() + s_index = float(match.group(1)) + elif val: + if tweaks['series_index_auto_increment'] == 'next': + s_index = db.get_next_cc_series_num_for(val, label=label) + else: + s_index = 1.0 + return val, s_index + def do_set_custom(db, col, id_, val, append): - db.set_custom(id_, val, label=col, append=append) - prints('Data set to: %r'%db.get_custom(id_, label=col, index_is_id=True)) + if db.custom_column_label_map[col]['datatype'] == 'series': + val, s_index = parse_series_string(db, col, val) + db.set_custom(id_, val, extra=s_index, label=col, append=append) + prints('Data set to: %r[%4.2f]'% + (db.get_custom(id_, label=col, index_is_id=True), + db.get_custom_extra(id_, label=col, index_is_id=True))) + else: + db.set_custom(id_, val, label=col, append=append) + prints('Data set to: %r'%db.get_custom(id_, label=col, index_is_id=True)) def set_custom_option_parser(): parser = get_parser(_( diff --git a/src/calibre/library/comments.py b/src/calibre/library/comments.py index 1898e78cbf..d4ed1908f5 100644 --- a/src/calibre/library/comments.py +++ b/src/calibre/library/comments.py @@ -8,9 +8,14 @@ __docformat__ = 'restructuredtext en' import re from calibre.constants import preferred_encoding -from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag, NavigableString +from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag, NavigableString, \ + CData, Comment, Declaration, ProcessingInstruction from calibre import prepare_string_for_xml +# Hackish - ignoring sentences ending or beginning in numbers to avoid +# confusion with decimal points. +lost_cr_pat = re.compile('([a-z])([\.\?!])([A-Z])') + def comments_to_html(comments): ''' Convert random comment text to normalized, xml-legal block of

s @@ -39,33 +44,27 @@ def comments_to_html(comments): if not isinstance(comments, unicode): comments = comments.decode(preferred_encoding, 'replace') - # Hackish - ignoring sentences ending or beginning in numbers to avoid - # confusion with decimal points. + if '<' not in comments: + comments = prepare_string_for_xml(comments) + parts = [u'

%s

'%x.replace(u'\n', u'
') + for x in comments.split('\n\n')] + return '\n'.join(parts) # Explode lost CRs to \n\n - for lost_cr in re.finditer('([a-z])([\.\?!])([A-Z])', comments): + for lost_cr in lost_cr_pat.finditer(comments): comments = comments.replace(lost_cr.group(), '%s%s\n\n%s' % (lost_cr.group(1), lost_cr.group(2), lost_cr.group(3))) + comments = comments.replace(u'\r', u'') # Convert \n\n to

s - if re.search('\n\n', comments): - soup = BeautifulSoup() - split_ps = comments.split(u'\n\n') - tsc = 0 - for p in split_ps: - pTag = Tag(soup,'p') - pTag.insert(0,p) - soup.insert(tsc,pTag) - tsc += 1 - comments = soup.renderContents(None) - + comments = comments.replace(u'\n\n', u'

') # Convert solo returns to
- comments = re.sub('[\r\n]','
', comments) - + comments = comments.replace(u'\n', '
') # Convert two hyphens to emdash - comments = re.sub('--', '—', comments) + comments = comments.replace('--', '—') + soup = BeautifulSoup(comments) result = BeautifulSoup() rtc = 0 @@ -80,35 +79,52 @@ def comments_to_html(comments): ptc = 0 pTag.insert(ptc,prepare_string_for_xml(token)) ptc += 1 - - elif token.name in ['br','b','i','em']: + elif type(token) in (CData, Comment, Declaration, + ProcessingInstruction): + continue + elif token.name in ['br', 'b', 'i', 'em', 'strong', 'span', 'font', 'a', + 'hr']: if not open_pTag: pTag = Tag(result,'p') open_pTag = True ptc = 0 pTag.insert(ptc, token) ptc += 1 - else: if open_pTag: result.insert(rtc, pTag) rtc += 1 open_pTag = False ptc = 0 - # Clean up NavigableStrings for xml - sub_tokens = list(token.contents) - for sub_token in sub_tokens: - if type(sub_token) is NavigableString: - sub_token.replaceWith(prepare_string_for_xml(sub_token)) result.insert(rtc, token) rtc += 1 if open_pTag: result.insert(rtc, pTag) - paras = result.findAll('p') - for p in paras: + for p in result.findAll('p'): p['class'] = 'description' + for t in result.findAll(text=True): + t.replaceWith(prepare_string_for_xml(unicode(t))) + return result.renderContents(encoding=None) +def test(): + for pat, val in [ + ('lineone\n\nlinetwo', + '

lineone

\n

linetwo

'), + ('a b&c\nf', '

a b&c;
f

'), + ('a b\n\ncd', '

a b

cd

'), + ]: + print + print 'Testing: %r'%pat + cval = comments_to_html(pat) + print 'Value: %r'%cval + if comments_to_html(pat) != val: + print 'FAILED' + break + +if __name__ == '__main__': + test() + diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index c0ba91e252..e039f5a817 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -8,6 +8,7 @@ __docformat__ = 'restructuredtext en' import json from functools import partial +from math import floor from calibre import prints from calibre.constants import preferred_encoding @@ -16,7 +17,7 @@ from calibre.utils.date import parse_date class CustomColumns(object): CUSTOM_DATA_TYPES = frozenset(['rating', 'text', 'comments', 'datetime', - 'int', 'float', 'bool']) + 'int', 'float', 'bool', 'series']) def custom_table_names(self, num): return 'custom_column_%d'%num, 'books_custom_column_%d_link'%num @@ -137,7 +138,8 @@ class CustomColumns(object): 'bool': adapt_bool, 'comments': lambda x,d: adapt_text(x, {'is_multiple':False}), 'datetime' : adapt_datetime, - 'text':adapt_text + 'text':adapt_text, + 'series':adapt_text } # Create Tag Browser categories for custom columns @@ -171,6 +173,19 @@ class CustomColumns(object): ans.sort(cmp=lambda x,y:cmp(x.lower(), y.lower())) return ans + def get_custom_extra(self, idx, label=None, num=None, index_is_id=False): + if label is not None: + data = self.custom_column_label_map[label] + if num is not None: + data = self.custom_column_num_map[num] + # add future datatypes with an extra column here + if data['datatype'] not in ['series']: + return None + ign,lt = self.custom_table_names(data['num']) + idx = idx if index_is_id else self.id(idx) + return self.conn.get('''SELECT extra FROM %s + WHERE book=?'''%lt, (idx,), all=False) + # convenience methods for tag editing def get_custom_items_with_ids(self, label=None, num=None): if label is not None: @@ -220,6 +235,28 @@ class CustomColumns(object): self.conn.commit() # end convenience methods + def get_next_cc_series_num_for(self, series, label=None, num=None): + if label is not None: + data = self.custom_column_label_map[label] + if num is not None: + data = self.custom_column_num_map[num] + if data['datatype'] != 'series': + return None + table, lt = self.custom_table_names(data['num']) + # get the id of the row containing the series string + series_id = self.conn.get('SELECT id from %s WHERE value=?'%table, + (series,), all=False) + if series_id is None: + return 1.0 + # get the label of the associated series number table + series_num = self.conn.get(''' + SELECT MAX({lt}.extra) FROM {lt} + WHERE {lt}.book IN (SELECT book FROM {lt} where value=?) + '''.format(lt=lt), (series_id,), all=False) + if series_num is None: + return 1.0 + return floor(series_num+1) + def all_custom(self, label=None, num=None): if label is not None: data = self.custom_column_label_map[label] @@ -271,9 +308,8 @@ class CustomColumns(object): self.conn.commit() return changed - - - def set_custom(self, id_, val, label=None, num=None, append=False, notify=True): + def set_custom(self, id_, val, label=None, num=None, + append=False, notify=True, extra=None): if label is not None: data = self.custom_column_label_map[label] if num is not None: @@ -317,10 +353,17 @@ class CustomColumns(object): 'INSERT INTO %s(value) VALUES(?)'%table, (x,)).lastrowid if not self.conn.get( 'SELECT book FROM %s WHERE book=? AND value=?'%lt, - (id_, xid), all=False): - self.conn.execute( - 'INSERT INTO %s(book, value) VALUES (?,?)'%lt, - (id_, xid)) + (id_, xid), all=False): + if data['datatype'] == 'series': + self.conn.execute( + '''INSERT INTO %s(book, value, extra) + VALUES (?,?,?)'''%lt, (id_, xid, extra)) + self.data.set(id_, self.FIELD_MAP[data['num']]+1, + extra, row_is_id=True) + else: + self.conn.execute( + '''INSERT INTO %s(book, value) + VALUES (?,?)'''%lt, (id_, xid)) self.conn.commit() nval = self.conn.get( 'SELECT custom_%s FROM meta2 WHERE id=?'%data['num'], @@ -370,6 +413,9 @@ class CustomColumns(object): {table} ON(link.value={table}.id) WHERE link.book=books.id) custom_{num} '''.format(query=query%table, lt=lt, table=table, num=data['num']) + if data['datatype'] == 'series': + line += ''',(SELECT extra FROM {lt} WHERE {lt}.book=books.id) + custom_index_{num}'''.format(lt=lt, num=data['num']) else: line = ''' (SELECT value FROM {table} WHERE book=books.id) custom_{num} @@ -393,7 +439,7 @@ class CustomColumns(object): if datatype in ('rating', 'int'): dt = 'INT' - elif datatype in ('text', 'comments'): + elif datatype in ('text', 'comments', 'series'): dt = 'TEXT' elif datatype in ('float',): dt = 'REAL' @@ -404,6 +450,10 @@ class CustomColumns(object): collate = 'COLLATE NOCASE' if dt == 'TEXT' else '' table, lt = self.custom_table_names(num) if normalized: + if datatype == 'series': + s_index = 'extra REAL,' + else: + s_index = '' lines = [ '''\ CREATE TABLE %s( @@ -419,8 +469,9 @@ class CustomColumns(object): id INTEGER PRIMARY KEY AUTOINCREMENT, book INTEGER NOT NULL, value INTEGER NOT NULL, + %s UNIQUE(book, value) - );'''%lt, + );'''%(lt, s_index), 'CREATE INDEX %s_aidx ON %s (value);'%(lt,lt), 'CREATE INDEX %s_bidx ON %s (book);'%(lt,lt), @@ -467,7 +518,8 @@ class CustomColumns(object): books_ratings_link as bl, ratings as r WHERE {lt}.value={table}.id and bl.book={lt}.book and - r.id = bl.rating and r.rating <> 0) avg_rating + r.id = bl.rating and r.rating <> 0) avg_rating, + value AS sort FROM {table}; CREATE VIEW tag_browser_filtered_{table} AS SELECT @@ -481,7 +533,8 @@ class CustomColumns(object): ratings as r WHERE {lt}.value={table}.id AND bl.book={lt}.book AND r.id = bl.rating AND r.rating <> 0 AND - books_list_filter(bl.book)) avg_rating + books_list_filter(bl.book)) avg_rating, + value AS sort FROM {table}; '''.format(lt=lt, table=table), diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index fe4aac12b5..1534d3ffbf 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,functools, traceback +import os, sys, shutil, cStringIO, glob, time, functools, traceback from itertools import repeat from math import floor @@ -126,7 +126,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.dbpath = os.path.join(library_path, 'metadata.db') self.dbpath = os.environ.get('CALIBRE_OVERRIDE_DATABASE_PATH', self.dbpath) - if isinstance(self.dbpath, unicode): + if isinstance(self.dbpath, unicode) and not iswindows: self.dbpath = self.dbpath.encode(filesystem_encoding) self.connect() @@ -237,6 +237,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.custom_column_num_map[col]['label'], base, prefer_custom=True) + if self.custom_column_num_map[col]['datatype'] == 'series': + # account for the series index column. Field_metadata knows that + # the series index is one larger than the series. If you change + # it here, be sure to change it there as well. + self.FIELD_MAP[str(col)+'_s_index'] = base = base+1 self.FIELD_MAP['cover'] = base+1 self.field_metadata.set_field_record_index('cover', base+1, prefer_custom=False) @@ -435,12 +440,20 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if os.access(path, os.R_OK): if as_path: return path - f = open(path, 'rb') + try: + f = open(path, 'rb') + except (IOError, OSError): + time.sleep(0.2) + f = open(path, 'rb') if as_image: img = QImage() img.loadFromData(f.read()) + f.close() return img - return f if as_file else f.read() + ans = f if as_file else f.read() + if ans is not f: + f.close() + return ans def get_metadata(self, idx, index_is_id=False, get_cover=False): ''' @@ -487,12 +500,18 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): path = os.path.join(self.library_path, self.path(id, index_is_id=True), 'cover.jpg') return os.access(path, os.R_OK) - def remove_cover(self, id): + def remove_cover(self, id, notify=True): path = os.path.join(self.library_path, self.path(id, index_is_id=True), 'cover.jpg') if os.path.exists(path): - os.remove(path) + try: + os.remove(path) + except (IOError, OSError): + time.sleep(0.2) + os.remove(path) + if notify: + self.notify('cover', [id]) - def set_cover(self, id, data): + def set_cover(self, id, data, notify=True): ''' Set the cover for this book. @@ -504,7 +523,13 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): else: if callable(getattr(data, 'read', None)): data = data.read() - save_cover_data_to(data, path) + try: + save_cover_data_to(data, path) + except (IOError, OSError): + time.sleep(0.2) + save_cover_data_to(data, path) + if notify: + self.notify('cover', [id]) def book_on_device(self, id): if callable(self.book_on_device_func): @@ -763,7 +788,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if datatype == 'rating': # eliminate the zero ratings line as well as count == 0 item_not_zero_func = (lambda x: x[1] > 0 and x[2] > 0) - formatter = (lambda x:u'\u2605'*int(round(x/2.))) + formatter = (lambda x:u'\u2605'*int(x/2)) elif category == 'authors': item_not_zero_func = (lambda x: x[2] > 0) # Clean up the authors strings to human-readable form @@ -777,6 +802,15 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): icon=icon, tooltip=tooltip) for r in data if item_not_zero_func(r)] + # Needed for legacy databases that have multiple ratings that + # map to n stars + for r in categories['rating']: + for x in categories['rating']: + if r.name == x.name and r.id != x.id: + r.count = r.count + x.count + categories['rating'].remove(x) + break + # We delayed computing the standard formats category because it does not # use a view, but is computed dynamically categories['formats'] = [] diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index 8cb5c9bdad..626683fee5 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -81,7 +81,7 @@ class FieldMetadata(dict): 'column':'name', 'link_column':'series', 'category_sort':'(title_sort(name))', - 'datatype':'text', + 'datatype':'series', 'is_multiple':None, 'kind':'field', 'name':_('Series'), @@ -253,7 +253,7 @@ class FieldMetadata(dict): 'is_multiple':None, 'kind':'field', 'name':None, - 'search_terms':[], + 'search_terms':['size'], 'is_custom':False, 'is_category':False}), ('timestamp', {'table':None, @@ -398,6 +398,8 @@ class FieldMetadata(dict): if val['is_category'] and val['kind'] in ('user', 'search'): del self._tb_cats[key] + def cc_series_index_column_for(self, key): + return self._tb_cats[key]['rec_index'] + 1 def add_user_category(self, label, name): if label in self._tb_cats: diff --git a/src/calibre/linux.py b/src/calibre/linux.py index 51711b5b0f..33e7c004f0 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -29,6 +29,7 @@ entry_points = { 'calibre-complete = calibre.utils.complete:main', 'pdfmanipulate = calibre.ebooks.pdf.manipulate.cli:main', 'fetch-ebook-metadata = calibre.ebooks.metadata.fetch:main', + 'epub-fix = calibre.ebooks.epub.fix.main:main', 'calibre-smtp = calibre.utils.smtp:main', ], 'gui_scripts' : [ @@ -180,6 +181,7 @@ class PostInstall: from calibre.ebooks.metadata.fetch import option_parser as fem_op from calibre.gui2.main import option_parser as guiop from calibre.utils.smtp import option_parser as smtp_op + from calibre.ebooks.epub.fix.main import option_parser as fix_op any_formats = ['epub', 'htm', 'html', 'xhtml', 'xhtm', 'rar', 'zip', 'txt', 'lit', 'rtf', 'pdf', 'prc', 'mobi', 'fb2', 'odt', 'lrf'] bc = os.path.join(os.path.dirname(self.opts.staging_sharedir), @@ -201,6 +203,7 @@ class PostInstall: f.write(opts_and_exts('ebook-viewer', viewer_op, any_formats)) f.write(opts_and_words('fetch-ebook-metadata', fem_op, [])) f.write(opts_and_words('calibre-smtp', smtp_op, [])) + f.write(opts_and_exts('epub-fix', fix_op, ['epub'])) f.write(textwrap.dedent(''' _ebook_device_ls() { @@ -539,17 +542,20 @@ MIME = '''\ ''' -def render_svg(image, dest): +def render_svg(image, dest, width=128, height=128): from PyQt4.QtGui import QPainter, QImage from PyQt4.QtSvg import QSvgRenderer - svg = QSvgRenderer(image.readAll()) + image = image.readAll() if hasattr(image, 'readAll') else image + svg = QSvgRenderer(image) painter = QPainter() - image = QImage(128,128,QImage.Format_ARGB32_Premultiplied) + image = QImage(width, height, QImage.Format_ARGB32) painter.begin(image) painter.setRenderHints(QPainter.Antialiasing|QPainter.TextAntialiasing|QPainter.SmoothPixmapTransform|QPainter.HighQualityAntialiasing) painter.setCompositionMode(QPainter.CompositionMode_SourceOver) svg.render(painter) painter.end() + if dest is None: + return image image.save(dest) def main(): diff --git a/src/calibre/manual/conf.py b/src/calibre/manual/conf.py index b00a454237..3866008f1f 100644 --- a/src/calibre/manual/conf.py +++ b/src/calibre/manual/conf.py @@ -100,9 +100,8 @@ html_use_smartypants = True html_title = 'calibre User Manual' html_short_title = 'Start' html_logo = 'resources/logo.png' -epub_titlepage = 'resources/titlepage.html' -epub_logo = 'resources/logo.png' epub_author = 'Kovid Goyal' +epub_cover = 'resources/epub_cover.jpg' # Custom sidebar templates, maps document names to template names. #html_sidebars = {} diff --git a/src/calibre/manual/conversion.rst b/src/calibre/manual/conversion.rst index cd8abd0493..7df11575de 100644 --- a/src/calibre/manual/conversion.rst +++ b/src/calibre/manual/conversion.rst @@ -504,7 +504,7 @@ Meaning, it is very difficult to determine where one paragraph ends and another paragraphs using a configurable, :guilabel:`Line Un-Wrapping Factor`. This is a scale used to determine the length at which a line should be unwrapped. Valid values are a decimal between 0 and 1. The default is 0.5, this is the median line length. Lower this value to include more -text in the unwrapping. Increase to include less. +text in the unwrapping. Increase to include less. You can adjust this value in the conversion settings under PDF Input. Also, they often have headers and footers as part of the document that will become included with the text. Use the options to remove headers and footers to mitigate this issue. If the headers and footers are not diff --git a/src/calibre/manual/custom.py b/src/calibre/manual/custom.py index 38486cc67a..917b927086 100644 --- a/src/calibre/manual/custom.py +++ b/src/calibre/manual/custom.py @@ -304,9 +304,8 @@ def auto_member(dirname, arguments, options, content, lineno, return list(node) def setup(app): - app.add_config_value('epub_titlepage', None, False) + app.add_config_value('epub_cover', None, False) app.add_config_value('epub_author', '', False) - app.add_config_value('epub_logo', None, False) app.add_builder(CustomBuilder) app.add_builder(CustomQtBuild) app.add_builder(EPUBHelpBuilder) diff --git a/src/calibre/manual/epub.py b/src/calibre/manual/epub.py index 4635e334c0..d54eb99a8d 100644 --- a/src/calibre/manual/epub.py +++ b/src/calibre/manual/epub.py @@ -50,6 +50,7 @@ OPF = '''\ {uid} {date} +
{manifest} @@ -71,6 +72,29 @@ CONTAINER='''\ ''' + +SVG_TEMPLATE = '''\ + + + + + Cover + + + + + + + + +''' + class TOC(list): def __init__(self, title=None, href=None): @@ -151,8 +175,6 @@ class EPUBHelpBuilder(StandaloneHTMLBuilder): spine = [' '*8+''%quoteattr(x) for x in self.spine] spine = '\n'.join(spine) guide = '' - if self.conf.epub_titlepage: - guide = ' '*8 + '' opf = OPF.format(title=escape(self.conf.html_title), author=escape(self.conf.epub_author), uid=str(uuid.uuid4()), @@ -162,18 +184,15 @@ class EPUBHelpBuilder(StandaloneHTMLBuilder): self.manifest['content.opf'] = ('application/oebps-package+xml', 'opf') def create_titlepage(self): - if self.conf.epub_titlepage: - img = '' - if self.conf.epub_logo: - img = '_static/epub_logo'+os.path.splitext(self.conf.epub_logo)[1] - shutil.copyfile(self.conf.epub_logo, - os.path.join(self.html_outdir, *img.split('/'))) - raw = open(self.conf.epub_titlepage, 'rb').read() - raw = raw%dict(title=self.conf.html_title, - version=self.conf.version, - img=img.split('/')[-1], - author=self.conf.epub_author) - open(os.path.join(self.html_outdir, '_static', 'titlepage.html'), 'wb').write(raw) + self.cover_image_url = None + if self.conf.epub_cover: + img = '_static/'+os.path.basename(self.conf.epub_cover) + shutil.copyfile(self.conf.epub_cover, os.path.join(self.html_outdir, + *img.split('/'))) + self.cover_image_url = img + tp = SVG_TEMPLATE%img.split('/')[-1] + open(os.path.join(self.html_outdir, '_static', 'titlepage.html'), + 'wb').write(tp) def generate_manifest(self): self.manifest = {} @@ -190,8 +209,12 @@ class EPUBHelpBuilder(StandaloneHTMLBuilder): self.manifest[url] = 'application/octet-stream' if self.manifest[url] == 'text/html': self.manifest[url] = 'application/xhtml+xml' - self.manifest[url] = (self.manifest[url], 'id'+str(id)) - id += 1 + if self.cover_image_url and url.endswith(self.cover_image_url): + id_ = 'cover' + else: + id_ = 'id'+str(id) + id += 1 + self.manifest[url] = (self.manifest[url], id_) def isdocnode(self, node): if not isinstance(node, nodes.list_item): @@ -227,7 +250,7 @@ class EPUBHelpBuilder(StandaloneHTMLBuilder): open('toc.ncx', 'wb').write(ncx) self.manifest['toc.ncx'] = ('application/x-dtbncx+xml', 'ncx') self.spine.insert(0, self.manifest[self.conf.master_doc+'.html'][1]) - if self.conf.epub_titlepage: + if self.conf.epub_cover: self.spine.insert(0, self.manifest['_static/titlepage.html'][1]) def add_to_spine(self, href): diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index d04e414717..2b7dbbda35 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -7,7 +7,7 @@ Frequently Asked Questions .. contents:: Contents :depth: 1 - :local: + :local: E-book Format Conversion ------------------------- @@ -30,7 +30,7 @@ It can convert every input format in the following list, to every output format. What are the best source formats to convert? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In order of decreasing preference: LIT, MOBI, EPUB, HTML, PRC, RTF, PDB, TXT, PDF +In order of decreasing preference: LIT, MOBI, EPUB, HTML, PRC, RTF, PDB, TXT, PDF Why does the PDF conversion lose some images/tables? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -40,7 +40,7 @@ are also represented as vector diagrams, thus they cannot be extracted. How do I convert a collection of HTML files in a specific order? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In order to convert a collection of HTML files in a specific oder, you have to create a table of contents file. That is, another HTML file that contains links to all the other files in the desired order. Such a file looks like:: - +

Table of Contents

@@ -60,16 +60,16 @@ Then just add this HTML file to the GUI and use the convert button to create you How do I convert my file containing non-English characters, or smart quotes? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -There are two aspects to this problem: +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). - 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. + 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). + 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. How do I use some of the advanced features of the conversion tools? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - You can get help on any individual feature of the converters by mousing over it in the GUI or running ``ebook-convert dummy.html .epub -h`` at a terminal. A good place to start is to look at the following demo files that demonstrate some of the advanced features: - * `html-demo.zip `_ + You can get help on any individual feature of the converters by mousing over it in the GUI or running ``ebook-convert dummy.html .epub -h`` at a terminal. A good place to start is to look at the following demo files that demonstrate some of the advanced features: + * `html-demo.zip `_ Device Integration @@ -95,12 +95,39 @@ We just need some information from you: device supports SD cards, insert them. Then connect your device. In calibre go to Preferences->Advanced 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 + * Send both the above outputs to us with the other information and we will write a device driver for your device. Once you send us the output for a particular operating system, support for the device in that operating system will appear in the next release of |app|. +How does |app| manage collections on my SONY reader? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When |app| connects with the device, it retrieves all collections for the books on the device. The collections +of which books are members are shown on the device view. + +When you send a book to the device, |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 +values, |app| will not add the book to any collection. + +Collection management is largely controlled by 'Preserve device collections' found at Preferences->Add/Save->Sending +to device. If checked (the default), managing collections is left to the user; |app| will not delete already +existing collections for a book on your device when you resend the book to the device, 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 device, then resend the books. You can edit collections directly on the device view by +double-clicking or right-clicking in the collections column. + +If 'Preserve device collections' is not checked, then |app| will manage collections. Collections will be built using +|app| metadata exclusively. Sending a book to the device will correct the collections for that book so its +collections exactly match the book's metadata. Collections are added and deleted as necessary. Editing collections on +the device pane is not permitted, because collections not in the metadata will be removed automatically. + +In summary, check 'Preserve device collections' if you want to manage collections yourself. Collections for a book +will never be removed by |app|, but can be removed by you by editing on the device view. Uncheck 'Preserve device +collections' if you want |app| to manage the collections, adding books to and removing books from collections as +needed. Can I use both |app| and the SONY software to manage my reader? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -130,16 +157,19 @@ simplest is to simply re-name the executable file that launches the library prog Can I use the collections feature of the SONY reader? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |app| has full support for collections. When you add tags to a book's metadata, those tags are turned into collections when you upload the book to the SONY reader. Also, the series information is automatically -turned into a collection on the reader. Note that the PRS-500 does not support collections for books stored on the SD card. The PRS-505 does. +turned into a collection on the reader. Note that the PRS-500 does not support collections for books stored on the SD card. The PRS-505 does. How do I use |app| with my iPad/iPhone/iTouch? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Over the air +^^^^^^^^^^^^^^ + The easiest way to browse your |app| collection on your Apple device (iPad/iPhone/iPod) is by using the *free* Stanza app, available from the Apple app store. You need at least Stanza version 3.0. Stanza allows you to access your |app| collection wirelessly, over the air. 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 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 * 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. @@ -154,13 +184,13 @@ Replace ``192.168.1.2`` with the local IP address of the computer running |app|. If you get timeout errors while browsing the calibre catalog in Stanza, try increasing the connection timeout value in the stanza settings. Go to Info->Settings and increase the value of Download Timeout. -Alternative for the iPad +With the USB cable ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -As of |app| version 0.7.0, you can plugin your iPad into the computer using its charging cable, and |app| will detect it and show you a list of books on the iPad. You can then use the Send to device button to send books directly to iBooks on the iPad. +As of |app| version 0.7.0, you can plug your iDevice into the computer using its charging cable, and |app| will detect it and show you a list of books on the device. You can then use the *Send to device button* to send books directly to iBooks on the device. Note that you must have at least iOS 4 installed on your iPhone/iTouch for this to work. -This method only works on Windows XP and higher and OS X 10.5 and higher. Linux is not supported (iTunes is not available in linux) and OS X 10.4 is not supported. For more details, see -`this forum post http://www.mobileread.com/forums/showpost.php?p=944079&postcount=1`_. +This method only works on Windows XP and higher and OS X 10.5 and higher. Linux is not supported (iTunes is not available in linux) and OS X 10.4 is not supported. +For more details on how this works, see `this forum post `_. How do I use |app| with my Android phone? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -171,7 +201,7 @@ 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 +Preferences->Content Server. 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:: @@ -190,11 +220,16 @@ The most likely cause of this is your antivirus program. Try temporarily disabli Why is my device not detected in linux? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -|app| uses something called SYSFS to detect devices in linux. The linux kernel can export two version of SYSFS, one of which is deprecated. Some linux distributions still ship with kernels that support the deprecated version of SYSFS, even though it was deprecated a long time ago. In this case, device detection in |app| will not work. You can check what version of SYSFS is exported by your kernel with the following command:: - +|app| needs your linux kernel to have been setup correctly to detect devices. If your devices are not detected, perform the following tests:: + grep SYSFS_DEPRECATED /boot/config-`uname -r` -You should see something like ``CONFIG_SYSFS_DEPRECATED_V2 is not set``. If you don't you have to either recompile your kernel with the correct setting, or upgrade your linux distro to a more modern version, where this will not be set. +You should see something like ``CONFIG_SYSFS_DEPRECATED_V2 is not set``. +Also, :: + + grep CONFIG_SCSI_MULTI_LUN /boot/config-`uname -r` + +must return ``CONFIG_SCSI_MULTI_LUN=y``. If you don't see either, you have to recompile your kernel with the correct settings. Library Management ------------------ @@ -222,7 +257,7 @@ Now this makes it very easy to find for example all science fiction books by Isa ReadStatus -> Genre -> Author -> Series -In |app|, you would instead use tags to mark genre and read status and then just use a simple search query like ``tag:scifi and not tag:read``. |app| even has a nice graphical interface, so you don't need to learn its search language instead you can just click on tags to include or exclude them from the search. +In |app|, you would instead use tags to mark genre and read status and then just use a simple search query like ``tag:scifi and not tag:read``. |app| even has a nice graphical interface, so you don't need to learn its search language instead you can just click on tags to include or exclude them from the search. Why doesn't |app| have a column for foo? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -230,7 +265,7 @@ Why doesn't |app| have a column for foo? 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 Preferences. 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. +Simply copy the |app| library folder from the old to the new computer. You can find out what the library folder is by clicking Preferences. 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. @@ -241,11 +276,11 @@ Content From The Web :depth: 1 :local: -My downloaded news content causes the reader to reset. +My downloaded news content causes the reader to reset. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is a bug in the SONY firmware. The problem can be mitigated by switching the output format to EPUB -in the configuration dialog. Alternatively, you can use the LRF output format and use the SONY software -to transfer the files to the reader. The SONY software pre-paginates the LRF file, +in the configuration dialog. Alternatively, you can use the LRF output format and use the SONY software +to transfer the files to the reader. The SONY software pre-paginates the LRF file, thereby reducing the number of resets. I obtained a recipe for a news site as a .py file from somewhere, how do I use it? @@ -280,7 +315,7 @@ Take your pick: Why does |app| show only some of my fonts on OS X? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -|app| embeds fonts in ebook files it creates. E-book files support embedding only TrueType (.ttf) fonts. Most fonts on OS X systems are in .dfont format, thus they cannot be embedded. |app| shows only TrueType fonts founf on your system. You can obtain many TrueType fonts on the web. Simply download the .ttf files and add them to the Library/Fonts directory in your home directory. +|app| embeds fonts in ebook files it creates. E-book files support embedding only TrueType (.ttf) fonts. Most fonts on OS X systems are in .dfont format, thus they cannot be embedded. |app| shows only TrueType fonts found on your system. You can obtain many TrueType fonts on the web. Simply download the .ttf files and add them to the Library/Fonts directory in your home directory. |app| is not starting on Windows? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -303,6 +338,10 @@ Post any output you see in a help message on the `Forum System->Universal Access and turn off the setting for enabling +access for assistive devices in all the tabs. + You can obtain debug output about why |app| is not starting by running `Console.app`. Debug output will be printed to it. If the debug output contains a line that looks like:: @@ -312,9 +351,9 @@ then the problem is probably a corrupted font cache. You can clear the cache by `instructions `_. If that doesn't solve it, look for a corrupted font file on your system, in ~/Library/Fonts or the like. - My antivirus program claims |app| is a virus/trojan? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Your antivirus program is wrong. |app| is a completely open source product. You can actually browse the source code yourself (or hire someone to do it for you) to verify that it is not a virus. Please report the false identification to whatever company you buy your antivirus software from. If the antivirus program is preventing you from downloading/installing |app|, disable it temporarily, install |app| and then re-enable it. How do I use purchased EPUB books with |app|? @@ -324,8 +363,8 @@ Most purchased EPUB books have `DRM `_. Thi I want some feature added to |app|. What can I do? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -You have two choices: - 1. Create a patch by hacking on |app| and send it to me for review and inclusion. See `Development `_. +You have two choices: + 1. Create a patch by hacking on |app| and send it to me for review and inclusion. See `Development `_. 2. `Open a ticket `_ (you have to register and login first) and hopefully I will find the time to implement your feature. Can I include |app| on a CD to be distributed with my product/magazine? diff --git a/src/calibre/manual/gui.rst b/src/calibre/manual/gui.rst index dd0451c087..613eb82559 100644 --- a/src/calibre/manual/gui.rst +++ b/src/calibre/manual/gui.rst @@ -199,31 +199,59 @@ Searches are by default 'contains'. An item matches if the search string appears Two other kinds of searches are available: equality search and search using regular expressions. Equality searches are indicated by prefixing the search string with an equals sign (=). For example, the query -``tag:"=science"`` will match "science", but not "science fiction". Regular expression searches are +``tag:"=science"`` will match "science", but not "science fiction" or "hard science". Regular expression searches are indicated by prefixing the search string with a tilde (~). Any python-compatible regular expression can be used. Regular expression searches are contains searches unless the expression contains anchors. Should you need to search for a string with a leading equals or tilde, prefix the string with a backslash. +Enclose search strings with quotes (") if the string contains parenthesis or spaces. For example, to search +for the tag ``Science Fiction``, you would need to search for ``tag:"=science fiction"``. If you search for +``tag:=science fiction``, you will find all books with the tag 'science' and containing the word 'fiction' in any +metadata. + You can build advanced search queries easily using the :guilabel:`Advanced Search Dialog`, accessed by clicking the button |sbi|. -Available fields for searching are: ``tag, title, author, publisher, series, rating cover, comments, format, -isbn, date, pubdate, search``. +Available fields for searching are: ``tag, title, author, publisher, series, rating, cover, comments, format, +isbn, date, pubdate, search, size`` and custom columns. If a device is plugged in, the ``ondevice`` field +becomes available. To find the search name for a custom column, hover your mouse over the column header. -The syntax for searching for dates and publication dates is:: +The syntax for searching for dates is:: pubdate:>2000-1 Will find all books published after Jan, 2000 - date:<=2000-1-3 Will find all books added to calibre beforre 3 Jan, 2000 + date:<=2000-1-3 Will find all books added to calibre before 3 Jan, 2000 pubdate:=2009 Will find all books published in 2009 +If the date is ambiguous, the current locale is used for date comparison. For example, in an mm/dd/yyyy +locale, 2/1/2009 is interpreted as 1 Feb 2009. In a dd/mm/yyyy locale, it is interpreted as 2 Jan 2009. + +Some special date strings are available. The string ``today`` translates to today's date, whatever it is. The +strings `yesterday`` and ``thismonth`` also work. In addition, the string ``daysago`` can be used to compare +to a date some number of days ago, for example: date:>10daysago, date:<=45daysago. + +You can search for books that have a format of a certain size like this:: + + size:>1.1M Will find books with a format larger than 1.1MB + size:<=1K Will find books with a format smaller than 1KB + +Dates and numeric fields support the operators ``=`` (equals), ``>`` (greater than), ``>=`` (greater than or +equal to), ``<`` (less than), ``<=`` (less than or equal to), and ``!=`` (not equal to). Rating fields are +considered to be numeric. For example, the search ``rating:>=3`` will find all books rated 3 or higher. + The special field ``search`` is used for saved searches. So if you save a search with the name -"My spouse's books" you can enter ``search:"My spouses' books"`` in the search bar to reuse the saved +"My spouse's books" you can enter ``search:"My spouse's books"`` in the search bar to reuse the saved search. More about saving searches, below. -You can search for the absence or presnce of a filed using the specia "true" and "false" values. For example:: +You can search for the absence or presence of a field using the special "true" and "false" values. For example:: - cover:false Will give you all books without a cover - series:true Will give you all books that belong to a series + cover:false will give you all books without a cover + series:true will give you all books that belong to a series + comments:false will give you all books with an empty comment + +Yes/no custom columns are searchable. Searching for ``false``, ``empty``, or ``blank`` will find all books +with undefined values in the column. Searching for ``true`` will find all books that do not have undefined +values in the column. Searching for ``yes`` or ``checked`` will find all books with ``Yes`` in the column. +Searching for ``no`` or ``unchecked`` will find all books with ``No`` in the column. .. |sbi| image:: images/search_button.png :align: middle diff --git a/src/calibre/manual/resources/epub_cover.jpg b/src/calibre/manual/resources/epub_cover.jpg new file mode 100644 index 0000000000..d5aa42e775 Binary files /dev/null and b/src/calibre/manual/resources/epub_cover.jpg differ diff --git a/src/calibre/manual/resources/titlepage.html b/src/calibre/manual/resources/titlepage.html deleted file mode 100644 index 08f7ddf1cc..0000000000 --- a/src/calibre/manual/resources/titlepage.html +++ /dev/null @@ -1,29 +0,0 @@ - - - %(title)s - - - -

%(title)s

-

%(version)s

-
- -
-

%(author)s

- - - diff --git a/src/calibre/translations/ar.po b/src/calibre/translations/ar.po index f3bd9dfa6f..ce7590d6f5 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-06-06 21:03+0000\n" -"PO-Revision-Date: 2010-06-06 16:41+0000\n" -"Last-Translator: Kovid Goyal \n" +"POT-Creation-Date: 2010-07-03 01:21+0000\n" +"PO-Revision-Date: 2010-07-03 06:13+0000\n" +"Last-Translator: Walid \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-06-07 03:39+0000\n" +"X-Launchpad-Export-Date: 2010-07-04 03:43+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -23,39 +23,40 @@ 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:54 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:75 #: /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:418 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:347 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:466 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:396 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:101 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:428 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:329 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:332 +#: /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/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:230 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:270 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:273 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:373 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:235 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:276 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:279 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:390 #: /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 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:46 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:317 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:62 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:118 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:120 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:943 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1055 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:945 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1057 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:28 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -71,9 +72,9 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:818 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:908 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:979 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:910 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:915 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:137 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:139 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:108 @@ -101,47 +102,49 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:233 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:235 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:280 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:107 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:657 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:666 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:946 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:815 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:818 +#: /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:22 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:903 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1192 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1195 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:481 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:339 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:826 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:989 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1806 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1809 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:185 #: /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:302 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:314 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:876 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:913 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1392 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1394 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1516 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:335 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:347 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:950 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1019 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1620 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1622 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1744 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:268 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:131 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:134 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:68 -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:114 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:115 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:64 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:78 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:47 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:50 msgid "Unknown" @@ -176,7 +179,7 @@ msgstr "" "إلتحاق بكل الوصلات المحلية في ملف HTML وإنشاء ملف ZIP ليحتوي كل الملفات " "الموصولة. هذا الملحق ينفّذ كل مرة تضيف ملف HTML إلى المكتبة." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:50 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -184,7 +187,7 @@ msgstr "" "رمزالحروف لاجل ملفات HTML المدخلة, تشتمل على الخيارات التالية : cp1252, " "latin1, iso-8859-1 وutf-8" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:57 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 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 " @@ -194,49 +197,49 @@ msgstr "" "pmlname_img او صور. هذا المضاف يتم تشغيله كل مرة اضيف فيها ملف PML الى " "المكتبة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:89 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:90 msgid "Extract cover from comic files" msgstr "استخرج الغلاف من ملف الرسومات" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:116 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:127 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:139 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:149 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:170 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:180 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:190 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:200 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:210 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:220 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:231 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:242 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:254 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:275 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:286 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:296 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:306 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:117 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:128 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:140 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:150 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:160 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:171 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:181 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:191 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:201 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:211 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:221 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:232 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:243 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:255 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:276 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:287 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:297 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:307 msgid "Read metadata from %s files" msgstr "يقرأ دليل المعلومات من الملفات %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:265 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:266 msgid "Read metadata from ebooks in RAR archives" msgstr "إقرأ دليل المعلومات لكتب في أرشيفات RAR" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:317 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:318 msgid "Read metadata from ebooks in ZIP archives" msgstr "إقرأ ميتاداتا لكتب في أرشيفات ZIP" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:328 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:338 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:348 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:370 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:381 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:391 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:331 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:341 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:351 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:373 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:384 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:394 msgid "Set metadata in %s files" msgstr "ضبط دليل المعلومات في الملفات %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:359 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:362 msgid "Set metadata from %s files" msgstr "ضبط دليل المعلومات من ملفات %s" @@ -280,7 +283,7 @@ msgstr "" "وثيقة الإدخال." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:57 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:266 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:412 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -292,70 +295,70 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "ملف التعريف هذا هو المقصود لجهاز سوني PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:78 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:300 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:447 msgid "This profile is intended for the SONY PRS-900." msgstr "ملف التعريف هذا هو المقصود لجهاز سوني PRS 900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:330 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:477 msgid "This profile is intended for the Microsoft Reader." msgstr "هذا الطور يستخدم مع Microsoft Reader" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:97 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:341 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:488 msgid "This profile is intended for the Mobipocket books." msgstr "ملف التعريف هذا يستخدم مع كتب Mobipocket ." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:110 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:354 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:501 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "ملف التعريف هذا يستخدم مع Hanlin V3 وأمثاله." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:122 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "ملف التعريف هذا يستخدم مع Hanlin V5 وأمثاله." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:132 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:374 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:521 msgid "This profile is intended for the Cybook G3." msgstr "ملف التعريف هذا يستخدم مع Cybook G3" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:145 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:387 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:534 msgid "This profile is intended for the Cybook Opus." msgstr "ملف التعريف هذا يستخدم مع Cybook Opus ." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:157 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:398 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:545 msgid "This profile is intended for the Amazon Kindle." msgstr "ملف التعريف هذا يستخدم مع Amazon Kindle ." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:169 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:580 msgid "This profile is intended for the Irex Illiad." msgstr "ملف التعريف هذا يستخدم مع Irex Illiad ." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:181 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:446 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:593 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "ملف التعريف هذا يستخدم مع IRex Digital Reader 1000 ." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:460 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:607 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:206 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:474 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:621 msgid "This profile is intended for the B&N Nook." msgstr "ملف التعريف هذا يستخدم مع B&N Nook ." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:226 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:228 msgid "Output profile" msgstr "المخرجات" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:230 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:232 msgid "" "This profile tries to provide sane defaults and is useful if you want to " "produce a document intended to be read at a computer or on a range of " @@ -364,24 +367,24 @@ msgstr "" "ملف التعريف هذا يحاول تقديم افتراضات عاقلة و مفيدة إذا كنت ترغب في إصدار " "وثيقة للقراءة في جهاز الكمبيوتر أو على مجموعة من الأجهزة." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:254 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:257 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:279 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:425 msgid "This profile is intended for the Kobo Reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:291 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:438 msgid "This profile is intended for the SONY PRS-300." msgstr "ملف التعريف هذا يستخدم مع سوني PRS-300 ." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:309 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:456 msgid "This profile is intended for the 5-inch JetBook." msgstr "ملف التعريف هذا يستخدم مع الخمسة بوصة JetBook ." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:318 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:465 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -389,7 +392,7 @@ msgstr "" "ملف التعريف هذا يستخدم مع سوني خط إنتاج PRS . الـ500/505/700 الخ ، في وضع " "أفقي.غالباً مفيد للكاريكاتيرات." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:416 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 msgid "This profile is intended for the Amazon Kindle DX." msgstr "ملف التعريف هذا يستخدم مع Amazon Kindle DX" @@ -409,15 +412,19 @@ msgstr "تخصيص الملحقات المحلية" msgid "Disabled plugins" msgstr "ملحقات معطلة" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:77 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 +msgid "Enabled plugins" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:83 msgid "No valid plugin found in " msgstr "لا يجد ملحق صالح " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:278 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:460 msgid "Initialization of plugin %s failed with traceback:" msgstr "فشل استهلال الملحق %s مع اقتفاء الأثر:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:493 msgid "" " %prog options\n" "\n" @@ -429,29 +436,29 @@ msgstr "" " المقدرة على التخصيص بتحميل الملحقات الخارجية .\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:439 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:499 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:441 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "حذف الملحق المخصص عن طريق اسمه. لا يؤثر على الملحقات المضمنة" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:443 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:503 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." msgstr "تخصيص الملحق . حدد اسم الملحق وسلسلة التخصيص وفرقهما بفاصلة." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:445 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:505 msgid "List all installed plugins" msgstr "قائمة كل الملحقات المثبتة" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:447 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:507 msgid "Enable the named plugin" msgstr "تمكين الملحق المسمى" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:449 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:509 msgid "Disable the named plugin" msgstr "تعطيل الملحق المسمى" @@ -459,65 +466,81 @@ msgstr "تعطيل الملحق المسمى" msgid "Communicate with Android phones." msgstr "التواصل مع هواتف أندرويد ." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:39 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:45 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:77 msgid "Communicate with S60 phones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:46 -msgid "Communicate with iBooks through iTunes." +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:87 +msgid "Communicate with iTunes/iBooks." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:93 msgid "Apple device detected, launching iTunes, please wait ..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:154 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:172 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:175 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:246 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:249 msgid "Updating device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:240 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:271 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:861 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1023 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:323 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:921 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:957 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2791 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2830 msgid "%d of %d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:277 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1028 +#: /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:2836 msgid "finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:452 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:544 +msgid "Use Series as Category in iTunes/iBooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:546 +msgid "Cache covers from iTunes/iBooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:558 msgid "" "Some books not found in iTunes database.\n" "Delete using the iBooks app.\n" "Click 'Show Details' for a list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:647 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:28 -msgid "settings for device drivers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:649 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:30 -msgid "Ordered list of formats the device will accept" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:762 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:886 msgid "" "Some cover art could not be converted.\n" "Click 'Show Details' for a list." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2471 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:807 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:813 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:239 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:167 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:180 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1504 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:128 +msgid "News" +msgstr "الأخبار" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2698 +msgid "Communicate with iTunes." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/binatone/driver.py:17 msgid "Communicate with the Binatone Readme eBook reader." msgstr "" @@ -540,6 +563,14 @@ msgstr "" msgid "Communicate with the EB600 eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى EB600 ." +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:193 +msgid "Communicate with the Astak Mentor EB600" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:216 +msgid "Communicate with the PocketBook 301 reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" msgstr "" @@ -552,6 +583,10 @@ msgstr "" msgid "Communicate with the ESlick eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى ESlick ." +#: /home/kovid/work/calibre/src/calibre/devices/eslick/driver.py:49 +msgid "Communicate with the Sigmatek eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:16 #: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:30 msgid "Use an arbitrary folder as a device." @@ -566,14 +601,20 @@ msgstr "واجهة الجهاز" msgid "Communicate with Hanlin V3 eBook readers." msgstr "التواصل مع القارئ الكتاب الاليكترونى Hanlin V3 ." -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:90 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:87 msgid "Communicate with Hanlin V5 eBook readers." msgstr "التواصل مع القارئ الكتاب الاليكترونى Hanlin V5 ." -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:109 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:106 msgid "Communicate with the BOOX eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى BOOX ." +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:121 +msgid "" +"Comma separated list of directories to send e-books to on the device. The " +"first one that exists will be used." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى Hanvon N520 ." @@ -600,7 +641,7 @@ msgstr "التواصل مع القارئ الكتاب الاليكترونى IRe #: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17 #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:29 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:38 msgid "John Schember" msgstr "John Schember" @@ -620,22 +661,56 @@ msgstr "التواصل مع القارئ الكتاب الاليكترونى Iri msgid "Communicate with the JetBook eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى JetBook ." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:21 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:42 msgid "Communicate with the Kindle eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى Kindle ." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:147 +#: /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:157 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:210 msgid "Communicate with the Kindle DX eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى Kindle DX ." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:14 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:22 msgid "Communicate with the Kobo Reader" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:51 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:54 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:157 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:64 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:67 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:130 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:137 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:160 +msgid "Getting list of books on device..." +msgstr "يجري إحصاء قائمة كتب من الجهاز..." + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:218 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:258 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:244 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:262 +msgid "Removing books from device..." +msgstr "يجري حذف الكتب من الجهاز..." + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:262 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:274 +msgid "Removing books from device metadata listing..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:308 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:208 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:238 +msgid "Adding books to device metadata listing..." +msgstr "إضافة كتب لقائمة البيانات الوصفية للجهاز ..." + #: /home/kovid/work/calibre/src/calibre/devices/misc.py:15 msgid "Communicate with the Palm Pre" msgstr "الإتصال مع جهاز البالم بري" @@ -644,6 +719,10 @@ msgstr "الإتصال مع جهاز البالم بري" msgid "Communicate with the Booq Avant" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:55 +msgid "Communicate with the Sweex MM300" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "التواصل مع نوكيا 770" @@ -652,6 +731,10 @@ msgstr "التواصل مع نوكيا 770" msgid "Communicate with the Nokia 810 internet tablet." msgstr "التواصل مع نوكيا 810" +#: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:74 +msgid "Communicate with the Nokia E52" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:20 msgid "The Nook" msgstr "جهاز الـNook" @@ -672,7 +755,7 @@ msgstr "التواصل مع قارئ الكتاب الاليكتروني سون msgid "Communicate with all the Sony eBook readers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:60 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:61 msgid "" "Comma separated list of metadata fields to turn into collections on the " "device. Possibilities include: " @@ -701,121 +784,98 @@ msgstr "" msgid "Communicate with the iPapyrus reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:247 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:245 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "لم يتمكن من كشف القرص %s. حاول إعادة التشغيل." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:427 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:425 msgid "Unable to detect the %s mount point. Try rebooting." msgstr "غير قادر على الكشف عن %s نقطة التحميل. حاول إعادة التشغيل." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:492 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:490 msgid "Unable to detect the %s disk drive." msgstr "%s غير قادر على اكتشاف عن الذاكرة" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:585 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:583 msgid "Could not find mount helper: %s." msgstr "غير قادر على جلب المساعد : %s ." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:597 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:595 msgid "" "Unable to detect the %s disk drive. Your kernel is probably exporting a " "deprecated version of SYSFS." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:605 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:603 msgid "Unable to mount main memory (Error code: %d)" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:740 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:742 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 msgid "The reader has no storage card in this slot." msgstr "لا يوجد بطاقات تخزين في القارئ ." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:746 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 msgid "Selected slot: %s is not supported." msgstr "الفتحة المختارة : %s ليست مدعومة ." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:779 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:773 msgid "There is insufficient free space in main memory" msgstr "لا توجد مساحة كافية في الذاكرة الرئيسية" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:781 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:783 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:775 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:777 msgid "There is insufficient free space on the storage card" msgstr "لا توجد مساحة كافية في بطاقة التخزين" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:813 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:819 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:847 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:239 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:141 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:152 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1276 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:120 -msgid "News" -msgstr "الأخبار" - #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:12 msgid "Configure Device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:32 -msgid "Place files in sub directories if the device supports them" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:34 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 -msgid "Read metadata from files on device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:36 -msgid "Template to control how books are saved" +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:37 +msgid "settings for device drivers" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 +msgid "Ordered list of formats the device will accept" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:41 +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 +msgid "Read metadata from files on device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:45 +msgid "Use author sort instead of author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:47 +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 msgid "Extra customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:28 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:37 msgid "Communicate with an eBook reader." msgstr "الاتصال مع جهاز قارئ إلكتروني ." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:44 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:53 msgid "Get device information..." msgstr "يجري إحصاء معلومات الجهاز..." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:53 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:56 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:59 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:119 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:126 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:149 -msgid "Getting list of books on device..." -msgstr "يجري إحصاء قائمة كتب من الجهاز..." - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:174 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:176 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:188 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 msgid "Transferring books to device..." msgstr "يجري تحويل الكتب إلى الجهاز..." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:191 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:220 -msgid "Adding books to device metadata listing..." -msgstr "إضافة كتب لقائمة للبيانات الوصفية للجهاز" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:224 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:242 -msgid "Removing books from device..." -msgstr "يجري حذف الكتب من الجهاز..." - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:246 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251 -msgid "Removing books from device metadata listing..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:305 msgid "Sending metadata to device..." msgstr "يجري إرسال دليل المعلومات. إلى الجهاز..." @@ -1427,15 +1487,15 @@ msgstr "" msgid "Failed to parse date/time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:802 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:809 msgid "Converting input to HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:829 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:836 msgid "Running transforms on ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:916 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:923 msgid "Creating" msgstr "" @@ -1471,7 +1531,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:86 msgid "" "Do not use SVG for the book cover. Use this option if your EPUB is going to " -"be used ona device that does not support SVG, like the iPhone or the " +"be used on a device that does not support SVG, like the iPhone or the " "JetBook Lite. Without this option, such devices will display the cover as a " "blank page." msgstr "" @@ -1507,20 +1567,20 @@ msgstr "" msgid "Add Table of Contents to beginning of the book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:243 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:248 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:250 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:255 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:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:264 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 " @@ -1528,7 +1588,7 @@ msgid "" "pipeline." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:267 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:272 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." @@ -1665,7 +1725,7 @@ msgid "Path to output file" msgstr "المسار إلى ملف الخرج" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:114 msgid "Verbose processing" msgstr "" @@ -1754,84 +1814,86 @@ msgstr "ضم أسرة الخطوط أحادية القياس" msgid "Comic" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:372 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:389 #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:46 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:336 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:831 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 +#: /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:882 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:543 msgid "Title" msgstr "العنوان" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:373 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:341 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:832 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:390 +#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:883 msgid "Author(s)" msgstr "المؤلف أو المؤلفون" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:374 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:53 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 +#: /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:375 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:392 #: /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:376 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393 +#: /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:185 #: /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/library/models.py:297 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1008 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:107 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1073 msgid "Comments" msgstr "التعليقات" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:384 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:54 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:286 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1004 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:106 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1069 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:139 msgid "Tags" msgstr "الوسوم" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:386 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:302 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1013 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:105 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:87 msgid "Series" msgstr "السلسلة" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:404 msgid "Language" msgstr "اللغة" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:389 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:996 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 msgid "Timestamp" msgstr "ختم التوقيت" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:51 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:408 +#: /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:393 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:410 msgid "Rights" msgstr "" @@ -1839,7 +1901,7 @@ msgstr "" msgid "EDITORIAL REVIEW" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:22 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:41 msgid "" "Extract common e-book formats from archives (zip/rar) files. Also try to " "autodetect if they are actually cbz/cbr files." @@ -1938,45 +2000,57 @@ msgstr "تم حفظ الغلاف في" msgid "No cover found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:33 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:15 +msgid "Cover download" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:42 +msgid "Downloads metadata from Douban.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:34 msgid "Metadata download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 msgid "ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 msgid "tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:112 msgid "description/reviews" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:113 msgid "Download %s from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:136 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:139 msgid "Downloads metadata from Google Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:152 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:156 msgid "Downloads metadata from isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:180 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:184 msgid "" "To use isbndb.com you must sign up for a %sfree account%s and enter your " "access key below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:188 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:194 msgid "Downloads social metadata from amazon.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:213 +msgid "Downloads series/tags/rating information from librarything.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:95 msgid "" "\n" "%prog [options] key\n" @@ -1990,50 +2064,51 @@ msgid "" "\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:105 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:106 msgid "The ISBN ID of the book you want metadata for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 msgid "The author whose book to search for." msgstr "المؤلف الذي تريد البحث عنه." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 msgid "The title of the book to search for." msgstr "العنوان الذي تريد البحث عنه." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 msgid "The publisher of the book to search for." msgstr "الناشر الذي تريد البحث عنه." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:53 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:68 msgid "LibraryThing.com timed out. Try again later." msgstr "LibraryThing.com لم يرد. حاول لاحقاً." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:60 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:75 msgid "" "Could not fetch cover as server is experiencing high load. Please try again " "later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:61 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:76 msgid " not found." msgstr " لم يوجد." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:64 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:79 msgid "LibraryThing.com server error. Try again later." msgstr "خطأ في خادم LibraryThing.com. حاول لاحقاً." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:71 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:86 msgid "" "\n" "%prog [options] ISBN\n" "\n" -"Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" +"Fetch a cover image/social metadata for the book identified by ISBN from " +"LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1220 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1371 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1226 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1398 msgid "Cover" msgstr "الغلاف" @@ -2072,70 +2147,70 @@ msgstr "" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1372 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 msgid "Title Page" msgstr "صقحة العنوان" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1373 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 #: /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 msgid "Table of Contents" msgstr "المحتويات" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1374 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Index" msgstr "الفهرس" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1375 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Glossary" msgstr "المسرد" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1376 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 msgid "Acknowledgements" msgstr "شكر وتقدير" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1377 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Bibliography" msgstr "ببليوغرافيا" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1378 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1379 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Copyright" msgstr "حقوق المؤلف" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1380 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Dedication" msgstr "الإهداء" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1381 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1382 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Foreword" msgstr "افتتاحية" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1383 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "List of Illustrations" msgstr "قائمة الرسوم" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1384 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "List of Tables" msgstr "قائمة الجداول" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1385 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Notes" msgstr "الملاحظات" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1386 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Preface" msgstr "افتتاحية" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1387 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "Main Text" msgstr "النصّ الرئيسي" @@ -2316,6 +2391,8 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:29 msgid "Author" msgstr "" @@ -2521,8 +2598,8 @@ msgid "Use Roman numerals for series number" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47 -msgid "Sort tags list by popularity" -msgstr "ترتيب الوسوم حسب الشهرة" +msgid "Sort tags list by name, popularity, or rating" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:49 msgid "Number of covers to show in the cover browsing mode" @@ -2598,86 +2675,478 @@ msgstr "" msgid "tag browser categories not to display" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:103 +msgid "The layout of the user interface" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:105 +msgid "Show the average rating per item indication in the tag browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:107 +msgid "Disable UI animations" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:476 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:189 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:189 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:399 msgid "Choose Files" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:245 +msgid "Use library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:246 +msgid "User annotations generated from main library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:671 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:708 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:729 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1060 +msgid "No books selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:76 +msgid "No books selected to fetch annotations from" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:101 +msgid "Merging user annotations into database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:129 +msgid "%s
Last Page Read: %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:135 +msgid "%s
Last Page Read: Location %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:154 +msgid "Location %d • %s
%s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:163 +msgid "Page %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:168 +msgid "Location %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:291 +msgid "How many empty books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:292 +msgid "How many empty books should be added?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:391 +msgid "Uploading books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137 +msgid "Books" +msgstr "كتب" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:352 +msgid "EPUB Books" +msgstr "كتب EPUB" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:353 +msgid "LRF Books" +msgstr "كتب LRF" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:354 +msgid "HTML Books" +msgstr "كتب HTML" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:355 +msgid "LIT Books" +msgstr "كتب LIT" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:356 +msgid "MOBI Books" +msgstr "كتب MOBI" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:357 +msgid "Topaz books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:358 +msgid "Text books" +msgstr "كتب نصّية" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:359 +msgid "PDF Books" +msgstr "كتب PDF" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:360 +msgid "Comics" +msgstr "الرسومات" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:361 +msgid "Archives" +msgstr "أرشيفات" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:365 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:400 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:401 +msgid "" +"Some duplicates were found and merged into the following existing books:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:410 +msgid "Failed to read metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:411 +msgid "Failed to read metadata from the following" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:430 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:435 +msgid "Add to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:430 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1229 +msgid "No book selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:435 +msgid "No book files found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:457 +msgid "Cannot delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:470 +msgid "Choose formats to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:488 +msgid "Choose formats not to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:508 +msgid "Cannot delete books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:509 +msgid "No device is connected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:519 +msgid "Main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:453 +msgid "Storage Card A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 +msgid "Storage Card B" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:526 +msgid "No books to delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:527 +msgid "None of the selected books are on the device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:601 +msgid "Deleting books from device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:565 +msgid "" +"The selected books will be permanently deleted and the files removed " +"from your computer. Are you sure?" +msgstr "الكتب المختارة سوف تحذف تماماً من حاسوبك. هل أنت متأكّد؟" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:586 +msgid "" +"The selected books will be permanently deleted from your device. Are " +"you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:611 +msgid "Cannot download metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:627 +msgid "social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:629 +msgid "covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:629 +msgid "metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:631 +msgid "Downloading %s for %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:655 +msgid "Failed to download some metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:656 +msgid "Failed to download metadata for the following:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:659 +msgid "Failed to download metadata:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:660 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:637 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:949 +#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 +msgid "Error" +msgstr "خطأ" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:707 +msgid "Cannot edit metadata" +msgstr "لا يمكن تحرير الميتاداتا" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:728 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:731 +msgid "Cannot merge books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:732 +msgid "At least two books must be selected for merging" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:736 +msgid "" +"All book formats and metadata from the selected books will be added to the " +"first selected book.

The second and subsequently selected " +"books will not be deleted or changed.

Please confirm you want to " +"proceed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:747 +msgid "" +"All book formats and metadata from the selected books will be merged into " +"the first selected book.

After merger the second and " +"subsequently selected books will be deleted.

All book formats " +"of the first selected book will be kept and any duplicate formats in the " +"second and subsequently selected books will be permanently deleted " +"from your computer.

Are you sure you want to proceed?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:759 +msgid "" +"You are about to merge more than 5 books. Are you sure you want to " +"proceed?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:876 +msgid "Cannot save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:879 +msgid "Choose destination directory" +msgstr "إختيار دليل الوجهة" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:912 +msgid "Error while saving" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:913 +msgid "There was an error while saving." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:921 +msgid "Could not save some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:922 +msgid "Click the show details button to see which ones." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:943 +msgid "No books selected to generate catalog for" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:960 +msgid "Generating %s catalog..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:965 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:264 +msgid "No books found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:966 +msgid "" +"No books to catalog\n" +"Check exclude tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:976 +msgid "Catalog generated." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:979 +msgid "Export Catalog Directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:980 +msgid "Select destination for %s.%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:996 +msgid "Fetching news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1010 +msgid " fetched." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1059 +msgid "Cannot convert" +msgstr "لا يمكن تحويله" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1088 +msgid "Starting conversion of %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1265 +msgid "Cannot view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1210 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:76 +msgid "Choose the format to view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1218 +msgid "Multiple Books Selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1219 +msgid "" +"You are attempting to open %d books. Opening too many books at once can be " +"slow and have a negative effect on the responsiveness of your computer. Once " +"started the process cannot be stopped until complete. Do you wish to " +"continue?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1228 +msgid "Cannot open folder" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1266 +msgid "%s has no available formats." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/add.py:54 msgid "Searching in" msgstr "يتم البحث في" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:232 msgid "Adding..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 msgid "Searching in all sub-directories..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:258 msgid "Path error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:259 msgid "The specified directory could not be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:599 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 msgid "No books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1938 -msgid "No books found" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:330 msgid "Added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:343 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:344 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:353 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:356 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 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:357 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:360 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:427 msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:480 msgid "Saved" msgstr "تم الحفظ" @@ -2763,25 +3232,25 @@ msgstr "" #: /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:52 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:553 +#: /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/config/config_ui.py:554 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:578 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 -#: /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: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:408 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:568 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:589 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /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:385 +#: /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:400 +#: /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 #: /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 @@ -2792,17 +3261,17 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /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:74 -#: /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: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/main_ui.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:401 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:407 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:410 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:412 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 #: /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 @@ -2824,6 +3293,59 @@ msgid "" "&Multiple books per folder, assumes every ebook file is a different book" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1059 +msgid "Path" +msgstr "المسار" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:117 +#: /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:220 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:96 +msgid "Formats" +msgstr "التهيئات" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1062 +msgid "Collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 +msgid "Click to open" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1068 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1072 +#: /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:458 +msgid "None" +msgstr "بدون" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:310 +msgid "Click to open Book Details window" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:16 msgid "CSV/XML Options" msgstr "" @@ -2869,7 +3391,7 @@ msgstr "" #: /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/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:167 #: /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 @@ -2879,11 +3401,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:45 +#: /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:49 #: /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:74 +#: /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/search_item_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 @@ -2901,8 +3423,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:222 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1239 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1257 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1467 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1485 msgid "Catalog" msgstr "" @@ -3337,96 +3859,96 @@ msgid "" "possible." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:99 msgid "Choose cover for " msgstr "إختار الغلاف لـ " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:106 msgid "Cannot read" msgstr "لا يمكن القراءة" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:107 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:115 msgid "Error reading file" msgstr "خطأ في قراءة الملف" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "

There was an error reading from file:
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:124 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:405 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "Book Cover" msgstr "غلاف الكتاب" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 -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:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 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:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 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:366 +msgid "Use cover from &source file" +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 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:367 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 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/convert/metadata_ui.py:175 #: /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:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 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:176 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:177 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/convert/metadata_ui.py:178 #: /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:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 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:380 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Ta&gs: " msgstr "الو&سوم: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 #: /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:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

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

ممكن تكون أي كلمة أو " "مجموعة كلمات، مفرقة بفاصلة." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 #: /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:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 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/convert/metadata_ui.py:183 #: /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:385 -#: /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:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 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:391 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "Book " msgstr "الكتاب " @@ -3535,12 +4057,12 @@ msgid "PDB Input" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:32 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47 msgid "Treat each &line as a paragraph" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:33 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:48 msgid "Assume print formatting" msgstr "" @@ -3584,11 +4106,6 @@ msgstr "" msgid "RB Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2183 -msgid "Choose the format to view" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:82 msgid "Cannot build regex using the GUI builder without a book." msgstr "" @@ -3669,12 +4186,12 @@ msgid "Footer regular expression:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:77 msgid "Invalid regular expression" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:78 msgid "Invalid regular expression: %s" msgstr "" @@ -3758,22 +4275,22 @@ msgstr "" msgid "TXT Input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:49 msgid "Process using markdown" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:50 msgid "" "

Markdown is a simple markup language for text files, that allows for " "advanced formatting. To learn more visit markdown." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 msgid "Do not insert Table of Contents into output text when using markdown" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:52 msgid "Preserve &spaces" msgstr "" @@ -3882,11 +4399,20 @@ msgid "" "href=\"http://calibre-ebook.com/user_manual/xpath.html\">XPath Tutorial." msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:119 +msgid "Cover browser could not be loaded" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:171 +msgid "Browse by covers" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:205 @@ -3907,278 +4433,307 @@ msgstr "" msgid "No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:115 msgid "star(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:116 msgid "Unrated" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:249 +msgid " index:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:432 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +msgid "Automatically number books in this series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:475 msgid "Remove all tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:496 msgid "tags to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:501 msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:48 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:135 msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:154 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:270 msgid "Get device information" msgstr "احصل على معلومات الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:281 msgid "Get list of books on device" msgstr "احصل على قائمة الكتب على الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:291 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:300 msgid "Send metadata to device" msgstr "ارسل الميتاداتا إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:305 +msgid "Send collections to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:329 msgid "Upload %d books to device" msgstr "رفع %d كتاب إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:344 msgid "Delete books from device" msgstr "حذف كتب من الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:361 msgid "Download books from device" msgstr "تنزيل الكتب من الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:339 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:371 msgid "View book on device" msgstr "عرض كتاب على الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:386 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:388 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 msgid "Email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 +msgid " and delete from library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:433 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:435 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:410 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:451 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:412 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:421 -msgid "Storage Card A" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:414 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:423 -msgid "Storage Card B" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:438 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:470 msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:509 msgid "Connect to folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:482 -msgid "Disconnect from folder" +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:515 +msgid "Connect to iTunes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:520 +msgid "Eject device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:528 msgid "Fetch annotations (experimental)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:638 +msgid "Error communicating with device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:659 +msgid "Select folder to open as device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:704 +msgid "Failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:710 +msgid "Error talking to device" +msgstr "خطأ في الاتصال بالجهاز" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:711 +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:753 +msgid "Device: " +msgstr "الجهاز: " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:755 +msgid " detected." +msgstr " تم كشفه." + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:778 +msgid "Connected " +msgstr "متصل " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:846 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:614 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:617 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:621 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:864 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:868 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:622 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:664 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:910 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:667 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:913 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:668 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:914 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:181 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:712 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:965 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1057 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1118 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1236 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:959 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:738 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:984 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:739 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:989 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:770 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1016 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1017 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:782 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1028 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1058 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1237 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1087 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:902 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1150 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:957 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1244 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:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1305 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1047 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1306 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:75 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 msgid "Select available formats and their order for this device" 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:82 msgid "Use sub directories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81 -msgid "Save &template:" +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 +msgid "Use author sort for author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:293 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:994 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:102 -msgid "Path" -msgstr "المسار" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:117 -#: /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:219 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:292 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:103 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:91 -msgid "Formats" -msgstr "التهيئات" +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +msgid "Save &template:" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68 msgid "Fit &cover to view" @@ -4250,47 +4805,47 @@ msgstr "&طور:" msgid "Edit Comments" 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 "%(plugin_type)s %(plugins)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:175 msgid "plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:184 msgid "" "\n" "Customization: " 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:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 msgid "General" 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 "Interface" 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 "Add/Save" 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 "Advanced" 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 "" "Content\n" "Server" @@ -4298,191 +4853,191 @@ msgstr "" "محتوى\n" "خادم" -#: /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 "Plugins" msgstr "الملحقات" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 msgid "Auto send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 msgid "Email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:225 msgid "Formats to email. The first matching format will be sent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:226 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:299 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:300 msgid "new email address" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 -msgid "System port selected" +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:502 +msgid "System port selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:503 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:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:933 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:190 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1650 -#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 -msgid "Error" -msgstr "خطأ" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:523 msgid "Failed to install command line tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:514 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:526 msgid "Command line tools installed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:527 msgid "Command line tools installed in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:528 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:567 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:579 msgid "No valid plugin path" msgstr "مسار الملحق غير صالح" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:568 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:580 msgid "%s is not a valid plugin path" msgstr "%s ليس مسار لملحق صالح" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:583 msgid "Choose plugin" msgstr "إختيار الملحق" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:595 msgid "Plugin cannot be disabled" msgstr "لا يمكن تعطيل الملحق" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:584 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:596 msgid "The plugin: %s cannot be disabled" msgstr "الملحق: %s لا يمكن تعطيله" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:605 msgid "Plugin not customizable" msgstr "لا يمكن تخصيص الملحق" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:606 msgid "Plugin: %s does not need customization" msgstr "الملحق: %s لا يحتاج التخصيص" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:614 msgid "Customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:652 msgid "Cannot remove builtin plugin" msgstr "لم يمكن حذف الملحق المضمن" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:653 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:672 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:684 msgid "You must select a column to delete it" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:677 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:689 msgid "The selected column is not a custom column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:690 #: /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:679 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:691 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:746 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:758 msgid "Error log:" msgstr "سجل الأخطاء:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:765 msgid "Access log:" msgstr "سجل النفاذ:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:781 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:761 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:793 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:340 msgid "Failed to start content server" msgstr "فشل في تشغيل خادم المحتوى" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:805 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:817 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:587 msgid "Select location for books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:812 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:824 msgid "Invalid size" msgstr "حجم غير صالح" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:813 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:825 msgid "The size %s is invalid. must be of the form widthxheight" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:868 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:884 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:889 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:869 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:885 msgid "Invalid database location " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:886 msgid "
Must be a directory." msgstr "
يجب أن يكون دليل." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:890 msgid "Invalid database location.
Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:895 msgid "Must restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:896 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:914 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:930 msgid "Checking database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:934 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:950 msgid "Failed to check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:939 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:955 msgid "Some inconsistencies found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:956 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 " @@ -4490,35 +5045,35 @@ msgid "" "folder directly." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:113 msgid "TabWidget" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:114 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:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:115 msgid "Read metadata only from &file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:116 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:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:117 msgid "&Swap author firstname and lastname" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:118 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" +"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" @@ -4526,346 +5081,380 @@ msgid "" "punctuation, case, etc. Author match is exact." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122 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:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:123 msgid "&Configure metadata from file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:124 msgid "&Adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:125 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:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:126 msgid "Save &cover separately" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:127 msgid "Update &metadata in saved copies" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:128 msgid "Save metadata in &OPF file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:129 msgid "Convert non-English characters to &English equivalents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:130 msgid "Format &dates as:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:131 msgid "File &formats to save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:132 msgid "Replace space with &underscores" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:133 msgid "Change paths to &lowercase" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:134 msgid "&Saving books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:135 +msgid "Preserve device collections." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:136 +msgid "" +"If checked, collections will not be deleted even if a book with changed " +"metadata is resent and the collection is not in the book's metadata. In " +"addition, editing collections in the device view will be enabled. If " +"unchecked, collections will be always reflect only the metadata in the " +"calibre library." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:137 +msgid " " +msgstr " " + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:138 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:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:139 msgid "Sending to &device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:297 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 msgid "Preferences" msgstr "التفضيلات" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:552 msgid "" "&Location of ebooks (The ebooks are stored in folders sorted by author and " "metadata is stored in the file metadata.db)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:553 msgid "Browse for the new database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556 msgid "Download &social metadata (tags/ratings/etc.) by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:557 msgid "&Overwrite author and title by default when fetching metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:558 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:559 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:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:560 msgid " seconds" msgstr " ثانية" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561 msgid "Choose &language (requires restart):" msgstr "إختر ال&لغة (يحتاج إعادة تشغيل):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562 msgid "Normal" msgstr "عادي" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:563 msgid "High" msgstr "مرتفع" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564 msgid "Low" msgstr "منخفض" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:565 msgid "Job &priority:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:566 msgid "Preferred &output format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:567 msgid "Preferred &input format order:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:570 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571 msgid "Enable system &tray icon (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572 msgid "Show ¬ifications in system tray" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 msgid "Show &splash screen at startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574 msgid "Show cover &browser in a separate window (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:560 -msgid "Search as you type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561 -msgid "Automatically send downloaded &news to ebook reader" -msgstr "إرسال الأخبار& التي تم تنزيلها آلياً إلى قارئ الكتب الإلكترونية" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562 -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:563 -msgid "&Number of covers to show in browse mode (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564 -msgid "Toolbar" -msgstr "شريط الأدوات" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:565 -msgid "Large" -msgstr "كبير" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:566 -msgid "Medium" -msgstr "متوسط" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:567 -msgid "Small" -msgstr "صغير" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:568 -msgid "&Button size in toolbar" -msgstr "&حجم الأزرار على شريط الأدوات" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569 -msgid "Show &text in toolbar buttons" -msgstr "إظهار النص& على أزرار شريط الأدوات" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:570 -msgid "Select visible &columns in library view" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572 -msgid "Remove a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574 -msgid "Add a user-defined column" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575 +msgid "Show &average ratings in the tags browser" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:576 -msgid "Edit settings of a user-defined column" +msgid "Search as you type" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 +msgid "Automatically send downloaded &news to ebook reader" +msgstr "إرسال الأخبار& التي تم تنزيلها آلياً إلى قارئ الكتب الإلكترونية" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:578 +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:579 +msgid "&Number of covers to show in browse mode (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:580 +msgid "Toolbar" +msgstr "شريط الأدوات" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:581 +msgid "Large" +msgstr "كبير" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:582 +msgid "Medium" +msgstr "متوسط" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:583 +msgid "Small" +msgstr "صغير" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:584 +msgid "&Button size in toolbar" +msgstr "&حجم الأزرار على شريط الأدوات" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:585 +msgid "Show &text in toolbar buttons" +msgstr "إظهار النص& على أزرار شريط الأدوات" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:586 +msgid "Select visible &columns in library view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:588 +msgid "Remove a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:590 +msgid "Add a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:592 +msgid "Edit settings of a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:595 msgid "Use internal &viewer for:" msgstr "استخدم المستعرض& الداخلي في:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:580 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:596 +msgid "User Interface &layout (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:597 +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:598 +msgid "Disable &animations" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:599 msgid "Add an email address to which to send books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:581 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:600 msgid "&Add email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:582 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:601 msgid "Make &default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 msgid "&Remove email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:584 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:603 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:585 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:604 msgid "&Maximum number of waiting worker processes (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605 msgid "&Check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 msgid "&Install command line tools" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 msgid "Open calibre &configuration directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:589 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 msgid "Limit the max. simultaneous jobs to the available CPU &cores" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:590 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 msgid "Debug &device detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 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:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 msgid "Server &port:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 #: /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:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 #: /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:595 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 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:596 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 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:597 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 msgid "Max. &cover size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 #: /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:599 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 msgid "Max. &OPDS items per query:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 msgid "Max. OPDS &ungrouped items:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:601 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 msgid "&Start Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 msgid "St&op Server" 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:622 msgid "&Test Server" 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:623 msgid "Run server &automatically on startup" 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:624 msgid "View &server logs" 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:625 #: /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 " @@ -4876,33 +5465,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:608 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 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:609 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 msgid "Enable/&Disable plugin" 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:629 msgid "&Customize plugin" 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:630 msgid "&Remove plugin" 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:631 msgid "Add new plugin" 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:632 msgid "Plugin &file:" 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:634 msgid "&Add" msgstr "&إضافة" @@ -4939,10 +5528,11 @@ 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:27 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:833 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:535 +#: /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:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:884 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Date" msgstr "تاريخ" @@ -4958,68 +5548,73 @@ msgstr "" msgid "Create and edit tag-based columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:18 +#: /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:21 +#: /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:24 +#: /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:29 -msgid "Floating point numbers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:31 -msgid "Integers" +#: /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:36 +#: /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:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:64 msgid "No column selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:65 msgid "No column has been selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:69 msgid "Selected column is not a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:100 msgid "No lookup name was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:102 msgid "" -"The label must contain only letters and digits, and start with a letter" +"The label must contain only letters, digits and underscores, and start with " +"a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:111 msgid "No column heading was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:117 msgid "The lookup name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:127 msgid "The heading %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:129 msgid "" "The lookup name must be lower case and cannot contain \":\"s or spaces" msgstr "" @@ -5128,39 +5723,60 @@ msgstr "" msgid "ERROR" msgstr "خطأ" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:69 +msgid "Location" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1058 +msgid "Format" +msgstr "التهيئة" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device_ui.py:50 +msgid "Delete from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:29 +msgid "Author sort" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:47 +msgid "Manage authors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 msgid "Author Sort" msgstr "ترتيب المؤلف" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "ISBN" msgstr "ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:162 msgid "Finding metadata..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:176 msgid "Could not find metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:177 msgid "The metadata download seems to have stalled. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:186 msgid "Warning" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:187 msgid "Could not fetch metadata from:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:191 msgid "No metadata found" msgstr "لم يوجد ميتاداتا" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:192 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -5239,21 +5855,21 @@ 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:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 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:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 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:376 -#: /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:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Rating of this book. 0-5 stars" msgstr "" @@ -5262,7 +5878,7 @@ 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:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid " stars" msgstr " نجمة" @@ -5272,8 +5888,8 @@ 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:382 -#: /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:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 msgid "Open Tag Editor" msgstr "فتح محرر الوسوم" @@ -5301,10 +5917,6 @@ 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:183 -msgid "Automatically number books in this series" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 msgid "" "Remove stored conversion settings for the selected books.\n" @@ -5317,204 +5929,207 @@ 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:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 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:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "&Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:123 msgid "Not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136 msgid "Choose formats for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1391 -msgid "Books" -msgstr "كتب" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 msgid "No permission" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:166 msgid "You do not have permission to read the following files:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:194 msgid "No format selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:205 msgid "Could not read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:206 msgid "Could not read metadata from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:256 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 msgid "Could not read cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:255 msgid "Could not read cover from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:261 msgid "The cover in the %s format is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:298 msgid "Abort the editing of all remaining books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:442 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:439 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:450 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:442 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:521 +msgid "Cannot use tag editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:522 +msgid "The tags editor cannot be used if you have modified the tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:542 msgid "Downloading cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:558 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:563 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:565 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:559 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:566 msgid "Could not fetch cover.
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:556 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:560 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:576 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:572 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:577 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:573 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:610 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:606 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:607 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:708 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:709 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:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 msgid "Edit Meta Information" msgstr "تحرير معلومات الميتا" -#: /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:362 msgid "Meta information" msgstr "معلومات الميتا" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 msgid "Swap the author and title" msgstr "" -#: /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:368 msgid "Author S&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 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:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "Remove unused series (Series that have no books)" 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:386 msgid "IS&BN:" msgstr "IS&BN:" -#: /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:387 msgid "Publishe&d:" 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:390 msgid "dd MMM yyyy" 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:391 msgid "&Date:" msgstr "" -#: /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:392 msgid "&Comments" 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:393 msgid "&Fetch metadata from server" msgstr "" -#: /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:394 msgid "Available Formats" 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:395 msgid "Add a new format for this book to the database" 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:397 msgid "Remove the selected formats for this book from the database." msgstr "حذف التهيئات المختارة لهذا الكتاب من قاعدة البيانات." -#: /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:399 msgid "Set the cover for the book from the selected format" msgstr "" -#: /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:401 msgid "Update metadata from the metadata in the selected format" 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:406 msgid "Reset cover to default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Download &cover" msgstr "" @@ -5795,12 +6410,12 @@ msgid "Choose formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:72 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:76 msgid "Authors" msgstr "المؤلفون" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:101 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:107 msgid "Publishers" msgstr "الناشرون" @@ -5862,7 +6477,7 @@ msgid "Select the content kind of the new category" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:68 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:101 msgid "Are your sure?" msgstr "" @@ -5916,63 +6531,55 @@ msgstr "" msgid "Add tag to available tags and apply it to current book" msgstr "إضافة وسم إلى قائمة الوسوم المتوفرة وعلّم الكتاب الحالي به" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:501 msgid "Item is blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:502 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:66 -msgid "Item already used" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:67 -msgid "The item %s is already used." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:87 msgid "No item selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:88 msgid "You must select one item from the list of Available items." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:97 msgid "No items selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:98 msgid "You must select at least one items from the list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:102 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:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:72 msgid "Category Editor" 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:73 msgid "Items in use" 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:74 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:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:76 msgid "Rename the item in every book where it is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 msgid "Ctrl+S" msgstr "" @@ -6214,11 +6821,11 @@ msgstr "" #: /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:78 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:82 -#: /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:94 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:100 msgid "No match" msgstr "" @@ -6254,54 +6861,209 @@ msgstr "ISBN:" msgid "Regular expression (?P)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:36 +msgid "Save single format to disk..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:52 +msgid "Edit metadata individually" +msgstr "تحرير الميتاداتا فردياً" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:55 +msgid "Edit metadata in bulk" +msgstr "تحرير الميتاداتا جملةً" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:58 +msgid "Download metadata and covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:61 +msgid "Download only metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:63 +msgid "Download only covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:66 +msgid "Download only social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:72 +msgid "Merge into first selected book - delete others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:75 +msgid "Merge into first selected book - keep others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:83 +msgid "Add books from a single directory" +msgstr "إضافة كتب من دليل واحد" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:85 +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/init.py:89 +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/init.py:92 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:283 +msgid "Save to disk" +msgstr "حفظ إلى القرص" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104 +msgid "Save to disk in a single directory" +msgstr "حفظ إلى القرص في دليل واحد" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:402 +msgid "Save only %s format to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:405 +msgid "Save only %s format to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:289 +msgid "View" +msgstr "عرض" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:120 +msgid "View specific format" +msgstr "عرض تهيئة معينة" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126 +msgid "Remove selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:128 +msgid "Remove files of a specific format from selected books.." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:131 +msgid "Remove all formats from selected books, except..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:134 +msgid "Remove covers from selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:137 +msgid "Remove matching books from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:154 +msgid "Convert individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:156 +msgid "Bulk convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:160 +msgid "Create catalog of books in your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:168 +msgid "Run welcome wizard" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:200 +msgid "Similar books..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:232 +msgid "Add books to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:248 +msgid "Manage collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:328 +msgid "Cover Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:346 +msgid "Tag Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:403 +msgid "Book Details" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:60 msgid "Job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:61 msgid "Status" msgstr "الحالة" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:62 msgid "Progress" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:63 msgid "Running time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:75 msgid "There are %d running jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:101 msgid "Unknown job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:82 msgid "There are %d waiting jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:212 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:219 msgid "Cannot kill job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:217 msgid "Cannot kill jobs that communicate with the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:220 msgid "Job has already run" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:248 msgid "Unavailable" msgstr "غير متوفر" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:280 +msgid "Jobs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:298 +msgid "Click to see list of active jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 msgid " - Jobs" msgstr "" @@ -6313,112 +7075,90 @@ msgstr "" msgid "Y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 msgid "On Device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 msgid "Rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:285 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:296 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1003 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1007 -#: /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:414 -msgid "None" -msgstr "بدون" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:302 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 msgid "Book %s of %s." msgstr "كتاب %s لـ%s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:639 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1071 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:674 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1176 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:399 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:830 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:881 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:834 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:885 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:835 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 -msgid "Collections" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:993 -msgid "Format" -msgstr "التهيئة" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1053 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1156 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1056 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1159 msgid "Double click to edit me

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:110 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:115 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:116 msgid "Ascending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:119 msgid "Descending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:131 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:134 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:475 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:524 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:525 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -6514,282 +7254,253 @@ msgstr "" msgid "Do not check for updates" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:67 -msgid "Choose a location for your calibre e-book library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:76 -msgid "Failed to create library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:77 -msgid "Failed to create calibre library at: %r. Aborting." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 -msgid "Initializing user interface..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 -msgid "Repairing failed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 -msgid "The database repair failed. Starting with a new empty library." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:595 msgid "Calibre Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:86 +msgid "Choose a location for your calibre e-book library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +msgid "Failed to create library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +msgid "Failed to create calibre library at: %r." +msgstr "" + +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 +msgid "Initializing user interface..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Repairing failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:179 +msgid "The database repair failed. Starting with a new empty library." +msgstr "" + +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:194 msgid "Bad database location %r. calibre will now quit." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:207 msgid "Corrupted database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:208 msgid "" "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." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:206 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:227 msgid "" "Bad database location %r. Will start with a new, empty calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:238 msgid "Starting %s: Loading books..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:283 msgid "If you are sure it is not running" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:285 msgid "Cannot Start " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:286 msgid "%s is already running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:289 msgid "may be running in the system tray, in the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:291 msgid "upper right region of the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:293 msgid "lower right region of the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:296 msgid "try rebooting your computer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:290 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:302 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:253 msgid "calibre" msgstr "كاليبر" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 msgid "&Restrict to:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "set in ui.py" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 msgid "Advanced search" msgstr "بحث متقدّم" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "Alt+S" msgstr "Alt+S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "&Search:" msgstr "&بحث:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:404 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 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/main_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "Choose saved search or enter name for new saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Copy current search text (instead of search name)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 msgid "Save current search under the name shown in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Delete current saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:415 -msgid "Sort by &popularity" -msgstr "ترتيب حسب الش&هرة" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:416 -msgid "Match any" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:417 -msgid "Match all" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:418 -msgid "Create, edit, and delete user categories" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:419 -msgid "Manage &user categories" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "Add books" msgstr "إضافة كتب" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:421 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:422 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "Remove books" msgstr "حذف كتب" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Del" msgstr "Del" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:425 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "Edit meta information" msgstr "تحرير معلومات الميتا" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:426 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "Merge book records" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "M" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "Send to device" msgstr "إرسال لجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:430 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:355 -msgid "Save to disk" -msgstr "حفظ إلى القرص" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:431 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:284 msgid "S" msgstr "S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:432 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:285 msgid "Fetch news" msgstr "احصل على الأخبار" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:286 msgid "F" msgstr "F" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:287 msgid "Convert E-books" msgstr "تحويل الكتاب الإلكتروني" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:435 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:288 msgid "C" msgstr "C" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:436 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:369 -msgid "View" -msgstr "عرض" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:290 msgid "V" msgstr "V" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:438 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:291 msgid "Open containing folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:439 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:292 msgid "Show book details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:440 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:293 msgid "Books by same author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:294 msgid "Books in this series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:295 msgid "Books by this publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:296 msgid "Books with the same tags" msgstr "كتب بنفس الوسوم" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:298 msgid "Configure calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:299 msgid "Ctrl+P" msgstr "" @@ -6819,15 +7530,35 @@ msgstr "" msgid "No matches found for this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:260 msgid "Search" msgstr "بحث" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:313 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:355 +msgid "Search (For Advanced Search click the button to the left)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:392 +msgid "Saved Searches" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:46 +msgid "({0} of {1})" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:52 +msgid "(all books)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:54 +msgid "({0} of all)" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:58 msgid "Press a key..." msgstr "" @@ -6888,82 +7619,75 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:24 -msgid "Jobs:" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:191 +msgid "Rename '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:32 -msgid "Click to see list of active jobs." +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:195 +msgid "Edit sort for '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:83 -msgid "Hide Book Details" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:83 -msgid "Show Book Details" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:84 -msgid "Hide Tag Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:84 -msgid "Show Tag Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:85 -msgid "Hide Cover Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:85 -msgid "Show Cover Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:95 -msgid "Side bar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:135 -msgid "Cover browser could not be loaded: " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:142 -msgid "Rename" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:200 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:203 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:207 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:161 -msgid "Manage " +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:218 +msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:221 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:232 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:329 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:433 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:271 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:420 -msgid "The name %s is already used." +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 +msgid "Duplicate search name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 +msgid "The saved search name %s is already used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:768 +msgid "Sort by name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:768 +msgid "Sort by popularity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:769 +msgid "Sort by average rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:775 +msgid "Match all" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:775 +msgid "Match any" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:780 +msgid "Manage &user categories" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:63 @@ -7005,619 +7729,112 @@ msgid "" "reconvert them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:70 -msgid "Save single format to disk..." -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:162 -msgid "Search (For Advanced Search click the button to the left)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168 -msgid "Saved Searches" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:191 -msgid "Error communicating with device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:208 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:164 msgid "&Donate to support calibre" msgstr "تبرع& لدعم كاليبر" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:172 msgid "&Restart" msgstr "إعادة تشغيل&" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:206 msgid "

For help see the: User Manual
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:212 msgid "%s: %s by Kovid Goyal %%(version)s
%%(device)s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:281 -msgid "Edit metadata individually" -msgstr "تحرير الميتاداتا فردياً" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:283 -msgid "Edit metadata in bulk" -msgstr "تحرير الميتاداتا جملةً" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:285 -msgid "Download metadata and covers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:286 -msgid "Download only metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:287 -msgid "Download only covers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:288 -msgid "Download only social metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:292 -msgid "Merge into first selected book - delete others" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:294 -msgid "Merge into first selected book - keep others" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:301 -msgid "Add books from a single directory" -msgstr "إضافة كتب من دليل واحد" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 -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/ui.py:305 -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/ui.py:308 -msgid "Add Empty book. (Book entry with no formats)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:356 -msgid "Save to disk in a single directory" -msgstr "حفظ إلى القرص في دليل واحد" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:357 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2299 -msgid "Save only %s format to disk" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:360 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2302 -msgid "Save only %s format to disk in a single directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:370 -msgid "View specific format" -msgstr "عرض تهيئة معينة" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:375 -msgid "Remove selected books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:377 -msgid "Remove files of a specific format from selected books.." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:379 -msgid "Remove all formats from selected books, except..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:381 -msgid "Remove covers from selected books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:420 -msgid "Convert individually" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:421 -msgid "Bulk convert" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:424 -msgid "Create catalog of books in your calibre library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:440 -msgid "Run welcome wizard" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:480 -msgid "Similar books..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:237 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:689 -msgid "Select folder to open as device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:800 -msgid "Browse by covers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:870 -msgid "({0} of {1})" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:875 -msgid "(all books)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:877 -msgid "({0} of all)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1000 -msgid "Device: " -msgstr "الجهاز: " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1002 -msgid " detected." -msgstr " تم كشفه." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1034 -msgid "Connected " -msgstr "متصل " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1046 -msgid "Device database corrupted" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1047 -msgid "" -"\n" -"

The database of books on the reader is corrupted. Try the " -"following:\n" -"

    \n" -"
  1. Unplug the reader. Wait for it to finish regenerating " -"the database (i.e. wait till it is ready to be used). Plug it back in. Now " -"it should work with %(app)s. If not try the next step.
  2. \n" -"
  3. Quit %(app)s. Find the file media.xml in the reader's " -"main memory. Delete it. Unplug the reader. Wait for it to regenerate the " -"file. Re-connect it and start %(app)s.
  4. \n" -"
\n" -" " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1110 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1287 -msgid "Use library only" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1111 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1288 -msgid "User annotations generated from main library only" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1118 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1604 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1661 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1699 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1720 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1850 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1915 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2033 -msgid "No books selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1119 -msgid "No books selected to fetch annotations from" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1144 -msgid "Merging user annotations into database" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1172 -msgid "%s
Last Page Read: %d (%d%%)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1178 -msgid "%s
Last Page Read: Location %d (%d%%)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1197 -msgid "Location %d • %s
%s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1206 -msgid "Page %d • %s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1211 -msgid "Location %d • %s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1331 -msgid "How many empty books?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1332 -msgid "How many empty books should be added?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1380 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1431 -msgid "Uploading books to device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1392 -msgid "EPUB Books" -msgstr "كتب EPUB" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1393 -msgid "LRF Books" -msgstr "كتب LRF" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1394 -msgid "HTML Books" -msgstr "كتب HTML" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1395 -msgid "LIT Books" -msgstr "كتب LIT" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1396 -msgid "MOBI Books" -msgstr "كتب MOBI" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1397 -msgid "Topaz books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1398 -msgid "Text books" -msgstr "كتب نصّية" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1399 -msgid "PDF Books" -msgstr "كتب PDF" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1400 -msgid "Comics" -msgstr "الرسومات" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1401 -msgid "Archives" -msgstr "أرشيفات" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1405 -msgid "Supported books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1440 -msgid "Merged some books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1441 -msgid "" -"Some duplicates were found and merged into the following existing books:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1450 -msgid "Failed to read metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1451 -msgid "Failed to read metadata from the following" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1471 -msgid "Cannot delete" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1474 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2177 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2202 -msgid "No book selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1484 -msgid "Choose formats to be deleted" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1502 -msgid "Choose formats not to be deleted" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1540 -msgid "" -"The selected books will be permanently deleted and the files removed " -"from your computer. Are you sure?" -msgstr "الكتب المختارة سوف تحذف تماماً من حاسوبك. هل أنت متأكّد؟" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1557 -msgid "" -"The selected books will be permanently deleted from your device. Are " -"you sure?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1572 -msgid "Deleting books from device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1603 -msgid "Cannot download metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1619 -msgid "social metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1621 -msgid "covers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1621 -msgid "metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1623 -msgid "Downloading %s for %d book(s)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1645 -msgid "Failed to download some metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646 -msgid "Failed to download metadata for the following:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1649 -msgid "Failed to download metadata:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1660 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1698 -msgid "Cannot edit metadata" -msgstr "لا يمكن تحرير الميتاداتا" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1719 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1722 -msgid "Cannot merge books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1723 -msgid "At least two books must be selected for merging" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1727 -msgid "" -"All book formats and metadata from the selected books will be added to the " -"first selected book.

The second and subsequently selected " -"books will not be deleted or changed.

Please confirm you want to " -"proceed." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1738 -msgid "" -"All book formats and metadata from the selected books will be merged into " -"the first selected book.

After merger the second and " -"subsequently selected books will be deleted.

All book formats " -"of the first selected book will be kept and any duplicate formats in the " -"second and subsequently selected books will be permanently deleted " -"from your computer.

Are you sure you want to proceed?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1750 -msgid "" -"You are about to merge more than 5 books. Are you sure you want to " -"proceed?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1849 -msgid "Cannot save to disk" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1852 -msgid "Choose destination directory" -msgstr "إختيار دليل الوجهة" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1885 -msgid "Error while saving" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1886 -msgid "There was an error while saving." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1893 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1894 -msgid "Could not save some books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1895 -msgid "Click the show details button to see which ones." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1916 -msgid "No books selected to generate catalog for" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1933 -msgid "Generating %s catalog..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1939 -msgid "" -"No books to catalog\n" -"Check exclude tags" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1949 -msgid "Catalog generated." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1952 -msgid "Export Catalog Directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1953 -msgid "Select destination for %s.%s" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1967 -msgid "Fetching news from " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1981 -msgid " fetched." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2032 -msgid "Cannot convert" -msgstr "لا يمكن تحويله" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2061 -msgid "Starting conversion of %d book(s)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2177 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2235 -msgid "Cannot view" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2191 -msgid "Multiple Books Selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2192 -msgid "" -"You are attempting to open %d books. Opening too many books at once can be " -"slow and have a negative effect on the responsiveness of your computer. Once " -"started the process cannot be stopped until complete. Do you wish to " -"continue?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2201 -msgid "Cannot open folder" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2236 -msgid "%s has no available formats." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2277 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2282 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:389 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2278 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:385 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2283 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:390 msgid "Cannot configure before calibre is restarted." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2334 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:433 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2335 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:434 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2385 -msgid "Failed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2391 -msgid "Error talking to device" -msgstr "خطأ في الاتصال بالجهاز" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2392 -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/ui.py:2415 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2443 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:514 msgid "Conversion Error" msgstr "خطأ في التحويل" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2416 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:487 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:2429 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:500 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2444 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2491 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:555 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." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2516 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:580 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2519 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583 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:2523 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:587 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2575 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:640 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2594 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:52 msgid "" "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2602 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:60 msgid "Update available" msgstr "تحديث متوفر" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2603 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:61 msgid "" "%s has been updated to version %s. See the new features. Visit the download page?" @@ -8084,82 +8301,94 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 msgid "Copy Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 msgid "Paste Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:270 msgid "" "Library\n" "%d\n" "books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:271 msgid "" "Reader\n" "%s\n" "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:272 msgid "" "Card A\n" "%s\n" "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:273 msgid "" "Card B\n" "%s\n" "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:277 msgid "Click to see the books available on your computer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 msgid "Click to see the books in the main memory of your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:281 msgid "Click to see the books on storage card A in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:282 msgid "Click to see the books on storage card B in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:290 msgid "Books located at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:548 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:549 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:550 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:551 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:552 msgid "Title Case" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:974 +msgid "Drag to resize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1006 +msgid "Show" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1012 +msgid "Hide" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:367 msgid "" "If you use the WordPlayer e-book app on your Android phone, you can access " @@ -8420,48 +8649,48 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:270 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:230 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:273 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:233 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:276 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:236 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:279 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:280 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:239 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:240 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:430 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:440 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 msgid "no" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:430 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:440 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 msgid "unchecked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:433 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:443 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 msgid "checked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:433 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:443 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 msgid "empty" msgstr "" @@ -8842,7 +9071,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/cli.py:655 -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:503 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:505 msgid "Show detailed output information. Useful for debugging" msgstr "" @@ -8850,7 +9079,7 @@ msgstr "" msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:688 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:710 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -8862,17 +9091,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:699 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:721 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:710 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:732 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:729 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:751 msgid "" "\n" " %prog custom_columns [options]\n" @@ -8881,19 +9110,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:758 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:748 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:770 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:750 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:772 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:756 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:778 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -8903,15 +9132,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:764 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:796 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:809 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -8923,43 +9152,47 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:487 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:70 +msgid "%sAverage rating is %3.1f" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:545 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:489 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:547 msgid "Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:491 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:549 msgid "Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1542 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1770 msgid "

Migrating old database to ebook library in %s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1571 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1799 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1588 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1681 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1909 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1720 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1950 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1742 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972 msgid "Checked id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:111 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 msgid "Ratings" msgstr "" @@ -9145,43 +9378,43 @@ msgstr "" msgid "Write process PID to the specified file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:108 msgid "%d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:124 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:127 msgid "%d items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:141 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144 msgid "RATING: %s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:147 msgid "TAGS: %s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:148 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:151 msgid "SERIES: %s [%s]
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:189 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:192 msgid "Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:228 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:231 msgid "Books in your library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:234 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:237 msgid "By " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:235 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:238 msgid "Books sorted by " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:535 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Newest" msgstr "" @@ -9255,6 +9488,10 @@ msgstr "" msgid "User-created tag browser categories" msgstr "" +#: /home/kovid/work/calibre/src/calibre/utils/config.py:702 +msgid "Preserve all collections even if not in library metadata." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43 msgid "Waiting..." msgstr "" @@ -9324,34 +9561,38 @@ msgid "English (Pakistan)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:106 -msgid "English (Singapore)" +msgid "English (Israel)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:107 -msgid "English (Yemen)" +msgid "English (Singapore)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:108 -msgid "English (Ireland)" +msgid "English (Yemen)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:109 -msgid "English (China)" +msgid "English (Ireland)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:110 -msgid "Spanish (Paraguay)" +msgid "English (China)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 -msgid "German (AT)" +msgid "Spanish (Paraguay)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:112 -msgid "Dutch (NL)" +msgid "German (AT)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:113 +msgid "Dutch (NL)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:114 msgid "Dutch (BE)" msgstr "" @@ -9408,97 +9649,97 @@ msgid "" "Do not download latest version of builtin recipes from the calibre server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:43 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:44 msgid "Unknown News Source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:595 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:608 msgid "The \"%s\" recipe needs a username and password." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:692 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:706 msgid "Download finished" msgstr "تم التنزيل" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:694 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:708 msgid "Failed to download the following articles:" msgstr "فشل تنزيل المقالات التالية:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:700 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:714 msgid "Failed to download parts of the following articles:" msgstr "فشل تنزيل أجزاء من المقالات التالية:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:716 msgid " from " msgstr " من " -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:704 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:821 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:807 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:842 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:828 msgid "Fetching feeds..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:847 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:833 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:853 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:839 msgid "Trying to download cover..." msgstr "محاولة تنزيل الغلاف..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:855 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:841 msgid "Generating masthead..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:936 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:922 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:952 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:938 msgid "Feeds downloaded to %s" msgstr "تم تنزيل التلقيم إلى %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:962 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:948 msgid "Could not download cover: %s" msgstr "لم يتمكّن من تنزيل الغلاف: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:974 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:960 msgid "Downloading cover from %s" msgstr "يتم تنزيل الغلاف من %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1009 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1000 msgid "Masthead image downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1205 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1190 msgid "Untitled Article" msgstr "مقالة بدون عنوان" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1276 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1261 msgid "Article downloaded: %s" msgstr "المقالة منزّلة: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1287 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1272 msgid "Article download failed: %s" msgstr "فشل تنزيل المقالة: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1304 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1289 msgid "Fetching feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1451 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1436 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1467 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1452 msgid "" "You do not have permission to download this issue. Either your subscription " "has expired or you have exceeded the maximum allowed downloads for today." @@ -9510,64 +9751,64 @@ msgstr "أنت" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:73 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:82 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:181 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:183 msgid "Scheduled" msgstr "تم جدولته" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:182 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:184 msgid "Custom" msgstr "مخصّص" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:480 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 msgid "" "%prog URL\n" "\n" "Where URL is for example http://google.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:483 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:485 msgid "Base directory into which URL is saved. Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:486 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:488 msgid "" "Timeout in seconds to wait for a response from the server. Default: %default " "s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:489 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:491 msgid "" "Maximum number of levels to recurse i.e. depth of links to follow. Default " "%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:492 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 msgid "" "The maximum number of files to download. This only applies to files from tags. Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 msgid "" "Minimum interval in seconds between consecutive fetches. Default is %default " "s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 msgid "" "The character encoding for the websites you are trying to download. The " "default is to try and guess the encoding." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:500 msgid "" "Only links that match this regular expression will be followed. This option " "can be specified multiple times, in which case as long as a link matches any " "one regexp, it will be followed. By default all links are followed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:500 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:502 msgid "" "Any link that matches this regular expression will be ignored. This option " "can be specified multiple times, in which case as long as any regexp matches " @@ -9576,7 +9817,7 @@ msgid "" "applied first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:502 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:504 msgid "Do not download CSS stylesheets." msgstr "" @@ -10014,6 +10255,9 @@ msgstr "" #~ msgstr "" #~ "حين يوجد، استخدم معلومات ترتيب المؤلف لإنشاء ميتاداتا المؤلف في Mobipocket." +#~ msgid "Sort by &popularity" +#~ msgstr "ترتيب حسب الش&هرة" + #~ msgid "Automatic &Table of Contents" #~ msgstr "قائمة المحتويات& المنشئة آلياً" @@ -10048,6 +10292,9 @@ msgstr "" #~ msgid "A comma separated list of tags to set" #~ msgstr "ضبط قائمة من الوسوم المفرقة بفاصلة" +#~ msgid "Sort tags list by popularity" +#~ msgstr "ترتيب الوسوم حسب الشهرة" + #~ msgid "Remove &first image from source file" #~ msgstr "حذف الصورة الأو&لى من ملف المصدر" diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index 98f48ea46d..36c2679df4 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-21 22:47+0000\n" -"PO-Revision-Date: 2010-05-21 07:29+0000\n" -"Last-Translator: Kovid Goyal \n" +"POT-Creation-Date: 2010-07-03 01:21+0000\n" +"PO-Revision-Date: 2010-07-05 07:09+0000\n" +"Last-Translator: Fike \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-05-22 03:55+0000\n" +"X-Launchpad-Export-Date: 2010-07-06 03:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -26,39 +26,40 @@ msgstr "No fa absolutament res" #: /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:54 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:75 #: /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/books.py:58 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:204 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:466 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:396 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:101 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:428 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:329 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:332 +#: /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/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:230 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:261 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:264 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:364 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:235 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:276 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:279 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:390 +#: /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 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:46 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:317 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:62 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:118 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:120 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:329 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:444 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:912 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:945 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1057 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:28 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -74,9 +75,9 @@ msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:818 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:909 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:914 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:980 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:910 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:915 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:137 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:139 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:108 @@ -100,50 +101,53 @@ msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:63 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:81 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:82 -#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:87 -#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:88 +#: /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:233 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:235 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:286 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:107 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:574 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:583 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:862 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:460 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:419 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:441 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:969 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1096 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1694 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1697 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:815 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:818 +#: /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:22 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:903 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1192 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1195 +#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:185 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:311 +#: /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:248 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:260 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:680 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:717 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1111 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1113 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1235 -#: /home/kovid/work/calibre/src/calibre/library/server.py:671 -#: /home/kovid/work/calibre/src/calibre/library/server.py:747 -#: /home/kovid/work/calibre/src/calibre/library/server.py:794 -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:114 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:335 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:347 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:950 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1019 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1620 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1622 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1744 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:268 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:134 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 +#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:68 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:115 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:64 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:78 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:47 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:50 msgid "Unknown" @@ -161,13 +165,13 @@ msgstr "Tipus de fitxer" msgid "Metadata reader" msgstr "Lector de metadades" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:237 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:235 msgid "Metadata writer" msgstr "Escriptor de metadades" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:267 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:263 msgid "Catalog generator" -msgstr "" +msgstr "Generador del Catàleg" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" @@ -179,7 +183,7 @@ msgstr "" "contingui els fitxers enllaçats. Aquest connector s'executat cada vegada que " "s'afegeix un fitxer HTML a la biblioteca." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:50 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -187,7 +191,7 @@ msgstr "" "El joc de caràcters dels fitxer HTML d'entrada. Les opcions comuns inclouen: " "cp1252, latin1, iso-8859-1 i utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:57 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 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 " @@ -197,49 +201,49 @@ msgstr "" "directoris pmlname_ing o images. Aquest connector s'executa cada vegada que " "afegiu un fitxer PML a la biblioteca." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:89 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:90 msgid "Extract cover from comic files" msgstr "Extreu la portada dels fitxers de còmic" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:116 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:127 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:139 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:149 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:170 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:180 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:190 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:200 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:210 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:220 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:231 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:242 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:254 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:275 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:286 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:296 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:306 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:117 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:128 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:140 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:150 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:160 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:171 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:181 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:191 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:201 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:211 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:221 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:232 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:243 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:255 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:276 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:287 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:297 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:307 msgid "Read metadata from %s files" msgstr "Llegeix les metadades dels fitxers %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:265 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:266 msgid "Read metadata from ebooks in RAR archives" msgstr "Llegeix les metadades dels llibres electrònics en arxius RAR" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:317 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:318 msgid "Read metadata from ebooks in ZIP archives" msgstr "Llegeix les metadades dels llibres electrònics en arxius ZIP" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:328 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:338 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:348 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:370 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:381 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:391 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:331 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:341 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:351 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:373 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:384 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:394 msgid "Set metadata in %s files" msgstr "Estableix metadades als fitxers %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:359 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:362 msgid "Set metadata from %s files" msgstr "Estableix metadades des dels fitxers %s" @@ -285,7 +289,7 @@ msgstr "" "sabeu res del document d'entrada." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:57 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:258 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:412 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -297,70 +301,70 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Aquest perfil és adient per al SONY PRS-300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:78 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:292 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:447 msgid "This profile is intended for the SONY PRS-900." msgstr "Aquest perfil és adient per al SONY PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:322 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:477 msgid "This profile is intended for the Microsoft Reader." msgstr "Aquest perfil és adient per al Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:97 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:333 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:488 msgid "This profile is intended for the Mobipocket books." msgstr "Aquest perfil és adient per a llibres Mobipocket." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:110 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:346 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:501 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Aquest perfil és adient per al Hanlin V3 i els seus clons." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:122 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:358 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Aquest perfil és adient per al Hanlin V5 i els seus clons." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:132 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:521 msgid "This profile is intended for the Cybook G3." msgstr "Aquest perfil és adient per al Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:145 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:379 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:534 msgid "This profile is intended for the Cybook Opus." msgstr "Aquest perfil és adient per al Cybook Opus" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:157 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:390 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:545 msgid "This profile is intended for the Amazon Kindle." msgstr "Aquest perfil és adient per a l'Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:169 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:425 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:580 msgid "This profile is intended for the Irex Illiad." msgstr "Aquest perfil és adient per a l'Irex Illiad" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:181 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:438 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:593 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Aquest perfil és adient per al IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:452 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:607 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Aquest perfil és adient per al IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:206 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:466 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:621 msgid "This profile is intended for the B&N Nook." msgstr "Aquest perfil és adient per al B&N Nook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:226 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:228 msgid "Output profile" msgstr "Perfil de sortida" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:230 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:232 msgid "" "This profile tries to provide sane defaults and is useful if you want to " "produce a document intended to be read at a computer or on a range of " @@ -370,24 +374,25 @@ msgstr "" "si voleu generar un document que es pugui llegir en un PC o en un conjunt " "ampli de dispositius diferents." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:248 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:257 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" +"Destinats als dispositius d'IPAD i similars amb una resolució de 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:271 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:425 msgid "This profile is intended for the Kobo Reader." msgstr "Aquest perfil és adient per al lector Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:283 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:438 msgid "This profile is intended for the SONY PRS-300." msgstr "Aquest perfil és adient per al SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:301 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:456 msgid "This profile is intended for the 5-inch JetBook." msgstr "Aquest perfil és adient per al 5-inch JetBook" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:310 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:465 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -395,7 +400,7 @@ msgstr "" "Aquest perfil és adient per al la línia PRS de SONY. Els models 500/505/700, " "etc., en mode apaïsat. Sobretot és útil per als còmics." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:408 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Aquest perfil és adient per a l'Amazon Kindle DX." @@ -415,15 +420,19 @@ msgstr "Personalització del connector local" msgid "Disabled plugins" msgstr "Connectors inhabilitats" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:77 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 +msgid "Enabled plugins" +msgstr "Connectors permesos" + +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:83 msgid "No valid plugin found in " msgstr "No s'ha trobat cap connector vàlid a " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:278 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:460 msgid "Initialization of plugin %s failed with traceback:" msgstr "No s'ha pogut inicialitzar el connector %s i s'ha generat la traça:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:493 msgid "" " %prog options\n" "\n" @@ -435,18 +444,18 @@ msgstr "" " Personalitzeu el calibre carregant connectors externs.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:439 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:499 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "" "Afegeix un connector especificiant el camí al fitxer ZIP que el conté" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:441 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" "Suprimeix un connector personalitzat per nom. No té cap efecte als " "complements integrats" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:443 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:503 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." @@ -454,15 +463,15 @@ msgstr "" "Personalitza el connector. Especifiqueu el nom del connector i el text que " "desitgeu, separats per una coma." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:445 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:505 msgid "List all installed plugins" msgstr "Fes una llista amb tots els connectors instal·lats" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:447 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:507 msgid "Enable the named plugin" msgstr "Habilita el connector anomenat" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:449 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:509 msgid "Disable the named plugin" msgstr "Inhabilita el connector anomenat" @@ -470,7 +479,7 @@ msgstr "Inhabilita el connector anomenat" msgid "Communicate with Android phones." msgstr "Estableix comunicació amb telèfons Android" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:39 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:45 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -479,10 +488,80 @@ msgstr "" "dispositiu. S'usarà el primer directori del llistat que ja existeixi al " "dispositiu" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:67 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:77 msgid "Communicate with S60 phones." msgstr "Estableix comunicació amb els telèfons S60." +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:87 +msgid "Communicate with iTunes/iBooks." +msgstr "Comunicar-se amb iTunes/iBooks." + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:93 +msgid "Apple device detected, launching iTunes, please wait ..." +msgstr "Dispositiu Apple detectat, engegant iTunes, esperi si us plau ..." + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:246 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:249 +msgid "Updating device metadata listing..." +msgstr "Actualitzant la llista de metadades del dispositiu..." + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:323 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:921 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:957 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2791 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2830 +msgid "%d of %d" +msgstr "%d de %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:2836 +msgid "finished" +msgstr "finalitzat" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:544 +msgid "Use Series as Category in iTunes/iBooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:546 +msgid "Cache covers from iTunes/iBooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:558 +msgid "" +"Some books not found in iTunes database.\n" +"Delete using the iBooks app.\n" +"Click 'Show Details' for a list." +msgstr "" +"Alguns llibres no s'han trobat a la base de dades de l'iTunes.\n" +"Elimina'ls utilitzant l'aplicació de l'iBooks.\n" +"Clic a 'Veure Detalls' per a més informació." + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:886 +msgid "" +"Some cover art could not be converted.\n" +"Click 'Show Details' for a list." +msgstr "" +"Varies portades no s'han pogut convertir.\n" +"Clic a 'Veure Detalls' per a més informació." + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2471 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:807 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:813 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:239 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:167 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:180 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1504 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:128 +msgid "News" +msgstr "Notícies" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2698 +msgid "Communicate with iTunes." +msgstr "Comunica't amb iTunes" + #: /home/kovid/work/calibre/src/calibre/devices/binatone/driver.py:17 msgid "Communicate with the Binatone Readme eBook reader." msgstr "" @@ -508,6 +587,14 @@ msgstr "" msgid "Communicate with the EB600 eBook reader." msgstr "Estableix comunicació amb el lector de llibres electrònics EB600" +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:193 +msgid "Communicate with the Astak Mentor EB600" +msgstr "Comunica't amb l'Astak Mentor EB600" + +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:216 +msgid "Communicate with the PocketBook 301 reader." +msgstr "Comunica't amb el lector PocketBook 301" + #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" msgstr "Entourage Edge" @@ -521,35 +608,61 @@ msgstr "" msgid "Communicate with the ESlick eBook reader." msgstr "Estableix comunicació amb el lector de llibres electrònics ESlick." +#: /home/kovid/work/calibre/src/calibre/devices/eslick/driver.py:49 +msgid "Communicate with the Sigmatek eBook reader." +msgstr "Comunicar amb el Sigmatek eBook reader." + +#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:16 +#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:30 +msgid "Use an arbitrary folder as a device." +msgstr "Utilitzar un directori arbitrari per al dispositiu." + +#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:26 +#: /home/kovid/work/calibre/src/calibre/devices/interface.py:23 +msgid "Device Interface" +msgstr "Interfície del dispostiu" + #: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:19 msgid "Communicate with Hanlin V3 eBook readers." msgstr "" "Estableix comunicació amb el lector de llibres electrònics Hanlin V3." -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:87 msgid "Communicate with Hanlin V5 eBook readers." msgstr "" "Estableix comunicació amb el lector de llibres electrònics Hanlin V5." -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:114 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:106 msgid "Communicate with the BOOX eBook reader." msgstr "Estableix comunicació amb el lector de llibres electrònics BOOX." +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:121 +msgid "" +"Comma separated list of directories to send e-books to on the device. The " +"first one that exists will be used." +msgstr "" +"Llista separada per comes dels directoris als quals enviar llibres " +"electrònics en el dispositiu. S'usarà el primer que existeixi." + #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "" "Estableix comunicació amb el lector de llibres electrònics Hanvon N520." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:41 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:40 +msgid "Communicate with The Book reader." +msgstr "Comunicar-se amb el lector de llibres electrònics." + +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:51 msgid "Communicate with the SpringDesign Alex eBook reader." msgstr "" "Estableix comunicació amb el lector de llibres electrònics SpringDesign Alex." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:67 msgid "Communicate with the Azbooka" -msgstr "" +msgstr "Comunicar-se amb Azbooka" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:70 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:80 msgid "Communicate with the Elonex EB 511 eBook reader." msgstr "" "Estableix comunicació amb el lector de llibres electrònics Elonex EB 511." @@ -561,14 +674,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17 #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:29 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:38 msgid "John Schember" msgstr "John Schember" -#: /home/kovid/work/calibre/src/calibre/devices/interface.py:23 -msgid "Device Interface" -msgstr "Interfície del dispostiu" - #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:16 msgid "Communicate with the IRex Digital Reader 1000 eBook reader." msgstr "" @@ -590,29 +699,67 @@ msgstr "" msgid "Communicate with the JetBook eBook reader." msgstr "Estableix comunicació amb el lector de llibres electrònics JetBook." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:21 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:42 msgid "Communicate with the Kindle eBook reader." msgstr "Estableix comunicació amb el lector de llibres electrònics Kindle" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:152 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:169 msgid "Communicate with the Kindle 2 eBook reader." msgstr "Estableix comunicació amb el lector de llibres electrònics Kindle 2" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:162 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:210 msgid "Communicate with the Kindle DX eBook reader." msgstr "Estableix comunicació amb el lector de llibres electrònics Kindle DX" +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:22 +msgid "Communicate with the Kobo Reader" +msgstr "Comunica amb el lector Kobo Reader" + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:51 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:54 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:157 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:64 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:67 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:130 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:137 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:160 +msgid "Getting list of books on device..." +msgstr "S'està obtenint el llistat de llibres disponibles al dispositiu..." + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:218 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:258 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:244 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:262 +msgid "Removing books from device..." +msgstr "S'estan suprimint els llibres del dispositiu..." + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:262 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:274 +msgid "Removing books from device metadata listing..." +msgstr "S'estan suprimint llibres del llistat de metadades del dispositiu..." + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:308 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:208 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:238 +msgid "Adding books to device metadata listing..." +msgstr "S'estan afegint llibres al llistat de metadades del dispositiu..." + #: /home/kovid/work/calibre/src/calibre/devices/misc.py:15 msgid "Communicate with the Palm Pre" msgstr "Comunica amb el Palm Pre" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:35 -msgid "Communicate with the Kobo Reader" -msgstr "Comunica amb el lector Kobo Reader" - -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:56 msgid "Communicate with the Booq Avant" -msgstr "" +msgstr "Comunicar-se amb Booq Avant" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:55 +msgid "Communicate with the Sweex MM300" +msgstr "Comunicar-se amb el Sweex MM300" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." @@ -622,6 +769,10 @@ msgstr "Estableix comunicació amb la tauleta d'Internet Nokia 770." msgid "Communicate with the Nokia 810 internet tablet." msgstr "Estableix comunicació amb la tauleta d'Internet Nokia 810." +#: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:74 +msgid "Communicate with the Nokia E52" +msgstr "Comunicar-se amb el Nokia E52" + #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:20 msgid "The Nook" msgstr "El Nook" @@ -639,27 +790,11 @@ msgid "Communicate with the Sony PRS-500 eBook reader." msgstr "" "Estableix comunicació amb el lector de llibres electrònics Sony PRS-500." -#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:150 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:104 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:107 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:110 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:121 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:44 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:47 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:50 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:80 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:89 -msgid "Getting list of books on device..." -msgstr "S'està obtenint el llistat de llibres disponibles al dispositiu..." +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:22 +msgid "Communicate with all the Sony eBook readers." +msgstr "Comunicar-se amb tots els lectors de llibres electrònics de Sony." -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:26 -msgid "Communicate with the Sony PRS-300/505/500 eBook reader." -msgstr "" -"Estableix comunicació amb el lector de llibres electrònics Sony PRS-" -"300/505/500." - -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:58 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:61 msgid "" "Comma separated list of metadata fields to turn into collections on the " "device. Possibilities include: " @@ -667,30 +802,10 @@ msgstr "" "Llistat on apareixen, separats per coma, els camps de metadades per " "traslladar a les col·leccions del dispositiu. Les possibilitats inclouen: " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:149 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:151 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:115 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:117 -msgid "Transferring books to device..." -msgstr "S'estan transferint llibres al dispositiu..." - -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:189 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:196 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:144 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:161 -msgid "Removing books from device..." -msgstr "S'estan suprimint els llibres del dispositiu..." - -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:224 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:176 -msgid "Sending metadata to device..." -msgstr "S'estan enviant metadades al dispositiu..." - -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:230 -msgid "Communicate with the Sony PRS-600/700/900 eBook reader." -msgstr "" -"Estableix comunicació amb el lector de llibres electrònics Sony PRS-" -"600/700/900." +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:140 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 +msgid "Unnamed" +msgstr "Sense nom" #: /home/kovid/work/calibre/src/calibre/devices/sne/driver.py:17 msgid "Communicate with the Samsung SNE eBook reader." @@ -702,15 +817,15 @@ msgid "Communicate with the Teclast K3 reader." msgstr "" "Estableix comunicació amb el lector de llibres electrònics Teclast K3." -#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:45 +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:37 msgid "Communicate with the Newsmy reader." -msgstr "" +msgstr "Comunicar-se amb el lector Newsmy." -#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:60 +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:49 msgid "Communicate with the iPapyrus reader." -msgstr "" +msgstr "Comunicar-se amb el lector iPapyrus." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:252 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:245 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "No s'ha pogut detectar la unitat de disc %s. Proveu a reiniciar." @@ -747,72 +862,65 @@ msgstr "El lector no té cap targeta de memòria en aquesta ranura." msgid "Selected slot: %s is not supported." msgstr "Ranura seleccionada: %s no és compatible." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:777 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:773 msgid "There is insufficient free space in main memory" msgstr "No hi ha espai lliure suficient a la memòria principal" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:779 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:781 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:775 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:777 msgid "There is insufficient free space on the storage card" msgstr "No hi ha espai lliure suficient a la targeta de memòria" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:811 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:817 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:842 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:151 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:589 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:995 -msgid "News" -msgstr "Notícies" - #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:12 msgid "Configure Device" msgstr "Configura el dispositiu" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:28 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:37 msgid "settings for device drivers" msgstr "paràmetres dels controladors de dispostius" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:30 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:39 msgid "Ordered list of formats the device will accept" msgstr "Llistat ordenat de formats que el dispositiu accepta" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:32 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:41 msgid "Place files in sub directories if the device supports them" msgstr "Posa els fitxers a subdirectoris si el dispostiu ho permet" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:34 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81 msgid "Read metadata from files on device" msgstr "Llegeix les metadades dels fitxers del dispositiu" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:36 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:45 +msgid "Use author sort instead of author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:47 msgid "Template to control how books are saved" msgstr "Planilla per a controlar quants llibres s'han desat" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 msgid "Extra customization" msgstr "Personalització addicional" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:28 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:37 msgid "Communicate with an eBook reader." msgstr "Estableix comunicació amb el lector de llibres electrònics." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:36 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:53 msgid "Get device information..." msgstr "Obté informació del dispositiu..." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:132 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:140 -msgid "Adding books to device metadata listing..." -msgstr "S'estan afegint llibres al llistat de metadades del dispositiu..." +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:188 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 +msgid "Transferring books to device..." +msgstr "S'estan transferint llibres al dispositiu..." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:165 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:170 -msgid "Removing books from device metadata listing..." -msgstr "S'estan suprimint llibres del llistat de metadades del dispositiu..." +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:305 +msgid "Sending metadata to device..." +msgstr "S'estan enviant metadades al dispositiu..." #: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:41 msgid "%prog [options] mybook.chm" @@ -1480,6 +1588,12 @@ msgid "" "corresponding pair of normal characters. This option will preserve them " "instead." msgstr "" +"Preservar les lligadures presents en el document d'entrada. Una lligadura es " +"un render especial de parells de caràcters tipus ff, fi, fl etc. Molts " +"lectors, a les seves fonts per defecte, no ten suport per a dites " +"lligadures, pel qual és poc probable que les renderitze correctament. Per " +"defecte, calibre canviarà la lligadura per el seu parell de caràcters " +"normals corresponents. Aquesta opció serà conservada en el seu lloc." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:428 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:38 @@ -1502,7 +1616,7 @@ msgstr "Text que s'usarà en l'ordenació per autor. " #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445 msgid "Set the cover to the specified file or URL" -msgstr "" +msgstr "Col·locar la portada des del fitxer especificat o URL" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:54 @@ -1522,7 +1636,7 @@ msgstr "Establiu la sèria a la que pertany el llibre electrònic." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:461 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:62 msgid "Set the index of the book in this series." -msgstr "" +msgstr "Col·locar l'index del llibre a aquesta serie." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:465 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:64 @@ -1538,6 +1652,7 @@ msgstr "Establiu el codi ISBN del llibre." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:68 msgid "Set the tags for the book. Should be a comma separated list." msgstr "" +"Col·locar les etiquetes al llibre. Ha de ser una llista separada per comes." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:477 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:70 @@ -1551,43 +1666,49 @@ msgstr "Establiu la llengua." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:485 msgid "Set the publication date." -msgstr "" +msgstr "Col·locar la data de publicació." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:489 msgid "Set the book timestamp (used by the date column in calibre)." msgstr "" +"Col·locar la data i l'hora al llibre (utilitzat per la columna data al " +"calibre)." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:589 msgid "Could not find an ebook inside the archive" -msgstr "" +msgstr "No s'ha pogut trobar cap llibre electrònic dins de l'arxiu" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:647 msgid "Values of series index and rating must be numbers. Ignoring" msgstr "" +"Els valors de l'índex de la serie i la seva puntuació han de ser números. " +"Ignorant" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:654 msgid "Failed to parse date/time" -msgstr "" +msgstr "No s'ha pogut analitzar la data/hora" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:802 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:809 msgid "Converting input to HTML..." msgstr "S'està convertint l'entrada a HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:829 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:836 msgid "Running transforms on ebook..." msgstr "S'estàn transformant el llibre electrònic..." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:916 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:923 msgid "Creating" msgstr "S'està creant" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:205 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:56 msgid "" "Extract the contents of the generated EPUB file to the specified directory. " "The contents of the directory are first deleted, so be careful." msgstr "" +"Extregui el contingut del fitxer generat EPUB al directori especificat. Els " +"continguts del directori s'esborraran en primer lloc, tingui compte." -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:62 msgid "" "Turn off splitting at page breaks. Normally, input files are automatically " "split at every page break into two files. This gives an output ebook that " @@ -1595,30 +1716,43 @@ msgid "" "if your source file contains a very large number of page breaks, you should " "turn off splitting on page breaks." msgstr "" +"Desactivi les divisions als salts de línia. Normalment, els fitxers " +"d'entrada es divideixen en dos automàticament a cada salt de pàgina. Això li " +"dóna un llibre electrònic (e-book) de sortida que es pot analitzar més ràpid " +"i amb menys recursos. Si més no, la divisió és lenta i si el seu fitxer " +"d'origen conté un gran número de salts de pàgina, vostè ha de desactivar la " +"divisió dels salts de pàgina." -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:222 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:73 msgid "" "Split all HTML files larger than this size (in KB). This is necessary as " "most EPUB readers cannot handle large file sizes. The default of %defaultKB " "is the size required for Adobe Digital Editions." msgstr "" +"Divideix tots els fitxers HTML majors d'aquesta mida (en KB). Això es " +"necessari perquè la majoria de lectors EPUB no poden manegar els fitxers de " +"gran mida. El valor predeterminat de %defaultKB es la mida requerida per " +"Adobe Digital Editions." -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:229 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:80 msgid "" "Normally, if the input file has no cover and you don't specify one, a " "default cover is generated with the title, authors, etc. This option " "disables the generation of this cover." msgstr "" +"Normalment, si el fitxer d'entrada no te tapa i no s'especifica una, es " +"genera una tapa per defecte amb el títol, autors, etc. Aquesta opció " +"deshabilita la generació d'aquesta tapa." -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:235 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:86 msgid "" "Do not use SVG for the book cover. Use this option if your EPUB is going to " -"be used ona device that does not support SVG, like the iPhone or the " +"be used on a device that does not support SVG, like the iPhone or the " "JetBook Lite. Without this option, such devices will display the cover as a " "blank page." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:243 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:94 msgid "" "When using an SVG cover, this option will cause the cover to scale to cover " "the available screen area, but still preserve its aspect ratio (ratio of " @@ -1626,6 +1760,16 @@ msgid "" "and bottom of the image, but the image will never be distorted. Without this " "option the image may be slightly distorted, but there will be no borders." msgstr "" +"Quan s'utilitza una tapa SVG, aquesta opció farà que s'escali la tapa per " +"cobrir l'àrea de pantalla disponible, però encara conservarà la seva relació " +"d'aspecte (relació entre l'amplada i l'altura). Això significa que pot haver " +"cantons blancs als costats o a la part superior i inferior de la imatge, " +"però la imatge mai es distorsiona. Sense aquesta opció, la imatge pot estar " +"una mica distorsionada, però no hi haurà fronteres." + +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:169 +msgid "Start" +msgstr "Inici" #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:144 #: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 @@ -1645,32 +1789,44 @@ msgstr "No insereixis un índex general al començament del llibre." msgid "Add Table of Contents to beginning of the book." msgstr "Afegeix l'índex general al començament del llibre." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:243 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:248 msgid "" "Traverse links in HTML files breadth first. Normally, they are traversed " "depth first." msgstr "" +"Travessia d'enllaços en fitxers HTML primerament per extensió. Normalment, " +"són primerament travessats per profunditat." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:250 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:255 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 "" +"Els nivells màxims de recursivitat quan es segueixen els enllaços als " +"fitxers HTML. No han de ser negatius. 0 significa que no hi ha enllaços a " +"l'arrel del fitxer HTML per seguir. El valor predeterminat es %default." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:264 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 " "can result in various nasty side effects in the rest of of the conversion " "pipeline." msgstr "" +"Normalment aquest complement d'entrada recol.loca tots els arxius d'entrada " +"en un arbre de carpetes estàndard. Utilitza aquesta opció només si sap el " +"que està fent, ja que pot ocasionar diversos efectes desagradables a la " +"resta del procés de conversió." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:267 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:272 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." msgstr "" +"Longitud de línia mitjana per a la divisió de línies si l'HTML ve d'una " +"conversió parcial prèvia d'un arxiu PDF. El valor per defecte és %default, " +"que desactiva aquesta opció." #: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:47 msgid "Creating LIT file from EPUB..." @@ -1690,7 +1846,7 @@ msgstr "\tS'ha detectat un fitxer Baen. S'està reanalitzant..." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:361 msgid "Written preprocessed HTML to " -msgstr "" +msgstr "HTML preprocessat escrit en " #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:379 msgid "Processing %s" @@ -1703,7 +1859,7 @@ msgstr "\tS'està convertint a BBeB..." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:539 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:552 msgid "Could not parse file: %s" -msgstr "" +msgstr "No s'ha pogut analitzar el fitxer: %s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "%s is an empty file" @@ -1711,48 +1867,54 @@ msgstr "%s és un fitxer buit" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:564 msgid "Failed to parse link %s %s" -msgstr "" +msgstr "Ha fallat l'anàlisi de l'enllaç %s %s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:608 msgid "Cannot add link %s to TOC" -msgstr "" +msgstr "No s'ha pogut afegir l'enllaç %s a la TDC" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:957 msgid "Unable to process image %s. Error: %s" -msgstr "" +msgstr "Incapaç de processar la imatge %s. Error: %s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "Unable to process interlaced PNG %s" -msgstr "" +msgstr "Incapaç de processar PNG entrellaçat %s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1017 msgid "" "Could not process image: %s\n" "%s" msgstr "" +"No puc processar la imatge: %s\n" +"%s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1772 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" +"S'ha produït un error en processar una taula: %s. S'obvia el codi de la " +"taula." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1774 msgid "" "Bad table:\n" "%s" msgstr "" +"Taula errònia:\n" +"%s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "Table has cell that is too large" -msgstr "" +msgstr "La taula conté una cel.la massa gran" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1862 msgid "Could not read cover image: %s" -msgstr "" +msgstr "No s'ha pogut llegir la imatge de portada: %s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1865 msgid "Cannot read from: %s" -msgstr "" +msgstr "No es pot llegir de: %s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1994 msgid "Failed to process opf file" @@ -1789,7 +1951,7 @@ msgstr "S'ha escrit l'LRS a " #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:267 msgid "Could not read from thumbnail file:" -msgstr "" +msgstr "No s'ha pogut llegir el fitxer de miniatura:" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:287 msgid "" @@ -1804,7 +1966,7 @@ msgid "Path to output file" msgstr "Camí al fitxer de sortida" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:114 msgid "Verbose processing" msgstr "Processament detallat" @@ -1860,25 +2022,31 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:104 msgid "Add extra spacing below the header. Default is %default pt." -msgstr "" +msgstr "Afegir l'espai sota la capçalera. Valor per defecte: %default pt." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:107 msgid "" "Minimum paragraph indent (the indent of the first line of a paragraph) in " "pts. Default: %default" msgstr "" +"Sagnat mínim per paràgrafs (el sagnat de la primera línia de cada paràgraf) " +"a pt. Valor per defecte: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:112 msgid "" "Render tables in the HTML as images (useful if the document has large or " "complex tables)" msgstr "" +"Convertir les taules en documents HTML en imatges (molt útil si el document " +"consta de taules grans o complexes.)" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:117 msgid "" "Multiply the size of text in rendered tables by this factor. Default is " "%default" msgstr "" +"Multiplicar la mida del text en les taules convertides en imatges per aquest " +"factor. Valor per defecte %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:121 msgid "The serif family of fonts to embed" @@ -1896,92 +2064,100 @@ msgstr "Famí­lia de lletres monoespaiades per a incrustar." msgid "Comic" msgstr "Còmic" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:363 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:389 #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:416 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1159 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 +#: /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:882 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:543 msgid "Title" msgstr "Tí­tol" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:364 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:175 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:421 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1160 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:390 +#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:883 msgid "Author(s)" msgstr "Autor(s)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:365 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:180 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 +#: /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 "Editorial" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:392 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "Productor" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:367 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393 +#: /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:185 #: /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/library.py:377 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1073 msgid "Comments" msgstr "Comentaris" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:366 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1104 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1163 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:151 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1069 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:139 msgid "Tags" msgstr "Etiquetes" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:377 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:151 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:87 msgid "Series" msgstr "Sèries" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:378 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:404 msgid "Language" msgstr "Llengua" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1103 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 msgid "Timestamp" msgstr "Marca de temps" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:178 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:408 +#: /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 "Publicat" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:384 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:410 msgid "Rights" msgstr "Drets" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazon.py:85 msgid "EDITORIAL REVIEW" -msgstr "" +msgstr "REVISIÓ EDITORIAL" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:22 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:41 msgid "" "Extract common e-book formats from archives (zip/rar) files. Also try to " "autodetect if they are actually cbz/cbr files." msgstr "" +"Extreure els formats de llibre digital comuns de fitxers (zip / rar). També " +"intenta detectar automàticament si es tracta de fitxers cbz/cbr." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:20 msgid "options" @@ -2000,24 +2176,40 @@ msgid "" "some metadata on a file type that does not support it, the metadata will be\n" "silently ignored.\n" msgstr "" +"\n" +"Llegir / escriure metadades de / a fitxers de llibre electrònic.\n" +"\n" +"Formats suportats per llegir metadades: %s\n" +"\n" +"Formats suportats per escriure metadades: %s\n" +"\n" +"Els diferents tipus de fitxer admeten diferents tipus de metadades. Si " +"s'intenten establir metadades en un tipus de fitxer que no els suporta, les " +"metadades s'obviaran.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:40 msgid "" "Set the authors. Multiple authors should be separated by the & character. " "Author names should be in the order Firstname Lastname." msgstr "" +"Establir els autors. Si hi ha diversos autors s'han de separar per «&». Els " +"noms dels autors han d'estar en el format Nom Cognom." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:44 msgid "" "The version of the title to be used for sorting. If unspecified, and the " "title is specified, it will be auto-generated from the title." msgstr "" +"La versió del títol que es fes servir per ordenar. Si no s'especifica " +"aquesta opció i sí el títol, es generarà automàticament a partir del títol." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:48 msgid "" "String to be used when sorting by author. If unspecified, and the author(s) " "are specified, it will be auto-generated from the author(s)." msgstr "" +"Text que es farà servir per ordenar per autor. Si no s'especifica aquesta " +"opció i si l'autor (s), es generarà automàticament a partir de l'autor (s)." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:52 msgid "Set the cover to the specified file." @@ -2029,7 +2221,7 @@ msgstr "Establiu la categoria del llibre." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:74 msgid "Set the published date." -msgstr "" +msgstr "Establir la data de publicació." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:77 msgid "Get the cover from the ebook and save it at as the specified file." @@ -2076,13 +2268,21 @@ msgstr "Portada desada a" msgid "No cover found" msgstr "No s'ha trobat cap caràtula" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:15 +msgid "Cover download" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:42 +msgid "Downloads metadata from Douban.com" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:34 msgid "Metadata download" msgstr "Metadades baixades" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 msgid "ratings" -msgstr "" +msgstr "classificació" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 msgid "tags" @@ -2096,25 +2296,29 @@ msgstr "" msgid "Download %s from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:137 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:139 msgid "Downloads metadata from Google Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:156 msgid "Downloads metadata from isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:181 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:184 msgid "" "To use isbndb.com you must sign up for a %sfree account%s and enter your " "access key below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:194 msgid "Downloads social metadata from amazon.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:213 +msgid "Downloads series/tags/rating information from librarything.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:95 msgid "" "\n" "%prog [options] key\n" @@ -2128,50 +2332,51 @@ msgid "" "\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:105 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:106 msgid "The ISBN ID of the book you want metadata for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 msgid "The author whose book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 msgid "The title of the book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 msgid "The publisher of the book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:53 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:68 msgid "LibraryThing.com timed out. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:60 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:75 msgid "" "Could not fetch cover as server is experiencing high load. Please try again " "later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:61 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:76 msgid " not found." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:64 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:79 msgid "LibraryThing.com server error. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:71 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:86 msgid "" "\n" "%prog [options] ISBN\n" "\n" -"Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" +"Fetch a cover image/social metadata for the book identified by ISBN from " +"LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1103 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1372 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1226 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1398 msgid "Cover" msgstr "" @@ -2210,74 +2415,74 @@ msgstr "" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1373 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1374 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 #: /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 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1375 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1376 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1377 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1378 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1379 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1380 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1381 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1382 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1383 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1384 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1385 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1386 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1387 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1388 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "Main Text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/iterator.py:39 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/iterator.py:41 msgid "%s format books are not supported" msgstr "" @@ -2294,10 +2499,6 @@ msgid "" "Could not find reasonable point at which to split: %s Sub-tree size: %d KB" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 -msgid "Unnamed" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/writer.py:32 msgid "OPF/NCX/etc. generation options." msgstr "" @@ -2321,7 +2522,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:23 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:22 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:23 msgid "" "Normally calibre treats blank lines as paragraph markers. With this option " "it will assume that every line represents a paragraph instead." @@ -2329,7 +2530,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:27 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:26 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:27 msgid "" "Normally calibre treats blank lines as paragraph markers. With this option " "it will assume that every line starting with an indent (either a tab or 2+ " @@ -2458,6 +2659,8 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:29 msgid "Author" msgstr "" @@ -2535,28 +2738,34 @@ msgstr "" msgid "Split Options:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:59 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:31 msgid "" "The unit of measure. Default is inch. Choices are %s Note: This does not " "override the unit for margins!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:64 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:36 msgid "" "The size of the paper. This size will be overridden when an output profile " "is used. Default is letter. Choices are %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:68 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:40 msgid "" "Custom size of the document. Use the form widthxheight EG. `123x321` to " "specify the width and height. This overrides any specified paper-size." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:73 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:45 msgid "The orientation of the page. Default is portrait. Choices are %s" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:49 +msgid "" +"Preserve the aspect ratio of the cover, instead of stretching it to fill the " +"ull first page of the generated pdf." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftohtml.py:55 msgid "Could not find pdftohtml, check it is in your PATH" msgstr "" @@ -2585,13 +2794,19 @@ msgid "" "slowest." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:32 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:33 +msgid "" +"Normally extra spaces are condensed into a single space. With this option " +"all spaces will be displayed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:36 msgid "" "Run the text input through the markdown pre-processor. To learn more about " "markdown see" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:35 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:39 msgid "Do not insert a Table of Contents into the output text." msgstr "" @@ -2622,191 +2837,783 @@ msgid "" "allows max-line-length to be below the minimum" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:33 msgid "Send file to storage card instead of main memory by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:35 msgid "Confirm before deleting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:37 msgid "Toolbar icon size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:39 msgid "Show button labels in the toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:41 msgid "Main window geometry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:43 msgid "Notify when a new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:45 msgid "Use Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:45 -msgid "Sort tags list by popularity" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47 -msgid "Number of covers to show in the cover browsing mode" +msgid "Sort tags list by name, popularity, or rating" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:49 -msgid "Defaults for conversion to LRF" +msgid "Number of covers to show in the cover browsing mode" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:51 +msgid "Defaults for conversion to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:53 msgid "Options for the LRF ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:56 msgid "Formats that are viewed using the internal viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:58 msgid "Columns to be displayed in the book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:59 msgid "Automatically launch content server on application startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:60 msgid "Oldest news kept in database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:61 msgid "Show system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:63 msgid "Upload downloaded news to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 msgid "Delete books from library after uploading to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 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:67 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 msgid "Disable notifications from the system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Default action to perform when send to device button is clicked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Maximum number of waiting worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "Download social metadata (tags/rating/etc.)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "Overwrite author and title with new metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:475 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 +msgid "tag browser categories not to display" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:103 +msgid "The layout of the user interface" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:105 +msgid "Show the average rating per item indication in the tag browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:107 +msgid "Disable UI animations" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:476 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:189 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:189 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:399 msgid "Choose Files" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:245 +msgid "Use library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:246 +msgid "User annotations generated from main library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:671 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:708 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:729 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1060 +msgid "No books selected" +msgstr "Cap llibre seleccionat" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:76 +msgid "No books selected to fetch annotations from" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:101 +msgid "Merging user annotations into database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:129 +msgid "%s
Last Page Read: %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:135 +msgid "%s
Last Page Read: Location %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:154 +msgid "Location %d • %s
%s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:163 +msgid "Page %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:168 +msgid "Location %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:291 +msgid "How many empty books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:292 +msgid "How many empty books should be added?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:391 +msgid "Uploading books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137 +msgid "Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:352 +msgid "EPUB Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:353 +msgid "LRF Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:354 +msgid "HTML Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:355 +msgid "LIT Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:356 +msgid "MOBI Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:357 +msgid "Topaz books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:358 +msgid "Text books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:359 +msgid "PDF Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:360 +msgid "Comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:361 +msgid "Archives" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:365 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:400 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:401 +msgid "" +"Some duplicates were found and merged into the following existing books:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:410 +msgid "Failed to read metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:411 +msgid "Failed to read metadata from the following" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:430 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:435 +msgid "Add to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:430 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1229 +msgid "No book selected" +msgstr "Cap llibre seleccionat" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:435 +msgid "No book files found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:457 +msgid "Cannot delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:470 +msgid "Choose formats to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:488 +msgid "Choose formats not to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:508 +msgid "Cannot delete books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:509 +msgid "No device is connected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:519 +msgid "Main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:453 +msgid "Storage Card A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 +msgid "Storage Card B" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:526 +msgid "No books to delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:527 +msgid "None of the selected books are on the device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:601 +msgid "Deleting books from device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:565 +msgid "" +"The selected books will be permanently deleted and the files removed " +"from your computer. Are you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:586 +msgid "" +"The selected books will be permanently deleted from your device. Are " +"you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:611 +msgid "Cannot download metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:627 +msgid "social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:629 +msgid "covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:629 +msgid "metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:631 +msgid "Downloading %s for %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:655 +msgid "Failed to download some metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:656 +msgid "Failed to download metadata for the following:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:659 +msgid "Failed to download metadata:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:660 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:637 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:949 +#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 +msgid "Error" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:707 +msgid "Cannot edit metadata" +msgstr "No puc editar les meta-dades" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:728 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:731 +msgid "Cannot merge books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:732 +msgid "At least two books must be selected for merging" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:736 +msgid "" +"All book formats and metadata from the selected books will be added to the " +"first selected book.

The second and subsequently selected " +"books will not be deleted or changed.

Please confirm you want to " +"proceed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:747 +msgid "" +"All book formats and metadata from the selected books will be merged into " +"the first selected book.

After merger the second and " +"subsequently selected books will be deleted.

All book formats " +"of the first selected book will be kept and any duplicate formats in the " +"second and subsequently selected books will be permanently deleted " +"from your computer.

Are you sure you want to proceed?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:759 +msgid "" +"You are about to merge more than 5 books. Are you sure you want to " +"proceed?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:876 +msgid "Cannot save to disk" +msgstr "No puc desar al disc" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:879 +msgid "Choose destination directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:912 +msgid "Error while saving" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:913 +msgid "There was an error while saving." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:921 +msgid "Could not save some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:922 +msgid "Click the show details button to see which ones." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:943 +msgid "No books selected to generate catalog for" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:960 +msgid "Generating %s catalog..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:965 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:264 +msgid "No books found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:966 +msgid "" +"No books to catalog\n" +"Check exclude tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:976 +msgid "Catalog generated." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:979 +msgid "Export Catalog Directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:980 +msgid "Select destination for %s.%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:996 +msgid "Fetching news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1010 +msgid " fetched." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1059 +msgid "Cannot convert" +msgstr "No puc convertir-lo" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1088 +msgid "Starting conversion of %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1265 +msgid "Cannot view" +msgstr "No puc mostrar-lo" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1210 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:76 +msgid "Choose the format to view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1218 +msgid "Multiple Books Selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1219 +msgid "" +"You are attempting to open %d books. Opening too many books at once can be " +"slow and have a negative effect on the responsiveness of your computer. Once " +"started the process cannot be stopped until complete. Do you wish to " +"continue?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1228 +msgid "Cannot open folder" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1266 +msgid "%s has no available formats." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/add.py:54 msgid "Searching in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:232 msgid "Adding..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 msgid "Searching in all sub-directories..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:258 msgid "Path error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:259 msgid "The specified directory could not be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:256 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 msgid "No books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:257 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1822 -msgid "No books found" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:330 msgid "Added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:343 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:344 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:349 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:356 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 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:353 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:360 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:427 msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:472 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:480 msgid "Saved" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:57 +msgid "Searching for sub-folders" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:62 +msgid "Searching for books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:74 +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 +msgid "Choose root folder" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:137 +msgid "Invalid root folder" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:138 +msgid "is not a valid root folder" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:148 +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/wizard/finish_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:41 +msgid "WizardPage" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:22 +msgid "Scanning root folder for books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:23 +msgid "This may take a few minutes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:58 +msgid "Choose the location to add books from" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:59 +msgid "Select a folder on your hard disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:60 +msgid "" +"

calibre can scan your computer for existing books automatically. These " +"books will then be copied into the calibre library. This wizard will " +"help you customize the scanning and import process for your existing book " +"collection.

\n" +"

Choose a root folder. Books will be searched for only inside this folder " +"and any sub-folders.

\n" +"

Make sure that the folder you chose for your calibre library is " +"not under the root folder you choose.

" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 +msgid "&Root folder:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64 +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:52 +#: /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/config/config_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:568 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:589 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /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:385 +#: /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:400 +#: /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 +#: /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/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/main_ui.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 +#: /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 +msgid "..." +msgstr "..." + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:67 +msgid "Handle multiple files per book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 +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 +msgid "" +"&Multiple books per folder, assumes every ebook file is a different book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1059 +msgid "Path" +msgstr "Camí" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:117 +#: /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:220 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:96 +msgid "Formats" +msgstr "Formats" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1062 +msgid "Collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 +msgid "Click to open" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1068 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1072 +#: /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:458 +msgid "None" +msgstr "Cap" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:310 +msgid "Click to open Book Details window" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:16 msgid "CSV/XML Options" msgstr "" @@ -2852,21 +3659,21 @@ msgstr "" #: /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/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:167 #: /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 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:38 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:42 +#: /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:49 #: /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:74 +#: /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/search_item_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 @@ -2883,9 +3690,9 @@ msgid "E-book options" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:282 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:958 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:976 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:222 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1467 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1485 msgid "Catalog" msgstr "" @@ -3050,46 +3857,6 @@ msgid "" "conversion parameters like Table of Contents and Chapter Detection." msgstr "" -#: /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:52 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:507 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:521 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:522 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:538 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:359 -#: /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:378 -#: /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:391 -#: /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:398 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 -#: /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/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/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/main_ui.py:365 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:367 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:374 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:377 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:381 -#: /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 -msgid "..." -msgstr "..." - #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 msgid "" "The debug process outputs the intermediate HTML generated at various stages " @@ -3360,97 +4127,97 @@ msgid "" "possible." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:164 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:99 msgid "Choose cover for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:106 msgid "Cannot read" msgstr "No pot llegir-se" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:107 msgid "You do not have permission to read the file: " msgstr "No tens permissos per a llegir l'arxiu: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:187 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:115 msgid "Error reading file" msgstr "Error llegint l'arxiu" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "

There was an error reading from file:
" msgstr "

Error llegint de l'arxiu:
" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:124 msgid " is not a valid picture" msgstr " no és una imatge vàlida" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "Book Cover" msgstr "Coberta" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 -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:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "Change &cover image:" msgstr "Canvia la imatge de la &coberta:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:170 -#: /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:404 msgid "Browse for an image to use as the cover of this book." msgstr "Cerca una imatge per a utilitzar com a coberta d'aquest llibre." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:356 +msgid "Use cover from &source file" +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 msgid "&Title: " msgstr "&Tí­tol: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 msgid "Change the title of this book" msgstr "Canvia el tí­tol del llibre" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:143 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 +#: /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:367 msgid "&Author(s): " msgstr "&Autor(s): " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 msgid "Author So&rt:" msgstr "Ord&re per autor:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" msgstr "" "Canvia l'autor(s). Per a especificar més d'un, separeu-los amb comes." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:152 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 +#: /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:376 msgid "&Publisher: " msgstr "&Editorial: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Ta&gs: " msgstr "Etique&tes: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:154 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 +#: /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:378 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -3458,23 +4225,23 @@ msgstr "" "Etiquetes per a categoritzar el llibre (especialment útil per a recerques). " "

Pot emprar-se qualsevol paraula o frase, separada per comes." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:159 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 +#: /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:381 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:160 -#: /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:375 -#: /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_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:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "List of known series. You can add new series." msgstr "Llistat de sèries conegudes. Podeu afegir-hi de noves." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "Book " msgstr "Llibre " @@ -3559,12 +4326,12 @@ msgid "PDB Input" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:32 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47 msgid "Treat each &line as a paragraph" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:33 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:48 msgid "Assume print formatting" msgstr "" @@ -3592,32 +4359,31 @@ msgstr "" msgid "PDF Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:43 msgid "&Paper Size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:44 msgid "&Orientation:" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:45 +msgid "Preserve &aspect ratio of cover" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:14 msgid "RB Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2067 -msgid "Choose the format to view" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:82 msgid "Cannot build regex using the GUI builder without a book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:82 msgid "No formats available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:100 msgid "Open book" msgstr "" @@ -3689,12 +4455,12 @@ msgid "Footer regular expression:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:77 msgid "Invalid regular expression" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:78 msgid "Invalid regular expression: %s" msgstr "" @@ -3778,21 +4544,25 @@ msgstr "" msgid "TXT Input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:49 msgid "Process using markdown" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:50 msgid "" "

Markdown is a simple markup language for text files, that allows for " "advanced formatting. To learn more visit markdown." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 msgid "Do not insert Table of Contents into output text when using markdown" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:52 +msgid "Preserve &spaces" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:16 msgid "TXT Output" msgstr "" @@ -3898,246 +4668,343 @@ msgid "" "href=\"http://calibre-ebook.com/user_manual/xpath.html\">XPath Tutorial." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:119 +msgid "Cover browser could not be loaded" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:171 +msgid "Browse by covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:242 +msgid "Undefined" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:52 +#: /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 +msgid "Yes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:52 +#: /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 +msgid "No" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:115 +msgid "star(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:116 +msgid "Unrated" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:249 +msgid " index:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:432 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +msgid "Automatically number books in this series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:475 +msgid "Remove all tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:496 +msgid "tags to add" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:501 +msgid "tags to remove" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:48 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:135 msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:154 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:270 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:281 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:291 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:300 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:305 +msgid "Send collections to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:329 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:344 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:361 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:371 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:296 -msgid "and delete from library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:333 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:335 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 msgid "Email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 +msgid " and delete from library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:433 msgid "Send to main memory" msgstr "Envia a la memòria interna" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:348 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:435 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:350 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:360 -msgid "Send specific format to main memory" +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:451 +msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:362 -msgid "Send specific format to storage card A" +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:364 -msgid "Send specific format to storage card B" +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:470 +msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:509 +msgid "Connect to folder" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:515 +msgid "Connect to iTunes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:520 +msgid "Eject device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:528 msgid "Fetch annotations (experimental)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:638 +msgid "Error communicating with device" +msgstr "Error en la comunicació amb el dispositiu" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:659 +msgid "Select folder to open as device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:704 +msgid "Failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:710 +msgid "Error talking to device" +msgstr "Error comunicant amb el dispositiu" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:711 +msgid "" +"There was a temporary error talking to the device. Please unplug and " +"reconnect the device and or reboot." +msgstr "" +"Hi ha hagut un error de comunicació amb el dispositiu. Lleve, torne a " +"connectar el dispositiu i torne a iniciar el programa" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:753 +msgid "Device: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:755 +msgid " detected." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:778 +msgid "Connected " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:846 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:534 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:864 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:868 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:535 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:539 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:581 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:910 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:584 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:913 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:585 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:914 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:181 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:599 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:629 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:728 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:788 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:904 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:911 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:965 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1057 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1118 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1236 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:959 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:637 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:984 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:660 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:989 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:687 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1016 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:688 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1017 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:699 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1028 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:729 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:789 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:905 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1058 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1237 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:758 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1087 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:819 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1150 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1244 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:960 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1305 msgid "No space on device" msgstr "Sense espai al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1306 msgid "" "

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

No puc desar llibres al dispositiu perquè no hi ha espai restant " -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 msgid "Select available formats and their order for this device" 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:82 msgid "Use sub directories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81 -msgid "Save &template:" +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 +msgid "Use author sort for author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:373 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1101 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:93 -msgid "Path" -msgstr "Camí" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:117 -#: /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:216 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:372 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:151 -msgid "Formats" -msgstr "Formats" +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +msgid "Save &template:" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68 msgid "Fit &cover to view" @@ -4185,11 +5052,11 @@ msgstr "" msgid "Choose Format" msgstr "Trieu format" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:33 msgid "Set defaults for conversion of comics (CBR/CBZ files)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:48 msgid "Set options for converting %s" msgstr "" @@ -4205,210 +5072,241 @@ msgstr "" msgid "&Profile:" msgstr "&Perfil:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comments_dialog_ui.py:41 +msgid "Edit Comments" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:174 msgid "%(plugin_type)s %(plugins)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:175 msgid "plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:184 msgid "" "\n" "Customization: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:196 +#: /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:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 msgid "General" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 msgid "Interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:197 +#: /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:197 +#: /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:198 +#: /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:198 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:202 msgid "" "Content\n" "Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:202 msgid "Plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 msgid "Auto send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 msgid "Email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:225 msgid "Formats to email. The first matching format will be sent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:226 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:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:300 msgid "new email address" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:472 +#: /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:502 msgid "System port selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:473 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:503 msgid "" "The value %d you have chosen for the content server port is a system " -"port. You operating system may not allow the server to run on this " +"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:492 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:837 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1538 -#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 -msgid "Error" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:523 msgid "Failed to install command line tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:496 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:526 msgid "Command line tools installed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:497 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:527 msgid "Command line tools installed in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:528 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:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:579 msgid "No valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:580 msgid "%s is not a valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:583 msgid "Choose plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:565 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:595 msgid "Plugin cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:566 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:596 msgid "The plugin: %s cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:575 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:605 msgid "Plugin not customizable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:576 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:606 msgid "Plugin: %s does not need customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:584 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:614 msgid "Customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:622 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:652 msgid "Cannot remove builtin plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:623 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:653 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:656 -msgid "Error log:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:684 +msgid "You must select a column to delete it" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:663 -msgid "Access log:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:689 +msgid "The selected column is not a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:690 +#: /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:691 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:701 +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:758 +msgid "Error log:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:765 +msgid "Access log:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:793 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:340 msgid "Failed to start content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:715 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:817 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:587 msgid "Select location for books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:723 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:824 msgid "Invalid size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:825 msgid "The size %s is invalid. must be of the form widthxheight" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:778 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:783 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:884 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:889 msgid "Invalid database location" msgstr "Ubicació de la base de dades no vàlida" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:779 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:885 msgid "Invalid database location " msgstr "Ubicació de la base de dades no vàlida " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:780 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:886 msgid "
Must be a directory." msgstr "
Cal que siga un directori." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:784 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:890 msgid "Invalid database location.
Cannot write to " msgstr "Ubicació de la base de dades no vàlida.
No es pot escriure " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:818 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:895 +msgid "Must restart" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:896 +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:930 msgid "Checking database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:838 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:950 msgid "Failed to check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:843 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:955 msgid "Some inconsistencies found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:844 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:956 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 " @@ -4416,35 +5314,35 @@ msgid "" "folder directly." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:113 msgid "TabWidget" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:114 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:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:115 msgid "Read metadata only from &file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:116 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:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:117 msgid "&Swap author firstname and lastname" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:118 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" +"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" @@ -4452,326 +5350,380 @@ msgid "" "punctuation, case, etc. Author match is exact." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122 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:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:123 msgid "&Configure metadata from file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:124 msgid "&Adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:125 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:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:126 msgid "Save &cover separately" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:127 msgid "Update &metadata in saved copies" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:128 msgid "Save metadata in &OPF file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:129 msgid "Convert non-English characters to &English equivalents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:130 msgid "Format &dates as:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:131 msgid "File &formats to save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:132 msgid "Replace space with &underscores" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:133 msgid "Change paths to &lowercase" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:134 msgid "&Saving books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:135 +msgid "Preserve device collections." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:136 +msgid "" +"If checked, collections will not be deleted even if a book with changed " +"metadata is resent and the collection is not in the book's metadata. In " +"addition, editing collections in the device view will be enabled. If " +"unchecked, collections will be always reflect only the metadata in the " +"calibre library." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:137 +msgid " " +msgstr " " + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:138 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:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:139 msgid "Sending to &device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:504 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:297 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 msgid "Preferences" -msgstr "" +msgstr "Preferències" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:552 msgid "" "&Location of ebooks (The ebooks are stored in folders sorted by author and " "metadata is stored in the file metadata.db)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:553 msgid "Browse for the new database location" msgstr "Cerca la nova ubicació de la base de dades" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:509 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556 msgid "Download &social metadata (tags/ratings/etc.) by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:557 msgid "&Overwrite author and title by default when fetching metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:558 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:559 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:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:560 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:514 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561 msgid "Choose &language (requires restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562 msgid "Normal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:563 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564 msgid "Low" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:565 msgid "Job &priority:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:566 msgid "Preferred &output format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:567 msgid "Preferred &input format order:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:570 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571 msgid "Enable system &tray icon (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572 msgid "Show ¬ifications in system tray" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 +msgid "Show &splash screen at startup" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574 msgid "Show cover &browser in a separate window (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575 +msgid "Show &average ratings in the tags browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:576 msgid "Search as you type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 msgid "Automatically send downloaded &news to ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:578 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:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:579 msgid "&Number of covers to show in browse mode (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:580 msgid "Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:581 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:582 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:583 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:535 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:584 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:585 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:586 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:588 +msgid "Remove a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:590 +msgid "Add a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:592 +msgid "Edit settings of a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:595 msgid "Use internal &viewer for:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:596 +msgid "User Interface &layout (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:597 +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:598 +msgid "Disable &animations" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:599 msgid "Add an email address to which to send books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:600 msgid "&Add email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:601 msgid "Make &default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 msgid "&Remove email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:603 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:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:604 msgid "&Maximum number of waiting worker processes (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605 msgid "&Check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 msgid "&Install command line tools" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 msgid "Open calibre &configuration directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 msgid "Limit the max. simultaneous jobs to the available CPU &cores" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 msgid "Debug &device detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 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:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 msgid "Server &port:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 #: /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'&usuari:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 #: /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 "&Contrasenya:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 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:557 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 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:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 msgid "Max. &cover size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 #: /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:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 msgid "Max. &OPDS items per query:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 +msgid "Max. OPDS &ungrouped items:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 msgid "&Start Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 msgid "St&op Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 msgid "&Test Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:623 msgid "Run server &automatically on startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:565 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 msgid "View &server logs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:566 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:625 #: /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 " @@ -4782,33 +5734,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:568 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 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:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 msgid "Enable/&Disable plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:629 msgid "&Customize plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:630 msgid "&Remove plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 msgid "Add new plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 msgid "Plugin &file:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:634 msgid "&Add" msgstr "" @@ -4836,16 +5788,6 @@ msgstr "" msgid "Values can be edited" msgstr "" -#: /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 -msgid "Yes" -msgstr "" - -#: /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 -msgid "No" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:135 msgid "Text" msgstr "" @@ -4855,8 +5797,11 @@ 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/library.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1162 +#: /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:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:884 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Date" msgstr "Data" @@ -4872,6 +5817,132 @@ msgstr "" 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:64 +msgid "No column selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:65 +msgid "No column has been selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:69 +msgid "Selected column is not a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:100 +msgid "No lookup name was provided" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:102 +msgid "" +"The label must contain only letters, digits and underscores, and start with " +"a letter" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:111 +msgid "No column heading was provided" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:117 +msgid "The lookup name %s is already used" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:127 +msgid "The heading %s is already used" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:129 +msgid "" +"The lookup name must be lower case and cannot contain \":\"s or spaces" +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 "" @@ -4913,10 +5984,6 @@ msgstr "" msgid "Downloading social metadata, please wait..." msgstr "" -#: /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/confirm_delete_ui.py:50 msgid "&Show this warning again" msgstr "" @@ -4925,39 +5992,60 @@ msgstr "" msgid "ERROR" msgstr "ERROR" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:69 +msgid "Location" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1058 +msgid "Format" +msgstr "Format" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device_ui.py:50 +msgid "Delete from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:29 +msgid "Author sort" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:47 +msgid "Manage authors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 msgid "Author Sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:162 msgid "Finding metadata..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:176 msgid "Could not find metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:177 msgid "The metadata download seems to have stalled. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:186 msgid "Warning" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:187 msgid "Could not fetch metadata from:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:191 msgid "No metadata found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:192 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -5019,29 +6107,24 @@ msgstr "" msgid "Stop &all jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:22 -msgid "Editing meta information for %d books" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:24 +msgid "Editing meta information for %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:157 msgid "Edit Meta information" msgstr "Editar Meta-informació" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:355 -msgid "Meta information" -msgstr "Meta-informació" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:159 msgid "A&utomatically set author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160 msgid "Author s&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:146 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:362 +#: /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:369 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -5049,55 +6132,55 @@ msgstr "" "Especifiqueu com s'ha d'ordenar l'autor(s) d'aquest llibre. Per " "exemple,ordena Vicent A. Estellés com a Estellés, Vicent A." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:147 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 +#: /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:372 msgid "&Rating:" msgstr "&Valoració:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:148 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:149 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /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:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Rating of this book. 0-5 stars" msgstr "Valora aquest llibre: 0-5 estreles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:151 -#: /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:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid " stars" msgstr " estreles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:155 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:156 -#: /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: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:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 msgid "Open Tag Editor" 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:172 msgid "&Remove tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177 msgid "Remove &format:" 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:178 msgid "&Swap title and author" msgstr "" -#: /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:179 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -5105,8 +6188,25 @@ 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:168 -msgid "Automatically number books in this series" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 +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 +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:409 +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:410 +msgid "&Custom metadata" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:123 @@ -5117,11 +6217,6 @@ msgstr "" msgid "Choose formats for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1284 -msgid "Books" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 msgid "No permission" msgstr "" @@ -5160,141 +6255,153 @@ msgstr "" msgid "Abort the editing of all remaining books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:413 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:439 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:421 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:442 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:521 +msgid "Cannot use tag editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:522 +msgid "The tags editor cannot be used if you have modified the tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:542 msgid "Downloading cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:529 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:534 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:565 msgid "Cannot fetch cover" msgstr "No puc aconseguir la coberta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:566 msgid "Could not fetch cover.
" msgstr "No puc aconseguir la coberta.
" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:556 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:535 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:560 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:572 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:573 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:581 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:606 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:582 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:607 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:681 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:708 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:709 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:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 msgid "Edit Meta Information" msgstr "Edita la meta-informació" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:362 +msgid "Meta information" +msgstr "Meta-informació" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 msgid "Swap the author and title" 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:368 msgid "Author S&ort: " msgstr "&Ordena autors: " -#: /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:370 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:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid "IS&BN:" msgstr "IS&BN:" -#: /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:387 msgid "Publishe&d:" 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:390 msgid "dd MMM yyyy" msgstr "" -#: /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:391 msgid "&Date:" 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:392 msgid "&Comments" 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:393 msgid "&Fetch metadata from server" msgstr "" -#: /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:394 msgid "Available Formats" msgstr "Formats disponibles" -#: /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:395 msgid "Add a new format for this book to the database" msgstr "Afegir un nou format per a aquest llibre a la base de dades" -#: /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:397 msgid "Remove the selected formats for this book from the database." msgstr "" "Elimina els formats seleccionats per a aquest llibre de la base de dades." -#: /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:399 msgid "Set the cover for the book from the selected format" 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:401 msgid "Update metadata from the metadata in the selected format" msgstr "" -#: /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:406 msgid "Reset cover to default" msgstr "" -#: /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:408 msgid "Download &cover" msgstr "" @@ -5306,48 +6413,81 @@ msgstr "Es necessita una contrasenya." msgid "Aborting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor.py:54 +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 +msgid "Saved Search Editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:84 +msgid "Saved Search: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:85 +msgid "Select a saved search to edit" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:86 +msgid "Delete this selected saved search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 +msgid "Enter a new saved search name." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 +msgid "Add the new saved search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 +msgid "Change the contents of the saved search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:119 msgid "Need username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:120 msgid "You must provide a username and/or password to use this news source." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:171 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:178 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 msgid "%d days, %d hours and %d minutes ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:195 msgid "Last downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:216 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:192 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:219 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:224 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:321 msgid "No internet connection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:322 msgid "Cannot download news as no internet connection is active" msgstr "" @@ -5540,11 +6680,79 @@ msgstr "" msgid "Choose formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:76 +msgid "Authors" +msgstr "Autors" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:107 +msgid "Publishers" +msgstr "Editors" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:110 +msgid " (not on any book)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:162 +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 +msgid "User Categories Editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:154 +msgid "A&vailable items" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:155 +msgid "Apply tags to current tag category" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:157 +msgid "A&pplied items" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 +msgid "Unapply (remove) tag from current tag category" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 +msgid "Category name: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 +msgid "Select a category to edit" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 +msgid "Delete this selected tag category" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 +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 +msgid "Add the new category" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 +msgid "Category filter: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 +msgid "Select the content kind of the new category" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:101 msgid "Are your sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:69 msgid "" "The following tags are used by one or more books. Are you certain you want " "to delete them?" @@ -5590,6 +6798,58 @@ msgstr "" msgid "Add tag to available tags and apply it to current book" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:501 +msgid "Item is blank" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:502 +msgid "An item cannot be set to nothing. Delete it instead." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:87 +msgid "No item selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:88 +msgid "You must select one item from the list of Available items." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:97 +msgid "No items selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:98 +msgid "You must select at least one items from the list." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:102 +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 +msgid "Category Editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:73 +msgid "Items in use" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:74 +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 +msgid "Rename the item in every book where it is used." +msgstr "" + +#: /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/test_email_ui.py:51 msgid "Test email settings" msgstr "" @@ -5828,17 +7088,17 @@ msgstr "" #: /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:78 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:82 -#: /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:94 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:100 msgid "No match" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:121 msgid "Authors:" -msgstr "" +msgstr "Autors:" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122 msgid "Regular expression (?P)" @@ -5868,98 +7128,309 @@ msgstr "" msgid "Regular expression (?P)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:36 +msgid "Save single format to disk..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:52 +msgid "Edit metadata individually" +msgstr "Edita metadades individualment" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:55 +msgid "Edit metadata in bulk" +msgstr "Edita metadades en massa" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:58 +msgid "Download metadata and covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:61 +msgid "Download only metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:63 +msgid "Download only covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:66 +msgid "Download only social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:72 +msgid "Merge into first selected book - delete others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:75 +msgid "Merge into first selected book - keep others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:83 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:85 +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/init.py:89 +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/init.py:92 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:283 +msgid "Save to disk" +msgstr "Desa al disc" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104 +msgid "Save to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:402 +msgid "Save only %s format to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:405 +msgid "Save only %s format to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:289 +msgid "View" +msgstr "Mostra" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:120 +msgid "View specific format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126 +msgid "Remove selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:128 +msgid "Remove files of a specific format from selected books.." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:131 +msgid "Remove all formats from selected books, except..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:134 +msgid "Remove covers from selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:137 +msgid "Remove matching books from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:154 +msgid "Convert individually" +msgstr "Converteix individualment" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:156 +msgid "Bulk convert" +msgstr "Converteix tots" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:160 +msgid "Create catalog of books in your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:168 +msgid "Run welcome wizard" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:200 +msgid "Similar books..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:232 +msgid "Add books to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:248 +msgid "Manage collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:328 +msgid "Cover Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:346 +msgid "Tag Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:403 +msgid "Book Details" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:60 msgid "Job" msgstr "Treball" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:61 msgid "Status" msgstr "Estat" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:62 msgid "Progress" msgstr "Progressió" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:63 msgid "Running time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:75 msgid "There are %d running jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:79 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:101 msgid "Unknown job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:82 msgid "There are %d waiting jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:219 msgid "Cannot kill job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:217 msgid "Cannot kill jobs that communicate with the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:220 msgid "Job has already run" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:248 msgid "Unavailable" msgstr "No disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:280 +msgid "Jobs:" +msgstr "Treballs:" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:298 +msgid "Click to see list of active jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 msgid " - Jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1161 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:284 +msgid "N" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:284 +msgid "Y" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 +msgid "On Device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 msgid "Size (MB)" msgstr "Grandària (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 msgid "Rating" msgstr "Valoració" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:365 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:371 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:376 -#: /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:440 -msgid "None" -msgstr "Cap" - -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 msgid "Book %s of %s." msgstr "Llibre %s de %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:674 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1176 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:399 +msgid "The lookup/search name is \"{0}\"" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:881 +msgid "In Library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:885 +msgid "Size" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1156 +msgid "Marked for deletion" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1159 +msgid "Double click to edit me

" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:110 +msgid "Hide column %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:115 +msgid "Sort on %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:116 +msgid "Ascending" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:119 +msgid "Descending" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:131 +msgid "Change text alignment for %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 +msgid "Left" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 +msgid "Right" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:134 +msgid "Center" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 +msgid "Show column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 +msgid "Restore default layout" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:524 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:525 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1100 -msgid "Format" -msgstr "Format" - -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1151 -msgid "Double click to edit me

" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:47 msgid "Configure Viewer" msgstr "Configura el visor" @@ -6034,273 +7505,269 @@ msgstr "Obre l'eBook" msgid "Configure" msgstr "Configura" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:30 msgid "Use the library located at the specified path." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:32 msgid "Start minimized to system tray." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:34 msgid "Log debugging information to console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:36 msgid "Do not check for updates" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:65 -msgid "Choose a location for your calibre e-book library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:74 -msgid "Failed to create library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:75 -msgid "Failed to create calibre library at: %r. Aborting." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:145 -msgid "Repairing failed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:146 -msgid "The database repair failed. Starting with a new empty library." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:595 msgid "Calibre Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:86 +msgid "Choose a location for your calibre e-book library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +msgid "Failed to create library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +msgid "Failed to create calibre library at: %r." +msgstr "" + +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 +msgid "Initializing user interface..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Repairing failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:179 +msgid "The database repair failed. Starting with a new empty library." +msgstr "" + +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:194 msgid "Bad database location %r. calibre will now quit." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:207 msgid "Corrupted database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:208 msgid "" "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." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:194 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:227 msgid "" "Bad database location %r. Will start with a new, empty calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:238 +msgid "Starting %s: Loading books..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:283 msgid "If you are sure it is not running" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:285 msgid "Cannot Start " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:286 msgid "%s is already running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:289 msgid "may be running in the system tray, in the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:291 msgid "upper right region of the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:293 msgid "lower right region of the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:296 msgid "try rebooting your computer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:277 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:253 msgid "calibre" msgstr "calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +msgid "&Restrict to:" +msgstr "&Restringit a:" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +msgid "" +"Books display will be restricted to those matching the selected saved search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 +msgid "set in ui.py" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "Alt+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "&Search:" msgstr "Re&cerca:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:370 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 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/main_ui.py:372 -msgid "set in ui.py" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 msgid "Reset Quick Search" msgstr "Reinicialitza la recerca ràpida" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "Choose saved search or enter name for new saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Copy current search text (instead of search name)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 msgid "Save current search under the name shown in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Delete current saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:382 -msgid "Sort by &popularity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:383 -msgid "Match any" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:384 -msgid "Match all" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "Add books" msgstr "Afegeix llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:387 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "Remove books" msgstr "Suprimeix llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Del" msgstr "Esborra" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "Edit meta information" msgstr "Edita la meta-informació" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:392 -msgid "Merge books" +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +msgid "Merge book records" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "M" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "Send to device" msgstr "Envia al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:395 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:347 -msgid "Save to disk" -msgstr "Desa al disc" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:284 msgid "S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:285 msgid "Fetch news" msgstr "Recull notí­cies (RSS)" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:286 msgid "F" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:287 msgid "Convert E-books" msgstr "Converteix Ebooks" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:288 msgid "C" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:401 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:357 -msgid "View" -msgstr "Mostra" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:290 msgid "V" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:291 msgid "Open containing folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:292 msgid "Show book details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:293 msgid "Books by same author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:294 msgid "Books in this series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:295 msgid "Books by this publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:296 msgid "Books with the same tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:298 msgid "Configure calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:299 msgid "Ctrl+P" msgstr "" @@ -6312,7 +7779,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:61 msgid "&Preferences" -msgstr "" +msgstr "&Preferències" #: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:62 msgid "&Quit" @@ -6330,11 +7797,35 @@ msgstr "" msgid "No matches found for this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:260 msgid "Search" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:313 +msgid "The selected search will be permanently deleted. Are you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:355 +msgid "Search (For Advanced Search click the button to the left)" +msgstr "Cerca (per avançada feu clic a Cerca al botó a l'esquerra)" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:392 +msgid "Saved Searches" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:46 +msgid "({0} of {1})" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:52 +msgid "(all books)" +msgstr "(tots els llibres)" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:54 +msgid "({0} of all)" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:58 msgid "Press a key..." msgstr "" @@ -6395,44 +7886,77 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:154 -msgid "Jobs:" -msgstr "Treballs:" - -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:163 -msgid "Click to see list of active jobs." +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:191 +msgid "Rename '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:201 -msgid "Click to browse books by their covers" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:195 +msgid "Edit sort for '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:201 -msgid "Click to turn off Cover Browsing" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:200 +msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:206 -msgid "" -"

Browsing books by their covers is disabled.
Import of pictureflow " -"module failed:
" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:203 +msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:214 -msgid "Click to browse books by tags" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:207 +msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:151 -msgid "Authors" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:218 +msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:151 -msgid "Publishers" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:221 +msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:232 +msgid "Manage User Categories" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:433 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:271 msgid "Searches" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 +msgid "Duplicate search name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 +msgid "The saved search name %s is already used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:768 +msgid "Sort by name" +msgstr "Ordena segons el nom" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:768 +msgid "Sort by popularity" +msgstr "Ordena segons la popularitat" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:769 +msgid "Sort by average rating" +msgstr "Ordena segons la classificació" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:775 +msgid "Match all" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:775 +msgid "Match any" +msgstr "Qualsevol coincidència" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:780 +msgid "Manage &user categories" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:182 msgid "Convert book %d of %d (%s)" @@ -6472,594 +7996,112 @@ msgid "" "reconvert them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:67 -msgid "Save single format to disk..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:148 -msgid "Search (For Advanced Search click the button to the left)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:154 -msgid "Saved Searches" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:177 -msgid "Error communicating with device" -msgstr "Error en la comunicació amb el dispositiu" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:162 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:164 msgid "&Donate to support calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:172 msgid "&Restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:206 msgid "

For help see the: User Manual
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:212 msgid "%s: %s by Kovid Goyal %%(version)s
%%(device)s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:273 -msgid "Edit metadata individually" -msgstr "Edita metadades individualment" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:275 -msgid "Edit metadata in bulk" -msgstr "Edita metadades en massa" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:277 -msgid "Download metadata and covers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:278 -msgid "Download only metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:279 -msgid "Download only covers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:280 -msgid "Download only social metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:284 -msgid "Merge into first selected book - delete others" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:286 -msgid "Merge into first selected book - keep others" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:293 -msgid "Add books from a single directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:294 -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/ui.py:297 -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/ui.py:300 -msgid "Add Empty book. (Book entry with no formats)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:348 -msgid "Save to disk in a single directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:349 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2172 -msgid "Save only %s format to disk" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:358 -msgid "View specific format" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:363 -msgid "Remove selected books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:365 -msgid "Remove files of a specific format from selected books.." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:367 -msgid "Remove all formats from selected books, except..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:369 -msgid "Remove covers from selected books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:406 -msgid "Convert individually" -msgstr "Converteix individualment" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:407 -msgid "Bulk convert" -msgstr "Converteix tots" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:410 -msgid "Create catalog of books in your calibre library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:426 -msgid "Run welcome wizard" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:462 -msgid "Similar books..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:237 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:745 -msgid "Browse by covers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:802 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:806 -msgid "(all books)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:811 -msgid "(%d found)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:901 -msgid "Device: " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:903 -msgid " detected." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:931 -msgid "Connected " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:943 -msgid "Device database corrupted" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:944 -msgid "" -"\n" -"

The database of books on the reader is corrupted. Try the " -"following:\n" -"

    \n" -"
  1. Unplug the reader. Wait for it to finish regenerating " -"the database (i.e. wait till it is ready to be used). Plug it back in. Now " -"it should work with %(app)s. If not try the next step.
  2. \n" -"
  3. Quit %(app)s. Find the file media.xml in the reader's " -"main memory. Delete it. Unplug the reader. Wait for it to regenerate the " -"file. Re-connect it and start %(app)s.
  4. \n" -"
\n" -" " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1003 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1180 -msgid "Use library only" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1004 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1181 -msgid "User annotations generated from main library only" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1011 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1492 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1549 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1587 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1608 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1734 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1799 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1917 -msgid "No books selected" -msgstr "Cap llibre seleccionat" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1012 -msgid "No books selected to fetch annotations from" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1037 -msgid "Merging user annotations into database" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1065 -msgid "%s
Last Page Read: %d (%d%%)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1071 -msgid "%s
Last Page Read: Location %d (%d%%)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1090 -msgid "Location %d • %s
%s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1099 -msgid "Page %d • %s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1104 -msgid "Location %d • %s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1224 -msgid "How many empty books?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1225 -msgid "How many empty books should be added?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1273 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1324 -msgid "Uploading books to device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1285 -msgid "EPUB Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1286 -msgid "LRF Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1287 -msgid "HTML Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1288 -msgid "LIT Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1289 -msgid "MOBI Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1290 -msgid "Topaz books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1291 -msgid "Text books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1292 -msgid "PDF Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1293 -msgid "Comics" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1294 -msgid "Archives" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1298 -msgid "Supported books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1333 -msgid "Merged some books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1334 -msgid "" -"Some duplicates were found and merged into the following existing books:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1343 -msgid "Failed to read metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1344 -msgid "Failed to read metadata from the following" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1364 -msgid "Cannot delete" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1367 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2061 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2077 -msgid "No book selected" -msgstr "Cap llibre seleccionat" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1377 -msgid "Choose formats to be deleted" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1395 -msgid "Choose formats not to be deleted" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1433 -msgid "" -"The selected books will be permanently deleted and the files removed " -"from your computer. Are you sure?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1460 -msgid "Deleting books from device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1491 -msgid "Cannot download metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1507 -msgid "social metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1509 -msgid "covers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1509 -msgid "metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1511 -msgid "Downloading %s for %d book(s)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1533 -msgid "Failed to download some metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1534 -msgid "Failed to download metadata for the following:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1537 -msgid "Failed to download metadata:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1548 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1586 -msgid "Cannot edit metadata" -msgstr "No puc editar les meta-dades" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1607 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1610 -msgid "Cannot merge books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1611 -msgid "At least two books must be selected for merging" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1615 -msgid "" -"All book formats and metadata from the selected books will be added to the " -"first selected book.

The second and subsequently selected " -"books will not be deleted or changed.

Please confirm you want to " -"proceed." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1626 -msgid "" -"All book formats and metadata from the selected books will be merged into " -"the first selected book.

After merger the second and " -"subsequently selected books will be deleted.

All book formats " -"of the first selected book will be kept and any duplicate formats in the " -"second and subsequently selected books will be permanently deleted " -"from your computer.

Are you sure you want to proceed?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1638 -msgid "" -"You are about to merge more than 5 books. Are you sure you want to " -"proceed?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1733 -msgid "Cannot save to disk" -msgstr "No puc desar al disc" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1736 -msgid "Choose destination directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1769 -msgid "Error while saving" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1770 -msgid "There was an error while saving." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1777 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1778 -msgid "Could not save some books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1779 -msgid "Click the show details button to see which ones." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1800 -msgid "No books selected to generate catalog for" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1817 -msgid "Generating %s catalog..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1823 -msgid "" -"No books to catalog\n" -"Check exclude tags" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1833 -msgid "Catalog generated." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1836 -msgid "Export Catalog Directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1837 -msgid "Select destination for %s.%s" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1851 -msgid "Fetching news from " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1865 -msgid " fetched." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1916 -msgid "Cannot convert" -msgstr "No puc convertir-lo" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1945 -msgid "Starting conversion of %d book(s)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2061 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2114 -msgid "Cannot view" -msgstr "No puc mostrar-lo" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2076 -msgid "Cannot open folder" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2098 -msgid "Multiple Books Selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2099 -msgid "" -"You are attempting to open %d books. Opening too many books at once can be " -"slow and have a negative effect on the responsiveness of your computer. Once " -"started the process cannot be stopped until complete. Do you wish to " -"continue?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2115 -msgid "%s has no available formats." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2156 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:389 msgid "Cannot configure" msgstr "No puc configurar-lo" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2157 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:385 msgid "Cannot configure while there are running jobs." msgstr "No puc configurar-lo amb treballs processant-se" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2200 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:390 +msgid "Cannot configure before calibre is restarted." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:433 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2201 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:434 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2257 -msgid "Error talking to device" -msgstr "Error comunicant amb el dispositiu" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2258 -msgid "" -"There was a temporary error talking to the device. Please unplug and " -"reconnect the device and or reboot." -msgstr "" -"Hi ha hagut un error de comunicació amb el dispositiu. Lleve, torne a " -"connectar el dispositiu i torne a iniciar el programa" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2281 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2309 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:514 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2282 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:487 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:2295 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:500 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2310 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2358 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:555 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." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2383 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:580 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2386 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583 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:2390 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:587 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2442 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:640 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2461 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:52 msgid "" "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2469 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:60 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2470 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:61 msgid "" "%s has been updated to version %s. See the new features. Visit the download page?" @@ -7526,122 +8568,138 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 msgid "Copy Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 msgid "Paste Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:270 msgid "" "Library\n" "%d\n" "books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:271 msgid "" "Reader\n" "%s\n" "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:272 msgid "" "Card A\n" "%s\n" "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:273 msgid "" "Card B\n" "%s\n" "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:277 msgid "Click to see the books available on your computer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 msgid "Click to see the books in the main memory of your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:281 msgid "Click to see the books on storage card A in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:282 msgid "Click to see the books on storage card B in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:290 +msgid "Books located at" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:548 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:549 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:550 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:551 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:552 msgid "Title Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:974 +msgid "Drag to resize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1006 +msgid "Show" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1012 +msgid "Hide" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:367 msgid "" "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." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:371 msgid "" "Remember to leave calibre running as the server only runs as long as calibre " "is running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:373 msgid "" "You have to add the URL http://myhostname:8080 as your calibre library in " "WordPlayer. 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/wizard/__init__.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:450 msgid "Moving library..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:465 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:467 msgid "Failed to move library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:521 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:522 msgid "" "

An invalid library already exists at %s, delete it before trying to move " "the existing library.
Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:533 msgid "Could not move library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:662 msgid "welcome wizard" msgstr "" @@ -7676,13 +8734,6 @@ msgstr "" msgid "&Devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:41 -msgid "WizardPage" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:48 msgid "" "

Congratulations!

You have successfully setup calibre. Press the %s " @@ -7865,38 +8916,49 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/__init__.py:8 -msgid "Settings to control the calibre content server" +#: /home/kovid/work/calibre/src/calibre/library/caches.py:230 +msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/__init__.py:12 -msgid "The port on which to listen. Default is %default" +#: /home/kovid/work/calibre/src/calibre/library/caches.py:233 +msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/__init__.py:14 -msgid "The server timeout in seconds. Default is %default" +#: /home/kovid/work/calibre/src/calibre/library/caches.py:236 +msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/__init__.py:16 -msgid "The max number of worker threads to use. Default is %default" +#: /home/kovid/work/calibre/src/calibre/library/caches.py:239 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:240 +msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/__init__.py:18 -msgid "Set a password to restrict access. By default access is unrestricted." +#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +msgid "no" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/__init__.py:20 -msgid "Username for access. By default, it is: %default" +#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +msgid "unchecked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/__init__.py:24 -msgid "The maximum size for displayed covers. Default is %default." +#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +msgid "checked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/__init__.py:26 -msgid "" -"The maximum number of matches to return per OPDS query. This affects Stanza, " -"WordPlayer, etc. integration." +#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +msgid "yes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 +msgid "blank" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 +msgid "empty" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:41 @@ -7916,14 +8978,14 @@ msgid "" "Applies to: CSV, XML output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:262 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:202 msgid "" "Title of generated catalog used as title in metadata.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:269 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:209 msgid "" "Save the output from different stages of the conversion pipeline to the " "specified directory. Useful if you are unsure at which stage of the " @@ -7932,14 +8994,14 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:279 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:219 msgid "" "Regex describing tags to exclude as genres.\n" "Default: '%default' excludes bracketed tags, e.g. '[]'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:285 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:225 msgid "" "Comma-separated list of tag words indicating book should be excluded from " "output. Case-insensitive.\n" @@ -7948,28 +9010,28 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:293 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:233 msgid "" "Include 'Titles' section in catalog.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:300 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:240 msgid "" "Include 'Recently Added' section in catalog.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:307 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:247 msgid "" "Tag prefix for user notes, e.g. '*Jeff might enjoy reading this'.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:314 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:254 msgid "" "Sort titles with leading numbers as text, e.g.,\n" "'2001: A Space Odyssey' sorts as \n" @@ -7978,7 +9040,7 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:321 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:261 msgid "" "Specifies the output profile. In some cases, an output profile is required " "to optimize the catalog for the device. For example, 'kindle' or " @@ -7988,27 +9050,27 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:328 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:268 msgid "" "Tag indicating book has been read.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:122 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:120 msgid "" "%prog list [options]\n" "\n" "List the books available in the calibre database.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:223 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:128 msgid "" "The fields to display when listing books in the database. Should be a comma " "separated list of fields.\n" @@ -8017,61 +9079,55 @@ msgid "" "fields. Only has effect in the text output format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:230 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:135 msgid "" "The field by which to sort the results.\n" "Available fields: %s\n" "Default: %%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:232 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:137 msgid "Sort results in ascending order" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:234 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:139 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. Default is " "to do no filtering." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:236 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:141 msgid "" "The maximum width of a single line in the output. Defaults to detecting " "screen size." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:237 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:142 msgid "The string used to separate fields. Default is a space." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:238 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:241 -msgid "" -"The format in which to output the data. Available choices: %s. Defaults is " -"text." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/cli.py:263 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:165 msgid "Invalid fields. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:270 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:172 msgid "Invalid sort field. Available fields:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:342 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:365 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:267 msgid "" "%prog add [options] file1 file2 file3 ...\n" "\n" @@ -8080,43 +9136,43 @@ msgid "" "the directory related options below.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:374 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:376 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:278 msgid "Process directories recursively" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:378 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:280 msgid "" "Add books to database even if they already exist. Comparison is done based " "on book titles." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:380 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:282 msgid "Add an empty book (a book with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:382 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:284 msgid "Set the title of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:384 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:286 msgid "Set the authors of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:386 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:288 msgid "Set the ISBN of the added empty book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:411 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:313 msgid "You must specify at least one file to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:427 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:329 msgid "" "%prog remove ids\n" "\n" @@ -8125,11 +9181,11 @@ msgid "" "command). For example, 23,34,57-85\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:442 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:344 msgid "You must specify at least one book to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:461 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:363 msgid "" "%prog add_format [options] id ebook_file\n" "\n" @@ -8138,15 +9194,15 @@ msgid "" "already exists, it is replaced.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:476 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:378 msgid "You must specify an id and an ebook file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:481 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:383 msgid "ebook file must have an extension" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:489 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:391 msgid "" "\n" "%prog remove_format [options] id fmt\n" @@ -8156,11 +9212,11 @@ msgid "" "EPUB. If the logical book does not have fmt available, do nothing.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:506 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:408 msgid "You must specify an id and a format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:524 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:426 msgid "" "\n" "%prog show_metadata [options] id\n" @@ -8170,15 +9226,15 @@ msgid "" "id is an id number from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:532 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:434 msgid "Print metadata in OPF form (XML)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:541 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:443 msgid "You must specify an id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:554 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:456 msgid "" "\n" "%prog set_metadata [options] id /path/to/metadata.opf\n" @@ -8191,11 +9247,11 @@ msgid "" "show_metadata command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:570 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:472 msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:590 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:492 msgid "" "%prog export [options] ids\n" "\n" @@ -8206,27 +9262,27 @@ msgid "" "an opf file). You can get id numbers from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:598 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:500 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:600 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:502 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:602 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:504 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:609 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:511 msgid "Specifying this switch will turn this behavior off." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:632 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:534 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:645 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:547 msgid "" "%prog add_custom_column [options] label name datatype\n" "\n" @@ -8237,23 +9293,23 @@ msgid "" "datatype is one of: {0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:654 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:556 msgid "" "This column stores tag like data (i.e. multiple comma separated values). " "Only applies if datatype is text." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:658 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:560 msgid "" "A dictionary of options to customize how the data in this column will be " "interpreted." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:671 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:573 msgid "You must specify label, name and datatype" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:729 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:631 msgid "" "\n" " %prog catalog /path/to/destination.(csv|epub|mobi|xml ...) [options]\n" @@ -8264,30 +9320,30 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:743 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:645 msgid "" "Comma-separated list of database IDs to catalog.\n" "If declared, --search is ignored.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:747 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:649 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" "Default: no filtering" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:753 -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:655 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:505 msgid "Show detailed output information. Useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:766 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:668 msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:710 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -8299,17 +9355,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:797 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:721 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:808 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:732 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:827 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:751 msgid "" "\n" " %prog custom_columns [options]\n" @@ -8318,19 +9374,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:834 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:758 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:846 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:770 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:848 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:772 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:854 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:778 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -8340,15 +9396,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:862 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:872 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:796 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:885 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:809 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -8360,30 +9416,50 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1261 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:70 +msgid "%sAverage rating is %3.1f" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:545 +msgid "Main" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:547 +msgid "Card A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:549 +msgid "Card B" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1770 msgid "

Migrating old database to ebook library in %s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1290 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1799 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1307 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1400 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1909 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1438 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1950 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972 msgid "Checked id" msgstr "" +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 +msgid "Ratings" +msgstr "Classificació" + #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:24 msgid "The title" msgstr "" @@ -8506,25 +9582,106 @@ msgstr "" msgid "Requested formats not available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server.py:379 +#: /home/kovid/work/calibre/src/calibre/library/server/__init__.py:21 +msgid "Settings to control the calibre content server" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/__init__.py:25 +msgid "The port on which to listen. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/__init__.py:27 +msgid "The server timeout in seconds. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/__init__.py:29 +msgid "The max number of worker threads to use. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/__init__.py:31 +msgid "Set a password to restrict access. By default access is unrestricted." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/__init__.py:33 +msgid "Username for access. By default, it is: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/__init__.py:37 +msgid "The maximum size for displayed covers. Default is %default." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/__init__.py:39 +msgid "" +"The maximum number of matches to return per OPDS query. This affects Stanza, " +"WordPlayer, etc. integration." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/__init__.py:43 +msgid "" +"Group items in categories such as author/tags by first letter when there are " +"more than this number of items. Default: %default. Set to a large number to " +"disable grouping." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/base.py:93 msgid "Password to access your calibre library. Username is " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server.py:886 +#: /home/kovid/work/calibre/src/calibre/library/server/main.py:28 msgid "" "[options]\n" "\n" "Start the calibre content server." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server.py:888 +#: /home/kovid/work/calibre/src/calibre/library/server/main.py:30 msgid "Path to the library folder to serve with the content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server.py:890 +#: /home/kovid/work/calibre/src/calibre/library/server/main.py:32 msgid "Write process PID to the specified file" msgstr "" +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:108 +msgid "%d books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:127 +msgid "%d items" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144 +msgid "RATING: %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:147 +msgid "TAGS: %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:151 +msgid "SERIES: %s [%s]
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:192 +msgid "Library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:231 +msgid "Books in your library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:237 +msgid "By " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:238 +msgid "Books sorted by " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 +msgid "Newest" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/utils/config.py:48 msgid "%sUsage%s: %s\n" msgstr "" @@ -8539,58 +9696,66 @@ msgid "" "arguments in quotation marks." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:650 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:670 msgid "Path to the database in which books are stored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:652 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:672 msgid "Pattern to guess metadata from filenames" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:654 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:674 msgid "Access key for isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:656 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:676 msgid "Default timeout for network operations (seconds)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:658 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:678 msgid "Path to directory in which your library of books is stored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:660 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:680 msgid "The language in which to display the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:662 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:682 msgid "The default output format for ebook conversions." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:666 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:686 msgid "Ordered list of formats to prefer for input." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:668 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:688 msgid "Read metadata from files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:670 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:690 msgid "The priority of worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:672 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:692 msgid "Swap author first and last names when reading metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:674 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:694 msgid "Add new formats to existing book records" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:678 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:699 msgid "List of named saved searches" msgstr "" +#: /home/kovid/work/calibre/src/calibre/utils/config.py:700 +msgid "User-created tag browser categories" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/config.py:702 +msgid "Preserve all collections even if not in library metadata." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43 msgid "Waiting..." msgstr "" @@ -8660,34 +9825,38 @@ msgid "English (Pakistan)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:106 -msgid "English (Singapore)" +msgid "English (Israel)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:107 -msgid "English (Yemen)" +msgid "English (Singapore)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:108 -msgid "English (Ireland)" +msgid "English (Yemen)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:109 -msgid "English (China)" +msgid "English (Ireland)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:110 -msgid "Spanish (Paraguay)" +msgid "English (China)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 -msgid "German (AT)" +msgid "Spanish (Paraguay)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:112 -msgid "Dutch (NL)" +msgid "German (AT)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:113 +msgid "Dutch (NL)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:114 msgid "Dutch (BE)" msgstr "" @@ -8711,13 +9880,13 @@ msgstr "" msgid "Control email delivery" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:113 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:135 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:118 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:140 msgid "Unknown feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:153 -#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:178 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:158 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:183 msgid "Untitled article" msgstr "" @@ -8744,97 +9913,97 @@ msgid "" "Do not download latest version of builtin recipes from the calibre server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:43 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:44 msgid "Unknown News Source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:565 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:608 msgid "The \"%s\" recipe needs a username and password." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:654 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:706 msgid "Download finished" msgstr "S'ha finalitzat la baixada" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:656 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:708 msgid "Failed to download the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:662 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:714 msgid "Failed to download parts of the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:664 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:716 msgid " from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:666 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:747 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:807 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:768 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:828 msgid "Fetching feeds..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:773 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:833 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:779 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:839 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:781 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:841 msgid "Generating masthead..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:861 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:922 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:877 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:938 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:887 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:948 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:899 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:960 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:934 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1000 msgid "Masthead image downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1158 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1190 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1230 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1261 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1241 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1272 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1258 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1289 msgid "Fetching feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1405 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1436 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1421 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1452 msgid "" "You do not have permission to download this issue. Either your subscription " "has expired or you have exceeded the maximum allowed downloads for today." @@ -8846,64 +10015,64 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:73 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:82 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:181 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:183 msgid "Scheduled" msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:182 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:184 msgid "Custom" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:471 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 msgid "" "%prog URL\n" "\n" "Where URL is for example http://google.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:474 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:485 msgid "Base directory into which URL is saved. Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:477 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:488 msgid "" "Timeout in seconds to wait for a response from the server. Default: %default " "s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:480 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:491 msgid "" "Maximum number of levels to recurse i.e. depth of links to follow. Default " "%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:483 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 msgid "" "The maximum number of files to download. This only applies to files from tags. Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:485 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 msgid "" "Minimum interval in seconds between consecutive fetches. Default is %default " "s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:487 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 msgid "" "The character encoding for the websites you are trying to download. The " "default is to try and guess the encoding." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:489 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:500 msgid "" "Only links that match this regular expression will be followed. This option " "can be specified multiple times, in which case as long as a link matches any " "one regexp, it will be followed. By default all links are followed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:491 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:502 msgid "" "Any link that matches this regular expression will be ignored. This option " "can be specified multiple times, in which case as long as any regexp matches " @@ -8912,7 +10081,7 @@ msgid "" "applied first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:493 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:504 msgid "Do not download CSS stylesheets." msgstr "" @@ -9283,6 +10452,11 @@ msgstr "" #~ msgstr "" #~ "Estableix comunicació amb el lector de llibres electrònics Sony PRS-600/700" +#~ msgid "Communicate with the Sony PRS-300/505/500 eBook reader." +#~ msgstr "" +#~ "Estableix comunicació amb el lector de llibres electrònics Sony PRS-" +#~ "300/505/500." + #~ msgid "Communicate with the Cybook Opus eBook reader." #~ msgstr "" #~ "Estableix comunicació amb el lector de llibres electrònics Cybook Opus." @@ -9297,3 +10471,22 @@ msgstr "" #~ msgid "Communicate with the BeBook Mini eBook reader." #~ msgstr "" #~ "Estableix comunicació amb el lector de llibres electrònics BeBook Mini." + +#~ msgid "Communicate with the Sony PRS-600/700/900 eBook reader." +#~ msgstr "" +#~ "Estableix comunicació amb el lector de llibres electrònics Sony PRS-" +#~ "600/700/900." + +#~ msgid "Communicate with iBooks through iTunes." +#~ msgstr "Comunicar-se amb els iBooks a través d'iTunes" + +#~ msgid "" +#~ "Do not use SVG for the book cover. Use this option if your EPUB is going to " +#~ "be used ona device that does not support SVG, like the iPhone or the " +#~ "JetBook Lite. Without this option, such devices will display the cover as a " +#~ "blank page." +#~ msgstr "" +#~ "No utilitzi SVG per a la tapa del llibre. Utilitzi aquesta opció si el seu " +#~ "EPUB s'utilitzarà a un dispositiu que no es compatible amb SVG, com l'iPhone " +#~ "o el jetBook Lite. Sense aquesta opció, dits dispositius mostraran la tapa " +#~ "com una pàgina en blanc." diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index 0b8c2fa600..02db8dde80 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -4,9 +4,9 @@ # msgid "" msgstr "" -"Project-Id-Version: calibre 0.7.2\n" -"POT-Creation-Date: 2010-06-14 01:05+MDT\n" -"PO-Revision-Date: 2010-06-14 01:05+MDT\n" +"Project-Id-Version: calibre 0.7.8\n" +"POT-Creation-Date: 2010-07-09 15:14+MDT\n" +"PO-Revision-Date: 2010-07-09 15:14+MDT\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -21,39 +21,40 @@ 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:54 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:75 #: /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:431 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:385 -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:98 -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:101 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:492 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:396 +#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 +#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:428 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:329 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:332 +#: /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/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:230 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:270 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:273 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:373 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:235 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:276 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:279 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:390 #: /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 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:46 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:317 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:943 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1055 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:945 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1057 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:28 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -69,9 +70,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:818 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:908 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:979 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:137 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:139 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:108 @@ -99,47 +100,49 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:233 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:235 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:286 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:293 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:741 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:744 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:107 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:870 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1151 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:814 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:817 +#: /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:22 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:898 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:907 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1190 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1193 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:492 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:481 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:351 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:371 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:846 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1018 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:882 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1060 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:185 #: /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:302 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:314 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:880 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:917 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1515 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1517 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1639 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:335 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:347 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:950 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1019 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1620 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1622 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1744 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:268 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:131 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:134 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:68 -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:114 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:115 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:64 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:78 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:47 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:50 msgid "Unknown" @@ -165,61 +168,61 @@ msgstr "" msgid "Catalog generator" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:16 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 library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:50 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:52 msgid "Character encoding for the input HTML files. Common choices include: cp1252, latin1, iso-8859-1 and utf-8." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:57 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:59 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 file to the library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:89 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:93 msgid "Extract cover from comic files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:116 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:127 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:139 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:149 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:170 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:180 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:190 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:200 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:210 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:220 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:231 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:242 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:254 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:275 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:286 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:296 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:306 +#: /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 msgid "Read metadata from %s files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:265 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:269 msgid "Read metadata from ebooks in RAR archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:317 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:321 msgid "Read metadata from ebooks in ZIP archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:328 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:338 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:348 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:370 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:381 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:391 +#: /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 msgid "Set metadata in %s files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:359 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:365 msgid "Set metadata from %s files" msgstr "" @@ -248,7 +251,7 @@ msgid "This profile tries to provide sane defaults and is useful if you know not msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:57 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:266 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:412 msgid "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -257,122 +260,126 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:78 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:300 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:447 msgid "This profile is intended for the SONY PRS-900." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:330 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:477 msgid "This profile is intended for the Microsoft Reader." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:97 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:341 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:488 msgid "This profile is intended for the Mobipocket books." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:110 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:354 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:501 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:122 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:132 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:374 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:521 msgid "This profile is intended for the Cybook G3." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:145 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:387 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:534 msgid "This profile is intended for the Cybook Opus." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:157 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:398 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:545 msgid "This profile is intended for the Amazon Kindle." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:169 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:580 msgid "This profile is intended for the Irex Illiad." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:181 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:446 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:593 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:460 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:607 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:206 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:474 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:621 msgid "This profile is intended for the B&N Nook." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:226 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:228 msgid "Output profile" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:230 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:232 msgid "This profile tries to provide sane defaults and is useful if you want to produce a document intended to be read at a computer or on a range of devices." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:254 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:257 msgid "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:279 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:425 msgid "This profile is intended for the Kobo Reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:291 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:438 msgid "This profile is intended for the SONY PRS-300." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:309 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:456 msgid "This profile is intended for the 5-inch JetBook." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:318 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:465 msgid "This profile is intended for the SONY PRS line. The 500/505/700 etc, in landscape mode. Mainly useful for comics." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:416 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 msgid "This profile is intended for the Amazon Kindle DX." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:31 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:32 msgid "Installed plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:32 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:33 msgid "Mapping for filetype plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:33 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 msgid "Local plugin customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 msgid "Disabled plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:77 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:36 +msgid "Enabled plugins" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:84 msgid "No valid plugin found in " msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:278 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:468 msgid "Initialization of plugin %s failed with traceback:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 msgid "" " %prog options\n" "\n" @@ -380,27 +387,27 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:439 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:507 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:441 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:509 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:443 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:511 msgid "Customize plugin. Specify name of plugin and customization string separated by a comma." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:445 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:513 msgid "List all installed plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:447 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:515 msgid "Enable the named plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:449 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:517 msgid "Disable the named plugin" msgstr "" @@ -408,63 +415,79 @@ msgstr "" msgid "Communicate with Android phones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:39 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:45 msgid "Comma separated list of directories to send e-books to on the device. The first one that exists will be used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:70 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:77 msgid "Communicate with S60 phones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:75 -msgid "Communicate with iBooks through iTunes." +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:87 +msgid "Communicate with iTunes/iBooks." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:81 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:93 msgid "Apple device detected, launching iTunes, please wait ..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:196 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:214 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:217 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:246 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:249 msgid "Updating device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:282 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:318 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:806 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:832 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:323 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:921 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:957 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2791 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2830 msgid "%d of %d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:325 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:837 +#: /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:2836 msgid "finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:499 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:544 +msgid "Use Series as Category in iTunes/iBooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:546 +msgid "Cache covers from iTunes/iBooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:558 msgid "" "Some books not found in iTunes database.\n" "Delete using the iBooks app.\n" "Click 'Show Details' for a list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:703 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:28 -msgid "settings for device drivers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:705 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:30 -msgid "Ordered list of formats the device will accept" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:776 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:886 msgid "" "Some cover art could not be converted.\n" "Click 'Show Details' for a list." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2471 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:807 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:813 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:239 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:167 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:180 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1504 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:128 +msgid "News" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2698 +msgid "Communicate with iTunes." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/binatone/driver.py:17 msgid "Communicate with the Binatone Readme eBook reader." msgstr "" @@ -487,6 +510,14 @@ msgstr "" msgid "Communicate with the EB600 eBook reader." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:193 +msgid "Communicate with the Astak Mentor EB600" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:216 +msgid "Communicate with the PocketBook 301 reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" msgstr "" @@ -517,14 +548,18 @@ msgstr "" msgid "Communicate with Hanlin V3 eBook readers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:90 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:87 msgid "Communicate with Hanlin V5 eBook readers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:109 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:106 msgid "Communicate with the BOOX eBook reader." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:123 +msgid "Comma separated list of directories to send e-books to on the device. The first one that exists will be used." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "" @@ -571,22 +606,56 @@ msgstr "" msgid "Communicate with the JetBook eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:21 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:42 msgid "Communicate with the Kindle eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:169 msgid "Communicate with the Kindle 2 eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:157 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:210 msgid "Communicate with the Kindle DX eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:14 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:22 msgid "Communicate with the Kobo Reader" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:51 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:54 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:159 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:64 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:67 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:130 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:137 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:160 +msgid "Getting list of books on device..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:219 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:263 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:244 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:262 +msgid "Removing books from device..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:267 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:274 +msgid "Removing books from device metadata listing..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:279 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:313 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:208 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:238 +msgid "Adding books to device metadata listing..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/misc.py:15 msgid "Communicate with the Palm Pre" msgstr "" @@ -595,6 +664,14 @@ msgstr "" msgid "Communicate with the Booq Avant" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:55 +msgid "Communicate with the Sweex MM300" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:75 +msgid "Communicate with the Pandigital Novel" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "" @@ -603,6 +680,10 @@ msgstr "" msgid "Communicate with the Nokia 810 internet tablet." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:74 +msgid "Communicate with the Nokia E52" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:20 msgid "The Nook" msgstr "" @@ -623,11 +704,11 @@ msgstr "" msgid "Communicate with all the Sony eBook readers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:60 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:61 msgid "Comma separated list of metadata fields to turn into collections on the device. Possibilities include: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:142 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:140 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 msgid "Unnamed" msgstr "" @@ -648,78 +729,79 @@ msgstr "" msgid "Communicate with the iPapyrus reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:247 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:245 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:427 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:425 msgid "Unable to detect the %s mount point. Try rebooting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:492 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:490 msgid "Unable to detect the %s disk drive." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:585 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:583 msgid "Could not find mount helper: %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:597 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:595 msgid "Unable to detect the %s disk drive. Your kernel is probably exporting a deprecated version of SYSFS." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:605 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:603 msgid "Unable to mount main memory (Error code: %d)" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:740 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:742 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 msgid "The reader has no storage card in this slot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:746 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 msgid "Selected slot: %s is not supported." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:775 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:773 msgid "There is insufficient free space in main memory" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:775 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:777 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:779 msgid "There is insufficient free space on the storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:809 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:815 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:843 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:239 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:141 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:152 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1399 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:120 -msgid "News" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:12 msgid "Configure Device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:32 -msgid "Place files in sub directories if the device supports them" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:34 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 -msgid "Read metadata from files on device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:36 -msgid "Template to control how books are saved" +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:37 +msgid "settings for device drivers" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 +msgid "Ordered list of formats the device will accept" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:41 +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 +msgid "Read metadata from files on device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:45 +msgid "Use author sort instead of author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:47 +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 msgid "Extra customization" msgstr "" @@ -731,36 +813,12 @@ msgstr "" msgid "Get device information..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:64 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:67 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:130 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:137 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:160 -msgid "Getting list of books on device..." -msgstr "" - #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:188 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 msgid "Transferring books to device..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:208 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:237 -msgid "Adding books to device metadata listing..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:243 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:261 -msgid "Removing books from device..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:268 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:273 -msgid "Removing books from device metadata listing..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:294 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:305 msgid "Sending metadata to device..." msgstr "" @@ -1234,6 +1292,43 @@ msgstr "" msgid "Creating" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:18 +msgid "ePub Fixer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/epubcheck.py:18 +msgid "Workaround epubcheck bugs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/epubcheck.py:22 +msgid "Workarounds for bugs in the latest release of epubcheck. epubcheck reports many things as errors that are not actually errors. %prog will try to detect these and replace them with constructs that epubcheck likes. This may cause significant changes to your epub, complain to the epubcheck project." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:19 +msgid "" +"%prog [options] file.epub\n" +"\n" +"Fix common problems in EPUB files that can cause them to be rejected by poorly designed publishing services.\n" +"\n" +"By default, no fixing is done and messages are printed out for each error detected. Use the options to control which errors are automatically fixed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:50 +msgid "You must specify an epub file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/unmanifested.py:17 +msgid "Fix unmanifested files" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/unmanifested.py:21 +msgid "Fix unmanifested files. %prog can either add them to the manifest or delete them as specified by the delete unmanifested option." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/unmanifested.py:32 +msgid "Delete unmanifested files instead of adding them to the manifest" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:56 msgid "Extract the contents of the generated EPUB file to the specified directory. The contents of the directory are first deleted, so be careful." msgstr "" @@ -1251,7 +1346,7 @@ msgid "Normally, if the input file has no cover and you don't specify one, a def msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:86 -msgid "Do not use SVG for the book cover. Use this option if your EPUB is going to be used ona device that does not support SVG, like the iPhone or the JetBook Lite. Without this option, such devices will display the cover as a blank page." +msgid "Do not use SVG for the book cover. Use this option if your EPUB is going to be used on a device that does not support SVG, like the iPhone or the JetBook Lite. Without this option, such devices will display the cover as a blank page." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:94 @@ -1280,19 +1375,19 @@ msgstr "" msgid "Add Table of Contents to beginning of the book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:243 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:248 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:250 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:255 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:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:264 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 can result in various nasty side effects in the rest of of the conversion pipeline." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:267 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:272 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." msgstr "" @@ -1422,7 +1517,7 @@ msgid "Path to output file" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:114 msgid "Verbose processing" msgstr "" @@ -1495,88 +1590,86 @@ msgstr "" msgid "Comic" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:372 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:389 #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:348 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:851 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 +#: /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:543 msgid "Title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:373 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:353 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:852 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:390 +#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:888 msgid "Author(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:374 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:62 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 +#: /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:375 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:392 #: /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:376 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:34 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:186 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393 +#: /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:185 #: /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/library/models.py:307 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1037 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:153 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:154 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:155 +#: /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:384 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:295 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1033 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1075 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:139 msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:386 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1042 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1084 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:87 msgid "Series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:404 msgid "Language" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:389 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1025 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:60 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:408 +#: /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:393 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:410 msgid "Rights" msgstr "" @@ -1584,7 +1677,7 @@ msgstr "" msgid "EDITORIAL REVIEW" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:22 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:41 msgid "Extract common e-book formats from archives (zip/rar) files. Also try to autodetect if they are actually cbz/cbr files." msgstr "" @@ -1670,43 +1763,55 @@ msgstr "" msgid "No cover found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:33 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:15 +msgid "Cover download" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:42 +msgid "Downloads metadata from Douban.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:34 msgid "Metadata download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 msgid "ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 msgid "tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:112 msgid "description/reviews" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:113 msgid "Download %s from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:136 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:139 msgid "Downloads metadata from Google Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:152 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:156 msgid "Downloads metadata from isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:180 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:184 msgid "To use isbndb.com you must sign up for a %sfree account%s and enter your access key below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:188 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:194 msgid "Downloads social metadata from amazon.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:213 +msgid "Downloads series/tags/rating information from librarything.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:95 msgid "" "\n" "%prog [options] key\n" @@ -1719,48 +1824,48 @@ msgid "" "\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:105 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:106 msgid "The ISBN ID of the book you want metadata for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 msgid "The author whose book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 msgid "The title of the book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 msgid "The publisher of the book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:53 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:68 msgid "LibraryThing.com timed out. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:60 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:75 msgid "Could not fetch cover as server is experiencing high load. Please try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:61 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:76 msgid " not found." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:64 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:79 msgid "LibraryThing.com server error. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:71 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:86 msgid "" "\n" "%prog [options] ISBN\n" "\n" -"Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" +"Fetch a cover image/social metadata for the book identified by ISBN from LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1220 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1371 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1226 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 msgid "Cover" msgstr "" @@ -1797,70 +1902,70 @@ msgstr "" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1372 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1373 +#: /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 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1374 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1375 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1376 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1377 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1378 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1379 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1380 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1381 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1382 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1383 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1384 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1385 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1386 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1387 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Main Text" msgstr "" @@ -1902,13 +2007,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:22 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:23 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:23 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:24 msgid "Normally calibre treats blank lines as paragraph markers. With this option it will assume that every line represents a paragraph instead." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:27 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:27 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:28 msgid "Normally calibre treats blank lines as paragraph markers. With this option it will assume that every line starting with an indent (either a tab or 2+ spaces) represents a paragraph. Paragraphs end when the next line that starts with an indent is reached." msgstr "" @@ -2025,6 +2130,8 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:29 msgid "Author" msgstr "" @@ -2144,15 +2251,15 @@ msgstr "" msgid "Specify the compression level to use. Scale 1 - 10. 1 being the lowest compression but the fastest and 10 being the highest compression but the slowest." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:33 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:34 msgid "Normally extra spaces are condensed into a single space. With this option all spaces will be displayed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:36 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:37 msgid "Run the text input through the markdown pre-processor. To learn more about markdown see" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:39 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:40 msgid "Do not insert a Table of Contents into the output text." msgstr "" @@ -2201,7 +2308,7 @@ msgid "Use Roman numerals for series number" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47 -msgid "Sort tags list by popularity" +msgid "Sort tags list by name, popularity, or rating" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:49 @@ -2280,341 +2387,392 @@ msgstr "" msgid "The layout of the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:105 +msgid "Show the average rating per item indication in the tag browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:107 +msgid "Disable UI animations" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:476 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:189 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:189 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:400 msgid "Choose Files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:245 msgid "Use library only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:246 msgid "User annotations generated from main library only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:541 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:598 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:655 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:786 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:851 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:969 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:707 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:728 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:941 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1059 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:76 msgid "No books selected to fetch annotations from" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:101 msgid "Merging user annotations into database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:129 msgid "%s
Last Page Read: %d (%d%%)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:135 msgid "%s
Last Page Read: Location %d (%d%%)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:154 msgid "Location %d • %s
%s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:163 msgid "Page %d • %s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:168 msgid "Location %d • %s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:291 msgid "How many empty books?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:292 msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:336 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:339 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:390 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:347 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137 msgid "Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:351 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:349 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:352 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:353 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:354 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:355 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:356 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:357 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:358 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:359 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:360 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:364 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:399 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:400 msgid "Some duplicates were found and merged into the following existing books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:409 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:410 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:425 -msgid "Cannot delete" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:434 +msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:428 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1121 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1146 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:459 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1203 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1228 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:438 -msgid "Choose formats to be deleted" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:434 +msgid "No book files found" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions.py:456 +msgid "Cannot delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:469 +msgid "Choose formats to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:487 msgid "Choose formats not to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:494 -msgid "The selected books will be permanently deleted and the files removed from your computer. Are you sure?" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:507 +msgid "Cannot delete books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:515 -msgid "The selected books will be permanently deleted from your device. Are you sure?" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:508 +msgid "No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:518 +msgid "Main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:453 +msgid "Storage Card A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 +msgid "Storage Card B" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:525 +msgid "No books to delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:526 +msgid "None of the selected books are on the device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:600 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:564 +msgid "The selected books will be permanently deleted and the files removed from your computer. Are you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:585 +msgid "The selected books will be permanently deleted from your device. Are you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:610 msgid "Cannot download metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:626 msgid "social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:628 msgid "covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:628 msgid "metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:560 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:630 msgid "Downloading %s for %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:582 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:654 msgid "Failed to download some metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:655 msgid "Failed to download metadata for the following:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:658 msgid "Failed to download metadata:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:606 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:518 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:943 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:659 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:637 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:951 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:635 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:706 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:654 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:657 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:727 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:730 msgid "Cannot merge books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:731 msgid "At least two books must be selected for merging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:735 msgid "All book formats and metadata from the selected books will be added to the first selected book.

The second and subsequently selected books will not be deleted or changed.

Please confirm you want to proceed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:673 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:746 msgid "All book formats and metadata from the selected books will be merged into the first selected book.

After merger the second and subsequently selected books will be deleted.

All book formats of the first selected book will be kept and any duplicate formats in the second and subsequently selected books will be permanently deleted from your computer.

Are you sure you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:758 msgid "You are about to merge more than 5 books. Are you sure you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:785 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:875 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:788 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:878 msgid "Choose destination directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:821 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:911 msgid "Error while saving" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:912 msgid "There was an error while saving." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:829 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:830 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:920 msgid "Could not save some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:831 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:921 msgid "Click the show details button to see which ones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:852 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:942 msgid "No books selected to generate catalog for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:869 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:959 msgid "Generating %s catalog..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:874 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:964 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:264 msgid "No books found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:965 msgid "" "No books to catalog\n" "Check exclude tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:975 msgid "Catalog generated." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:888 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:978 msgid "Export Catalog Directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:979 msgid "Select destination for %s.%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:905 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:995 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1009 msgid " fetched." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:968 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1058 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1087 msgid "Starting conversion of %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1121 -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1182 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1203 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1264 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1127 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1209 #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:76 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1135 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1217 msgid "Multiple Books Selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1136 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1218 msgid "You are attempting to open %d books. Opening too many books at once can be slow and have a negative effect on the responsiveness of your computer. Once started the process cannot be stopped until complete. Do you wish to continue?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1145 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1227 msgid "Cannot open folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1183 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1265 msgid "%s has no available formats." msgstr "" @@ -2622,56 +2780,56 @@ msgstr "" msgid "Searching in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:232 msgid "Adding..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 msgid "Searching in all sub-directories..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:258 msgid "Path error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:259 msgid "The specified directory could not be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:804 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:840 msgid "No books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:330 msgid "Added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:343 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:344 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:353 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:356 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 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:357 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:360 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:427 msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:480 msgid "Saved" msgstr "" @@ -2750,25 +2908,25 @@ msgstr "" #: /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:52 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:547 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:579 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:581 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:583 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:585 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:586 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:623 -#: /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: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:408 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /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/config/config_ui.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:590 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:596 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:637 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /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:385 +#: /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:400 +#: /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 #: /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 @@ -2779,17 +2937,17 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /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:74 -#: /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: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/main_ui.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 #: /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 @@ -2808,51 +2966,60 @@ msgstr "" msgid "&Multiple books per folder, assumes every ebook file is a different book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:22 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:311 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:302 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1023 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1065 msgid "Path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:117 #: /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:219 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:301 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:96 msgid "Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:855 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1026 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:891 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1068 msgid "Collections" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 msgid "Click to open" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:294 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:300 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1032 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1036 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:317 +#: /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:416 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:467 msgid "None" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:310 +msgid "Click to open Book Details window" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:16 msgid "CSV/XML Options" msgstr "" @@ -2898,7 +3065,7 @@ msgstr "" #: /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/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:167 #: /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 @@ -2908,11 +3075,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:45 +#: /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:49 #: /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:74 +#: /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/search_item_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 @@ -2930,8 +3097,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:222 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1362 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1380 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1467 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1485 msgid "Catalog" msgstr "" @@ -3349,114 +3516,114 @@ msgstr "" msgid "Set the metadata. The output file will contain as much of this metadata as possible." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:99 msgid "Choose cover for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:106 msgid "Cannot read" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:107 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:115 msgid "Error reading file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "

There was an error reading from file:
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:124 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:405 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "Book Cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 -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:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 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:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 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:366 -msgid "&Title: " +msgid "Use cover from &source file" 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:367 -msgid "Change the title of this book" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:363 +msgid "&Title: " 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:370 -msgid "&Author(s): " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 +msgid "Change the title of this book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 -msgid "Author So&rt:" +#: /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:367 +msgid "&Author(s): " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 -msgid "Change the author(s) of this book. Multiple authors should be separated by a comma" +msgid "Author So&rt:" 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:379 -msgid "&Publisher: " +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:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 -msgid "Ta&gs: " +#: /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:376 +msgid "&Publisher: " 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:381 -msgid "Tags categorize the book. This is particularly useful while searching.

They can be any words or phrases, separated by commas." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +msgid "Ta&gs: " 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:384 -msgid "&Series:" +#: /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:378 +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:181 +#: /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:381 +msgid "&Series:" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 #: /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:385 -#: /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:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 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:391 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "Book " msgstr "" @@ -3541,12 +3708,12 @@ msgid "PDB Input" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:32 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47 msgid "Treat each &line as a paragraph" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:33 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:48 msgid "Assume print formatting" msgstr "" @@ -3669,12 +3836,12 @@ msgid "Footer regular expression:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:77 msgid "Invalid regular expression" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:78 msgid "Invalid regular expression: %s" msgstr "" @@ -3764,19 +3931,19 @@ msgstr "" msgid "TXT Input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:49 msgid "Process using markdown" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:50 msgid "

Markdown is a simple markup language for text files, that allows for advanced formatting. To learn more visit markdown." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 msgid "Do not insert Table of Contents into output text when using markdown" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:52 msgid "Preserve &spaces" msgstr "" @@ -3879,11 +4046,11 @@ msgstr "" msgid "

For example, to match all h2 tags that have class=\"chapter\", set tag to h2, attribute to class and value to chapter.

Leaving attribute blank will match any attribute and leaving value blank will match any value. Setting tag to * will match any tag.

To learn more advanced usage of XPath see the XPath Tutorial." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:127 msgid "Cover browser could not be loaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:179 msgid "Browse by covers" msgstr "" @@ -3892,6 +4059,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:205 @@ -3920,283 +4088,291 @@ msgstr "" msgid "Unrated" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:249 +msgid " index:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:432 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +msgid "Automatically number books in this series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:475 msgid "Remove all tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:496 msgid "tags to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:501 msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:48 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:135 msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:154 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:270 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:281 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:291 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:300 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:305 +msgid "Send collections to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:329 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:344 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:361 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:371 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:387 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 msgid "Email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 msgid " and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:433 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:435 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:425 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:451 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:427 -msgid "Storage Card A" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:420 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:429 -msgid "Storage Card B" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:470 msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:483 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:509 msgid "Connect to folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 -msgid "Disconnect from folder" +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:515 +msgid "Connect to iTunes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:496 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:520 +msgid "Eject device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:528 msgid "Fetch annotations (experimental)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:638 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:659 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:704 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:710 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:677 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:711 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:704 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:753 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:706 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:755 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:737 -msgid "Connected " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:805 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:810 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:846 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:818 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:855 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:819 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:856 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:859 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:863 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:864 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:868 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:905 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:908 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:909 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:181 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:910 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:923 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:916 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:923 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1015 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1076 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1195 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1202 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:953 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:961 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1053 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1115 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1234 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1242 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:917 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:954 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:962 msgid "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:943 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1012 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:975 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1013 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1024 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1016 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1077 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1196 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1116 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1235 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1045 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1108 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1148 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1162 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 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:1251 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1304 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1305 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:75 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 msgid "Select available formats and their order for this device" 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:82 msgid "Use sub directories" msgstr "" #: -#: /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:83 +msgid "Use author sort for author" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 msgid "Save &template:" msgstr "" @@ -4217,7 +4393,7 @@ msgid "My Books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:289 msgid "Generate catalog" msgstr "" @@ -4269,614 +4445,643 @@ msgstr "" msgid "Edit Comments" 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 "%(plugin_type)s %(plugins)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:175 msgid "plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:184 msgid "" "\n" "Customization: " 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:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 msgid "General" 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 "Interface" 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 "Add/Save" 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 "Advanced" 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 "" "Content\n" "Server" 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 "Plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 msgid "Auto send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 msgid "Email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:225 msgid "Formats to email. The first matching format will be sent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:226 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:299 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:300 msgid "new email address" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:487 +#: /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:488 +#: /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:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:503 msgid "System port selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:504 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:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:524 msgid "Failed to install command line tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:527 msgid "Command line tools installed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:528 msgid "Command line tools installed in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:529 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:575 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:580 msgid "No valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:576 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:581 msgid "%s is not a valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:579 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:584 msgid "Choose plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:596 msgid "Plugin cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:597 msgid "The plugin: %s cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:601 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:606 msgid "Plugin not customizable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:607 msgid "Plugin: %s does not need customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:610 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:615 msgid "Customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:648 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:653 msgid "Cannot remove builtin plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:649 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:654 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:680 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:685 msgid "You must select a column to delete it" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:690 msgid "The selected column is not a custom column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:686 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:691 #: /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:687 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:692 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:754 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:759 msgid "Error log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:761 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:766 msgid "Access log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:789 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:794 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:332 msgid "Failed to start content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:813 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:818 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:587 msgid "Select location for books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:820 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:825 msgid "Invalid size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:821 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:826 msgid "The size %s is invalid. must be of the form widthxheight" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:878 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:883 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:891 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:887 msgid "Invalid database location " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:888 msgid "
Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:884 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:892 msgid "Invalid database location.
Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:897 msgid "Must restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:890 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:898 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:924 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:932 msgid "Checking database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:944 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:952 msgid "Failed to check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:949 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:957 msgid "Some inconsistencies found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:950 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:958 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:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:113 msgid "TabWidget" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:114 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:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:115 msgid "Read metadata only from &file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:116 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:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:117 msgid "&Swap author firstname and lastname" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:118 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" +"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:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122 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:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:123 msgid "&Configure metadata from file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:124 msgid "&Adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:125 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:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:126 msgid "Save &cover separately" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:127 msgid "Update &metadata in saved copies" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:128 msgid "Save metadata in &OPF file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:129 msgid "Convert non-English characters to &English equivalents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:130 msgid "Format &dates as:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:131 msgid "File &formats to save:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:132 msgid "Replace space with &underscores" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:133 msgid "Change paths to &lowercase" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:134 msgid "&Saving books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:135 +msgid "Preserve device collections." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:136 +msgid "If checked, collections will not be deleted even if a book with changed metadata is resent and the collection is not in the book's metadata. In addition, editing collections in the device view will be enabled. If unchecked, collections will be always reflect only the metadata in the calibre library." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:137 +msgid " " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:138 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:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:139 msgid "Sending to &device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:544 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:290 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 msgid "Preferences" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555 msgid "&Location of ebooks (The ebooks are stored in folders sorted by author and metadata is stored in the file metadata.db)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556 msgid "Browse for the new database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:558 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:559 msgid "Download &social metadata (tags/ratings/etc.) by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:560 msgid "&Overwrite author and title by default when fetching metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562 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:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:563 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564 msgid "Choose &language (requires restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:565 msgid "Normal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:566 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:567 msgid "Low" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:568 msgid "Job &priority:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569 msgid "Preferred &output format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:570 msgid "Preferred &input format order:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574 msgid "Enable system &tray icon (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:565 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575 msgid "Show ¬ifications in system tray" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:566 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:576 msgid "Show &splash screen at startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:567 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 msgid "Show cover &browser in a separate window (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:568 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:578 +msgid "Show &average ratings in the tags browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:579 msgid "Search as you type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:580 msgid "Automatically send downloaded &news to ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:581 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:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:582 msgid "&Number of covers to show in browse mode (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:583 msgid "Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:584 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:585 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:586 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:576 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:587 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:588 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:578 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:589 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:580 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:591 msgid "Remove a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:582 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:593 msgid "Add a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:584 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:595 msgid "Edit settings of a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:598 msgid "Use internal &viewer for:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:599 msgid "User Interface &layout (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:589 -msgid "Add an email address to which to send books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:590 -msgid "&Add email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:591 -msgid "Make &default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:592 -msgid "&Remove email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:593 -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:594 -msgid "&Maximum number of waiting worker processes (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:595 -msgid "&Check database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:596 -msgid "&Install command line tools" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:597 -msgid "Open calibre &configuration directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:598 -msgid "Limit the max. simultaneous jobs to the available CPU &cores" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:599 -msgid "Debug &device detection" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:600 -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." +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:601 -msgid "Server &port:" +msgid "Disable &animations" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 +msgid "Show &donate button (restart)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:603 +msgid "Add an email address to which to send books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:604 +msgid "&Add email" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605 +msgid "Make &default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 +msgid "&Remove email" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 +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:608 +msgid "&Maximum number of waiting worker processes (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 +msgid "&Check database integrity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 +msgid "&Install command line tools" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 +msgid "Open calibre &configuration directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 +msgid "Limit the max. simultaneous jobs to the available CPU &cores" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 +msgid "Debug &device detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 +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:615 +msgid "Server &port:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 #: /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:603 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 #: /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:604 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 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:605 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 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:606 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 msgid "Max. &cover size:" 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:621 #: /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:608 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 msgid "Max. &OPDS items per query:" 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:623 msgid "Max. OPDS &ungrouped items:" 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:624 msgid "&Start Server" 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:625 msgid "St&op Server" 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:626 msgid "&Test Server" 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:627 msgid "Run server &automatically on startup" 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:628 msgid "View &server logs" 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:629 #: /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:617 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 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:618 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 msgid "Enable/&Disable plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 msgid "&Customize plugin" msgstr "" -#: /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:634 msgid "&Remove plugin" msgstr "" -#: /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:635 msgid "Add new plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636 msgid "Plugin &file:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:638 msgid "&Add" msgstr "" @@ -4922,10 +5127,11 @@ 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:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:853 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:535 +#: /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:542 msgid "Date" msgstr "" @@ -4960,67 +5166,72 @@ 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:30 +#: /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:32 +#: /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:34 +#: /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:37 +#: /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:61 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:64 msgid "No column selected" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:65 msgid "No column has been selected" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:69 msgid "Selected column is not a user-defined column" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:100 msgid "No lookup name was provided" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:102 msgid "The label must contain only letters, digits and underscores, and start with a letter" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:111 msgid "No column heading was provided" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:117 msgid "The lookup name %s is already used" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:127 msgid "The heading %s is already used" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:129 msgid "The lookup name must be lower case and cannot contain \":\"s or spaces" msgstr "" @@ -5135,39 +5346,69 @@ msgstr "" msgid "ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 +#: +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:67 +msgid "All checked books will be permanently deleted from your device. Please verify the list." +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 +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:1064 +msgid "Format" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device_ui.py:50 +msgid "Delete from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:29 +msgid "Author sort" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:47 +msgid "Manage authors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 msgid "Author Sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:162 msgid "Finding metadata..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:176 msgid "Could not find metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:177 msgid "The metadata download seems to have stalled. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:186 msgid "Warning" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:187 msgid "Could not fetch metadata from:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:191 msgid "No metadata found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:192 msgid "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -5240,19 +5481,19 @@ 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:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 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:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 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:376 -#: /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:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Rating of this book. 0-5 stars" msgstr "" @@ -5261,7 +5502,7 @@ 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:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid " stars" msgstr "" @@ -5271,8 +5512,8 @@ 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:382 -#: /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:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 msgid "Open Tag Editor" msgstr "" @@ -5300,10 +5541,6 @@ 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:183 -msgid "Automatically number books in this series" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 msgid "" "Remove stored conversion settings for the selected books.\n" @@ -5316,206 +5553,206 @@ 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:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 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:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "&Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:123 msgid "Not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136 msgid "Choose formats for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 msgid "No permission" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:166 msgid "You do not have permission to read the following files:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:194 msgid "No format selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:205 msgid "Could not read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:206 msgid "Could not read metadata from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:256 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 msgid "Could not read cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:255 msgid "Could not read cover from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:261 msgid "The cover in the %s format is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:298 msgid "Abort the editing of all remaining books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:445 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:450 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:439 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:453 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:442 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:521 msgid "Cannot use tag editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:522 msgid "The tags editor cannot be used if you have modified the tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:542 msgid "Downloading cover..." msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:559 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:565 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:576 msgid "Cannot fetch cover" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:555 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:566 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:577 msgid "Could not fetch cover.
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:567 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:556 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:560 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:572 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:584 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:573 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:617 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:606 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:618 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:607 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:647 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:648 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:719 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:708 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:720 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:709 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:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 msgid "Edit Meta Information" msgstr "" -#: /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:362 msgid "Meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 msgid "Swap the author and title" msgstr "" -#: /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:368 msgid "Author S&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 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:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "Remove unused series (Series that have no books)" 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:386 msgid "IS&BN:" 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:387 msgid "Publishe&d:" 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:390 msgid "dd MMM yyyy" 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:391 msgid "&Date:" msgstr "" -#: /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:392 msgid "&Comments" 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:393 msgid "&Fetch metadata from server" msgstr "" -#: /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:394 msgid "Available Formats" 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:395 msgid "Add a new format for this book to the database" 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:397 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /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:399 msgid "Set the cover for the book from the selected format" msgstr "" -#: /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:401 msgid "Update metadata from the metadata in the selected format" 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:406 msgid "Reset cover to default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Download &cover" msgstr "" @@ -5792,12 +6029,12 @@ msgid "Choose formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:72 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:76 msgid "Authors" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:101 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:107 msgid "Publishers" msgstr "" @@ -5858,7 +6095,7 @@ msgid "Select the content kind of the new category" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:68 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:101 msgid "Are your sure?" msgstr "" @@ -5902,61 +6139,57 @@ msgstr "" msgid "Add tag to available tags and apply it to current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:20 +msgid "%s (was %s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:501 msgid "Item is blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:502 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:66 -msgid "Item already used" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:67 -msgid "The item %s is already used." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:87 msgid "No item selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:88 msgid "You must select one item from the list of Available items." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:97 msgid "No items selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:98 msgid "You must select at least one items from the list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:102 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:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:72 msgid "Category Editor" 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:73 msgid "Items in use" 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:74 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:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:76 msgid "Rename the item in every book where it is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 msgid "Ctrl+S" msgstr "" @@ -6177,11 +6410,11 @@ msgstr "" #: /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:80 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:84 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:100 msgid "No match" msgstr "" @@ -6217,136 +6450,162 @@ msgstr "" msgid "Regular expression (?P)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:36 msgid "Save single format to disk..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:53 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:56 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:59 msgid "Download metadata and covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:62 msgid "Download only metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:64 msgid "Download only covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:67 msgid "Download only social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:73 msgid "Merge into first selected book - delete others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:76 msgid "Merge into first selected book - keep others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:84 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:86 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/init.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:90 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/init.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:93 msgid "Add Empty book. (Book entry with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:394 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:397 msgid "Save only %s format to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:121 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:127 msgid "Remove selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:129 msgid "Remove files of a specific format from selected books.." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:132 msgid "Remove all formats from selected books, except..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:135 msgid "Remove covers from selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:138 +msgid "Remove matching books from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:155 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:157 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:161 msgid "Create catalog of books in your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:169 msgid "Run welcome wizard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:205 msgid "Similar books..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:237 +msgid "Add books to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:253 +msgid "Manage collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:333 msgid "Cover Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:351 msgid "Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:339 -msgid "Side bar" +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:372 +msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:368 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:373 +msgid "created by Kovid Goyal" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:391 +msgid "Connected " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:400 +msgid "Update found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:454 msgid "Book Details" msgstr "" @@ -6417,46 +6676,42 @@ msgstr "" msgid "Y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 msgid "On Device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 msgid "Rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1042 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:659 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1100 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:350 +#: /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:399 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:850 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:886 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:890 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1022 -msgid "Format" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1082 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1162 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1165 msgid "Double click to edit me

" msgstr "" @@ -6500,11 +6755,11 @@ msgstr "" msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:525 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:526 msgid "Dropping onto a device is not supported. First add the book to the calibre library." msgstr "" @@ -6603,243 +6858,251 @@ msgstr "" msgid "Calibre Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:86 msgid "Choose a location for your calibre e-book library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "Failed to create library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 msgid "Failed to create calibre library at: %r." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:182 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Initializing user interface..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 msgid "Repairing failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:179 msgid "The database repair failed. Starting with a new empty library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:191 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:224 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:194 msgid "Bad database location %r. calibre will now quit." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:207 msgid "Corrupted database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:208 msgid "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." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:212 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:227 msgid "Bad database location %r. Will start with a new, empty calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:238 msgid "Starting %s: Loading books..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:283 msgid "If you are sure it is not running" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:285 msgid "Cannot Start " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:286 msgid "%s is already running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:289 msgid "may be running in the system tray, in the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:291 msgid "upper right region of the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:293 msgid "lower right region of the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:296 msgid "try rebooting your computer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:296 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:308 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:247 msgid "calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:249 msgid "&Restrict to:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:250 msgid "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:251 msgid "set in ui.py" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:252 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:254 msgid "Alt+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 msgid "&Search:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 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/main_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 -msgid "Choose saved search or enter name for new saved search" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "Copy current search text (instead of search name)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 msgid "Save current search under the name shown in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 msgid "Delete current saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 msgid "Remove books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 msgid "Del" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Edit meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 msgid "E" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "Merge book records" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "M" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 msgid "Send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "Fetch news" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "F" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "Convert E-books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "C" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:283 msgid "V" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:284 msgid "Open containing folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:285 msgid "Show book details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:286 msgid "Books by same author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:287 msgid "Books in this series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:288 msgid "Books by this publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:289 msgid "Books with the same tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:291 msgid "Configure calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:299 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:292 msgid "Ctrl+P" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:293 +msgid "Help" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:294 +msgid "Browse the calibre User Manual" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:295 +msgid "F1" +msgstr "" + #: /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 "" @@ -6864,32 +7127,36 @@ msgstr "" msgid "No matches found for this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:262 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:315 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:357 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:398 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:406 +msgid "Choose saved search or enter name for new saved search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:47 msgid "({0} of {1})" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:53 msgid "(all books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:55 msgid "({0} of all)" msgstr "" @@ -6953,64 +7220,89 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:150 -msgid "Rename" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:191 +msgid "Rename '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:195 +msgid "Edit sort for '%s'" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:200 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:203 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:207 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:169 -msgid "Manage " +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:218 +msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:221 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:180 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:232 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:377 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:433 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:271 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:652 -msgid "Sort by &popularity" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:768 +msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:768 +msgid "Sort by popularity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:769 +msgid "Sort by average rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:772 +msgid "Set the sort order for entries in the Tag Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:778 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:778 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:783 +msgid "When selecting multiple entries in the Tag Browser match any or all of them" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:787 msgid "Manage &user categories" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:790 +msgid "Add your own categories to the Tag Browser" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:182 msgid "Convert book %d of %d (%s)" @@ -7034,23 +7326,23 @@ msgstr "" msgid "Queueing " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:239 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:299 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:301 msgid "Convert existing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:300 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:162 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:164 msgid "&Donate to support calibre" msgstr "" @@ -7062,88 +7354,76 @@ msgstr "" msgid "&Restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:207 -msgid "

For help see the: User Manual
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:213 -msgid "%s: %s by Kovid Goyal %%(version)s
%%(device)s

" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:227 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:381 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:377 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:382 msgid "Cannot configure before calibre is restarted." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:425 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:426 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:494 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:506 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:479 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:508 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:492 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:507 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:563 -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." +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:547 +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:588 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:573 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:576 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:595 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:580 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:647 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:633 msgid "will keep running in the system tray. To close it, choose Quit in the context menu of the system tray." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/update.py:52 -msgid "Latest version: %s" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/update.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:56 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/update.py:61 +#: /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 "" @@ -7603,91 +7883,91 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 msgid "Copy Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 msgid "Paste Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:270 msgid "" "Library\n" -"%d\n" -"books" +"%d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:271 msgid "" "Reader\n" -"%s\n" -"available" +"%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:272 msgid "" "Card A\n" -"%s\n" -"available" +"%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:273 msgid "" "Card B\n" -"%s\n" -"available" +"%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:277 msgid "Click to see the books available on your computer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 msgid "Click to see the books in the main memory of your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:281 msgid "Click to see the books on storage card A in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:282 msgid "Click to see the books on storage card B in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:290 msgid "Books located at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:306 +msgid "free" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:557 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:558 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:559 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:509 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:560 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:561 msgid "Title Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:932 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:983 msgid "Drag to resize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:963 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1015 msgid "Show" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:968 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1022 msgid "Hide" msgstr "" @@ -7910,48 +8190,48 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:275 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:230 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:278 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:233 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:281 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:236 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:284 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:285 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:239 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:240 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:435 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 msgid "no" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:435 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 msgid "unchecked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:438 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 msgid "checked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:438 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 msgid "empty" msgstr "" @@ -8293,7 +8573,7 @@ msgstr "" msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:688 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:710 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -8305,15 +8585,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:699 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:721 msgid "If the column stores multiple values, append the specified values to the existing ones, instead of replacing them." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:710 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:732 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:729 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:751 msgid "" "\n" " %prog custom_columns [options]\n" @@ -8322,19 +8602,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:758 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:748 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:770 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:750 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:772 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:756 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:778 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -8344,15 +8624,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:764 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:796 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:809 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -8364,43 +8644,47 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:487 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:70 +msgid "%sAverage rating is %3.1f" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:545 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:489 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:547 msgid "Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:491 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:549 msgid "Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1665 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1770 msgid "

Migrating old database to ebook library in %s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1694 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1799 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1711 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1804 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1909 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1845 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1950 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1867 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972 msgid "Checked id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:111 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 msgid "Ratings" msgstr "" @@ -8555,43 +8839,43 @@ msgstr "" msgid "Write process PID to the specified file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:108 msgid "%d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:124 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:127 msgid "%d items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:141 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144 msgid "RATING: %s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:147 msgid "TAGS: %s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:148 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:151 msgid "SERIES: %s [%s]
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:189 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:192 msgid "Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:228 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:231 msgid "Books in your library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:234 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:237 msgid "By " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:235 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:238 msgid "Books sorted by " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:535 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Newest" msgstr "" @@ -8664,6 +8948,10 @@ msgstr "" msgid "User-created tag browser categories" msgstr "" +#: /home/kovid/work/calibre/src/calibre/utils/config.py:702 +msgid "Preserve all collections even if not in library metadata." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43 msgid "Waiting..." msgstr "" @@ -8733,34 +9021,38 @@ msgid "English (Pakistan)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:106 -msgid "English (Singapore)" +msgid "English (Israel)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:107 -msgid "English (Yemen)" +msgid "English (Singapore)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:108 -msgid "English (Ireland)" +msgid "English (Yemen)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:109 -msgid "English (China)" +msgid "English (Ireland)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:110 -msgid "Spanish (Paraguay)" +msgid "English (China)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 -msgid "German (AT)" +msgid "Spanish (Paraguay)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:112 -msgid "Dutch (NL)" +msgid "German (AT)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:113 +msgid "Dutch (NL)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:114 msgid "Dutch (BE)" msgstr "" @@ -8818,91 +9110,91 @@ msgstr "" msgid "Unknown News Source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:606 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:608 msgid "The \"%s\" recipe needs a username and password." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:703 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:708 msgid "Download finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:705 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:710 msgid "Failed to download the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:711 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:716 msgid "Failed to download parts of the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:713 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 msgid " from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:715 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:720 msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:827 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:809 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:848 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:830 msgid "Fetching feeds..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:853 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:835 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:859 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:841 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:861 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:843 msgid "Generating masthead..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:942 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:924 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:958 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:940 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:968 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:950 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:980 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:962 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1020 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1002 msgid "Masthead image downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1216 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1192 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1287 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1263 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1298 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1274 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1315 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1291 msgid "Fetching feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1462 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1438 msgid "Failed to log in, check your username and password for the calibre Periodicals service." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1478 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1454 msgid "You do not have permission to download this issue. Either your subscription has expired or you have exceeded the maximum allowed downloads for today." msgstr "" @@ -8912,12 +9204,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:73 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:82 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:181 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:183 msgid "Scheduled" msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:182 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:184 msgid "Custom" msgstr "" diff --git a/src/calibre/translations/cs.po b/src/calibre/translations/cs.po index 46a575ebe3..5a1983fad7 100644 --- a/src/calibre/translations/cs.po +++ b/src/calibre/translations/cs.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-06-06 21:03+0000\n" -"PO-Revision-Date: 2010-06-07 22:52+0000\n" -"Last-Translator: JanS \n" +"POT-Creation-Date: 2010-07-03 01:21+0000\n" +"PO-Revision-Date: 2010-07-02 18:25+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-06-09 03:34+0000\n" +"X-Launchpad-Export-Date: 2010-07-03 03:43+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -23,39 +23,40 @@ msgstr "Nedělá vůbec nic" #: /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:54 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:75 #: /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:418 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:347 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:466 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:396 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:101 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:428 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:329 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:332 +#: /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/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:230 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:270 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:273 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:373 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:235 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:276 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:279 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:390 #: /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 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:46 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:317 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:62 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:118 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:120 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:943 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1055 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:945 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1057 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:28 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -71,9 +72,9 @@ msgstr "Nedělá vůbec nic" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:818 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:908 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:979 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:910 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:915 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:137 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:139 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:108 @@ -101,47 +102,49 @@ msgstr "Nedělá vůbec nic" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:233 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:235 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:280 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:107 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:657 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:666 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:946 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:815 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:818 +#: /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:22 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:903 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1192 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1195 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:481 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:339 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:826 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:989 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1806 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1809 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:185 #: /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:302 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:314 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:876 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:913 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1392 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1394 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1516 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:335 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:347 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:950 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1019 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1620 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1622 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1744 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:268 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:131 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:134 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:68 -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:114 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:115 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:64 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:78 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:47 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:50 msgid "Unknown" @@ -177,7 +180,7 @@ msgstr "" "všechny soubory na které odkazy směrují. Tento modul je spušten pokaždé, " "když je do knihovny přidán HTML soubor." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:50 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -185,7 +188,7 @@ msgstr "" "Kódování vstupních HTML souborů. Bežně používané kódování jsou např. cp1252, " "latin1 iso-8859-1 nebo UTF-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:57 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 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 " @@ -195,49 +198,49 @@ msgstr "" "pmlname_img nebo images. Tento plugin je spuštěn pokaždé když přidáte PML " "soubor do knihovny." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:89 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:90 msgid "Extract cover from comic files" msgstr "Vyjmout obálky ze souborů s komixy" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:116 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:127 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:139 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:149 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:170 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:180 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:190 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:200 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:210 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:220 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:231 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:242 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:254 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:275 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:286 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:296 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:306 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:117 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:128 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:140 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:150 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:160 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:171 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:181 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:191 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:201 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:211 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:221 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:232 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:243 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:255 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:276 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:287 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:297 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:307 msgid "Read metadata from %s files" msgstr "Načíst metadata ze souborů %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:265 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:266 msgid "Read metadata from ebooks in RAR archives" msgstr "Načíst metadata z elektronických knih v RAR archívech" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:317 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:318 msgid "Read metadata from ebooks in ZIP archives" msgstr "Načíst metadata z elektronických knih v ZIP archívech" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:328 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:338 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:348 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:370 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:381 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:391 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:331 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:341 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:351 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:373 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:384 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:394 msgid "Set metadata in %s files" msgstr "Nastavuje metadata do souborů %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:359 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:362 msgid "Set metadata from %s files" msgstr "Nastavuje metadata ze souborů %s" @@ -282,7 +285,7 @@ msgstr "" "nevíte nic o vstupním dokumentu" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:57 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:266 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:412 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "Tento profil je určen pro řadu SONY PSR. modely 500/505/600/700 atd." @@ -292,70 +295,70 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Tento profil je určen pro SONY PSR 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:78 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:300 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:447 msgid "This profile is intended for the SONY PRS-900." msgstr "Tento profil je určen pro SONY PSR 900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:330 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:477 msgid "This profile is intended for the Microsoft Reader." msgstr "Tento profil je určený pro Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:97 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:341 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:488 msgid "This profile is intended for the Mobipocket books." msgstr "Tento profil je určený pro knihy Mobipocket." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:110 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:354 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:501 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Tento profil je určený pro Hanlin V3 a jeho klony." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:122 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Tento profil je určen pro Hanlin V5 a jeho klony." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:132 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:374 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:521 msgid "This profile is intended for the Cybook G3." msgstr "Tento profil je určený pro Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:145 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:387 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:534 msgid "This profile is intended for the Cybook Opus." msgstr "Tento profil je určen pro Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:157 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:398 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:545 msgid "This profile is intended for the Amazon Kindle." msgstr "Tento profil je určený pro Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:169 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:580 msgid "This profile is intended for the Irex Illiad." msgstr "Tento profil je určen pro Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:181 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:446 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:593 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Tento profil je určen pro Irex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:460 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:607 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Tento profil je určený pro IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:206 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:474 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:621 msgid "This profile is intended for the B&N Nook." msgstr "Tento profil je určen pro B&N Nook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:226 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:228 msgid "Output profile" msgstr "Výstupní profil" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:230 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:232 msgid "" "This profile tries to provide sane defaults and is useful if you want to " "produce a document intended to be read at a computer or on a range of " @@ -365,24 +368,24 @@ msgstr "" "chcete vytvořit dokument určený ke čtení na počítači nebo na vetším rozpětí " "zařízení." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:254 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:257 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:279 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:425 msgid "This profile is intended for the Kobo Reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:291 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:438 msgid "This profile is intended for the SONY PRS-300." msgstr "Tento profil je určen pro SONY PSR 300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:309 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:456 msgid "This profile is intended for the 5-inch JetBook." msgstr "Tento profil je určen pro 5\" Jetbook" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:318 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:465 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -390,7 +393,7 @@ msgstr "" "Tento profil je určený pro zařízení SONY PRS. 500/505/700 atd. pro čtení na " "šířku. Nejvíce užitečné pro čtení komiksu." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:416 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Tento profil je určený pro Amazon Kindle DX." @@ -410,15 +413,19 @@ msgstr "Úprava Lokálních modulů" msgid "Disabled plugins" msgstr "Deaktivované moduly" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:77 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 +msgid "Enabled plugins" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:83 msgid "No valid plugin found in " msgstr "Nebyl nalezen žádný platný modul v " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:278 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:460 msgid "Initialization of plugin %s failed with traceback:" msgstr "Inicializace modulu %s selhala s chybou:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:493 msgid "" " %prog options\n" "\n" @@ -430,30 +437,30 @@ msgstr "" " Přizpůsobte calibre nahráním externích modulů.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:439 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:499 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "Přidejte modul zadáním cesty k ZIP archivu v kterém se nachází." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:441 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "Odebrat modul podle jména. Vestavěné moduly není možné odebrat." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:443 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:503 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." msgstr "" "Upravit modul. Zadejte název modulu a retězec s úpravami oddělené čárkou." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:445 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:505 msgid "List all installed plugins" msgstr "Vypsat všechny nainstalované moduly" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:447 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:507 msgid "Enable the named plugin" msgstr "Aktivovat modul podle jména" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:449 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:509 msgid "Disable the named plugin" msgstr "Deaktivovat modul podle jména" @@ -461,7 +468,7 @@ msgstr "Deaktivovat modul podle jména" msgid "Communicate with Android phones." msgstr "Komunikace s telefony Android." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:39 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:45 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -469,59 +476,75 @@ msgstr "" "seznam adresářů oddělený čárkami k odeslání knih na zařízení. První který " "existuje pude použit." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:77 msgid "Communicate with S60 phones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:46 -msgid "Communicate with iBooks through iTunes." +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:87 +msgid "Communicate with iTunes/iBooks." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:93 msgid "Apple device detected, launching iTunes, please wait ..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:154 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:172 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:175 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:246 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:249 msgid "Updating device metadata listing..." -msgstr "" +msgstr "Záznamy metadat v zařízení se aktualizují..." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:240 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:271 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:861 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1023 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:323 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:921 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:957 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2791 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2830 msgid "%d of %d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:277 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1028 +#: /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:2836 msgid "finished" +msgstr "hotovo" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:544 +msgid "Use Series as Category in iTunes/iBooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:452 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:546 +msgid "Cache covers from iTunes/iBooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:558 msgid "" "Some books not found in iTunes database.\n" "Delete using the iBooks app.\n" "Click 'Show Details' for a list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:647 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:28 -msgid "settings for device drivers" -msgstr "nastavení ovladačů zařízení" - -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:649 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:30 -msgid "Ordered list of formats the device will accept" -msgstr "Setříděný seznam formátů, které toto zařízení přijme." - -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:762 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:886 msgid "" "Some cover art could not be converted.\n" "Click 'Show Details' for a list." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2471 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:807 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:813 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:239 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:167 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:180 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1504 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:128 +msgid "News" +msgstr "Zprávy" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2698 +msgid "Communicate with iTunes." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/binatone/driver.py:17 msgid "Communicate with the Binatone Readme eBook reader." msgstr "Komunikuje se čtečkou Binatone Readme." @@ -544,6 +567,14 @@ msgstr "Komunikuje se čtečkou Cybook Gen 3 / Opus." msgid "Communicate with the EB600 eBook reader." msgstr "Komunikace s zařízením EB600." +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:193 +msgid "Communicate with the Astak Mentor EB600" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:216 +msgid "Communicate with the PocketBook 301 reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" msgstr "Entourage Edge" @@ -556,6 +587,10 @@ msgstr "Spojit s Entourage Edge." msgid "Communicate with the ESlick eBook reader." msgstr "Komunikace s zařízením ESlick eBook." +#: /home/kovid/work/calibre/src/calibre/devices/eslick/driver.py:49 +msgid "Communicate with the Sigmatek eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:16 #: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:30 msgid "Use an arbitrary folder as a device." @@ -570,14 +605,20 @@ msgstr "Rozhraní zařízení" msgid "Communicate with Hanlin V3 eBook readers." msgstr "Komunikuje se čtečkou Hanlin V3." -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:90 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:87 msgid "Communicate with Hanlin V5 eBook readers." msgstr "Komunikuje se čtečkou Hanlin V5." -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:109 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:106 msgid "Communicate with the BOOX eBook reader." msgstr "Komunikace se čtečkou BOOX eBook." +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:121 +msgid "" +"Comma separated list of directories to send e-books to on the device. The " +"first one that exists will be used." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "Komunikuje se čtečkou Hanvon N520." @@ -604,7 +645,7 @@ msgstr "Komunikace s zařízením Irex Illiad." #: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17 #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:29 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:38 msgid "John Schember" msgstr "John Schember" @@ -624,22 +665,56 @@ msgstr "Komunikuje se čtečkou Iriver Story." msgid "Communicate with the JetBook eBook reader." msgstr "Komunikace s zařízením JetBook." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:21 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:42 msgid "Communicate with the Kindle eBook reader." msgstr "Komunikace s zařízením Amazon Kindle." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:169 msgid "Communicate with the Kindle 2 eBook reader." msgstr "Komunikace s zařízením Amazon Kindle 2." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:157 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:210 msgid "Communicate with the Kindle DX eBook reader." msgstr "Komunikuje se čtečkou Kindle DX." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:14 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:22 msgid "Communicate with the Kobo Reader" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:51 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:54 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:157 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:64 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:67 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:130 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:137 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:160 +msgid "Getting list of books on device..." +msgstr "Získávám seynam knih na zařízení..." + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:218 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:258 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:244 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:262 +msgid "Removing books from device..." +msgstr "Odstraňuji knihy ze zařízení..." + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:262 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:274 +msgid "Removing books from device metadata listing..." +msgstr "Odebírám knihy ze seznamu metadat v zařízení..." + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:308 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:208 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:238 +msgid "Adding books to device metadata listing..." +msgstr "Přidávám knihy do seznamu metadat v zařízení..." + #: /home/kovid/work/calibre/src/calibre/devices/misc.py:15 msgid "Communicate with the Palm Pre" msgstr "" @@ -648,6 +723,10 @@ msgstr "" msgid "Communicate with the Booq Avant" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:55 +msgid "Communicate with the Sweex MM300" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "Komunikuje s tabletem Nokia 770." @@ -656,6 +735,10 @@ msgstr "Komunikuje s tabletem Nokia 770." msgid "Communicate with the Nokia 810 internet tablet." msgstr "Komunikuje s tabletem Nokia 810." +#: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:74 +msgid "Communicate with the Nokia E52" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:20 msgid "The Nook" msgstr "Nook" @@ -676,7 +759,7 @@ msgstr "Komunikace s zařízením Sony PRS-500." msgid "Communicate with all the Sony eBook readers." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:60 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:61 msgid "" "Comma separated list of metadata fields to turn into collections on the " "device. Possibilities include: " @@ -705,23 +788,23 @@ msgstr "" msgid "Communicate with the iPapyrus reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:247 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:245 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "Nepodařilo se najít disk %s. Zkuste reboot." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:427 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:425 msgid "Unable to detect the %s mount point. Try rebooting." msgstr "nemohu nalézt %s přípojný bod. Zkuste rebootovat." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:492 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:490 msgid "Unable to detect the %s disk drive." msgstr "Nemohu detekovat disk %s." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:585 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:583 msgid "Could not find mount helper: %s." msgstr "Nemohu nalézt mount helper: %s." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:597 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:595 msgid "" "Unable to detect the %s disk drive. Your kernel is probably exporting a " "deprecated version of SYSFS." @@ -729,99 +812,76 @@ msgstr "" "Nemohu detekovat disk %s. Váš Kernel pravděpodobně exportuje zastaralou " "verzi SYSFS." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:605 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:603 msgid "Unable to mount main memory (Error code: %d)" msgstr "Nemohu připojit hlavní paměť (Kód chyby: %d)" +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:740 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:742 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 msgid "The reader has no storage card in this slot." msgstr "Čtečka nemá v tomto slotu žádnou pamětovou kartu." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:746 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 msgid "Selected slot: %s is not supported." msgstr "Vybraný slot: %s není podporováno." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:779 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:773 msgid "There is insufficient free space in main memory" msgstr "V hlavní paměti není dostatek volného místa" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:781 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:783 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:775 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:777 msgid "There is insufficient free space on the storage card" msgstr "Na paměťové kartě není dostatek volného místa" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:813 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:819 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:847 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:239 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:141 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:152 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1276 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:120 -msgid "News" -msgstr "Zprávy" - #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:12 msgid "Configure Device" msgstr "Konfigurovat zařízení" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:32 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:37 +msgid "settings for device drivers" +msgstr "nastavení ovladačů zařízení" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:39 +msgid "Ordered list of formats the device will accept" +msgstr "Setříděný seznam formátů, které toto zařízení přijme." + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:41 msgid "Place files in sub directories if the device supports them" msgstr "Uložit soubory do podadresářů pokud je zařízení podporuje." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:34 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81 msgid "Read metadata from files on device" msgstr "Číst metadata ze souborů zařízení" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:36 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:45 +msgid "Use author sort instead of author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:47 msgid "Template to control how books are saved" msgstr "Šablona určující jak se májí knihy ukládat" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 msgid "Extra customization" msgstr "Další přizpůsobení" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:28 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:37 msgid "Communicate with an eBook reader." msgstr "Komunikace s čtecím zařízením." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:44 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:53 msgid "Get device information..." msgstr "Zjistit informace o zařízení..." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:53 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:56 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:59 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:119 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:126 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:149 -msgid "Getting list of books on device..." -msgstr "Získávám seynam knih na zařízení..." - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:174 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:176 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:188 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 msgid "Transferring books to device..." msgstr "Přenos knih do zařízení..." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:191 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:220 -msgid "Adding books to device metadata listing..." -msgstr "Přidávám knihy do seznamu metadat v zařízení..." - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:224 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:242 -msgid "Removing books from device..." -msgstr "Odstraňuji knihy ze zařízení..." - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:246 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251 -msgid "Removing books from device metadata listing..." -msgstr "Odebírám knihy ze seznamu metadat v zařízení..." - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:305 msgid "Sending metadata to device..." msgstr "Odesílám metadata do zařízení..." @@ -1365,6 +1425,9 @@ msgid "" "paragraph indent, to ensure that paragraphs can be easily distinguished. " "This option controls the width of that indent." msgstr "" +"Odstraní-li calibre mezery mezi odstavci, dojde k automatickému nastavení " +"odsazení, aby bylo možné odstavce snadno rozeznat. Tato volba upravuje šířku " +"odsazení." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:330 msgid "" @@ -1531,15 +1594,15 @@ msgstr "Hodnota pořadí v sérii musí být číslo, Ignoruji" msgid "Failed to parse date/time" msgstr "Nepodařilo se analyzovat datum/čas" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:802 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:809 msgid "Converting input to HTML..." msgstr "Převést vstup do HTML..." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:829 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:836 msgid "Running transforms on ebook..." msgstr "Probíhá převod elektronické knihy..." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:916 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:923 msgid "Creating" msgstr "Vytvářím" @@ -1582,7 +1645,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:86 msgid "" "Do not use SVG for the book cover. Use this option if your EPUB is going to " -"be used ona device that does not support SVG, like the iPhone or the " +"be used on a device that does not support SVG, like the iPhone or the " "JetBook Lite. Without this option, such devices will display the cover as a " "blank page." msgstr "" @@ -1618,20 +1681,20 @@ msgstr "" msgid "Add Table of Contents to beginning of the book." msgstr "Přidat obsah na začátek knihy." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:243 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:248 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:250 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:255 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:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:264 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 " @@ -1639,7 +1702,7 @@ msgid "" "pipeline." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:267 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:272 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." @@ -1781,7 +1844,7 @@ msgid "Path to output file" msgstr "Cesta k výstupnímu souboru" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:114 msgid "Verbose processing" msgstr "Zvýšit množství vypisovaných informací" @@ -1878,84 +1941,86 @@ msgstr "Font pro neproporcionání písmo" msgid "Comic" msgstr "Komiks" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:372 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:389 #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:46 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:336 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:831 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 +#: /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:882 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:543 msgid "Title" msgstr "Název" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:373 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:341 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:832 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:390 +#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:883 msgid "Author(s)" msgstr "Autor(ři)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:374 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:53 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 +#: /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 "Vydavatel" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:375 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:392 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "Producent" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:376 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393 +#: /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:185 #: /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/library/models.py:297 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1008 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:107 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1073 msgid "Comments" msgstr "Komentáře" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:384 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:54 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:286 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1004 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:106 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1069 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:139 msgid "Tags" msgstr "Tagy" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:386 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:302 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1013 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:105 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:87 msgid "Series" msgstr "Série" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:404 msgid "Language" msgstr "Jazyk:" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:389 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:996 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 msgid "Timestamp" msgstr "Časová značka" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:51 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:408 +#: /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 "Publikováno" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:410 msgid "Rights" msgstr "Práva" @@ -1963,7 +2028,7 @@ msgstr "Práva" msgid "EDITORIAL REVIEW" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:22 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:41 msgid "" "Extract common e-book formats from archives (zip/rar) files. Also try to " "autodetect if they are actually cbz/cbr files." @@ -2064,35 +2129,43 @@ msgstr "Obálka uložena do" msgid "No cover found" msgstr "Obálka nenalezena" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:33 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:15 +msgid "Cover download" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:42 +msgid "Downloads metadata from Douban.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:34 msgid "Metadata download" msgstr "Stáhnutí metadat" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 msgid "ratings" msgstr "hodnocení" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 msgid "tags" msgstr "tagy" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:112 msgid "description/reviews" msgstr "popis/recenze" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:113 msgid "Download %s from %s" msgstr "Stáhnout %s z %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:136 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:139 msgid "Downloads metadata from Google Books" msgstr "Stáhnout metadata z Google Books" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:152 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:156 msgid "Downloads metadata from isbndb.com" msgstr "Stáhnout metadata z isbndb.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:180 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:184 msgid "" "To use isbndb.com you must sign up for a %sfree account%s and enter your " "access key below." @@ -2100,11 +2173,15 @@ msgstr "" "K použití isbndb.com se musíte zaregistrovat %súčet zdarma%s a vložit váš " "přístupový kód níže." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:188 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:194 msgid "Downloads social metadata from amazon.com" msgstr "Stáhnout sociální metadata z amazon.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:213 +msgid "Downloads series/tags/rating information from librarything.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:95 msgid "" "\n" "%prog [options] key\n" @@ -2118,27 +2195,27 @@ msgid "" "\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:105 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:106 msgid "The ISBN ID of the book you want metadata for." msgstr "ISBN kód knihy, pro kterou si přejete získat metadata." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 msgid "The author whose book to search for." msgstr "Auto hledané knihy." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 msgid "The title of the book to search for." msgstr "Název hledané knihy." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 msgid "The publisher of the book to search for." msgstr "Vydavatel hledané knihy" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:53 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:68 msgid "LibraryThing.com timed out. Try again later." msgstr "LibraryThing.com neodpovídá. Skuste to později." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:60 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:75 msgid "" "Could not fetch cover as server is experiencing high load. Please try again " "later." @@ -2146,28 +2223,25 @@ msgstr "" "Nepodařilo se stáhnout obálku, protože je server přetížený. Prosím zkuste to " "později." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:61 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:76 msgid " not found." msgstr " se nepodařilo nalézt." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:64 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:79 msgid "LibraryThing.com server error. Try again later." msgstr "Chyba serveru LibraryThing.com. Skuste to později." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:71 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:86 msgid "" "\n" "%prog [options] ISBN\n" "\n" -"Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" +"Fetch a cover image/social metadata for the book identified by ISBN from " +"LibraryThing.com\n" msgstr "" -"\n" -"%prog [možnosti] ISBN\n" -"\n" -"Stáhnout obálku knihy identifikované uvedeným kódém ISBN z LibraryThing.com\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1220 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1371 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1226 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1398 msgid "Cover" msgstr "Obálka" @@ -2206,70 +2280,70 @@ msgstr "Všechny články" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1372 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 msgid "Title Page" msgstr "Titulní stránka" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1373 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 #: /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 msgid "Table of Contents" msgstr "Obsah" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1374 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Index" msgstr "Rejstřík" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1375 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Glossary" msgstr "Slovník pojmů" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1376 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 msgid "Acknowledgements" msgstr "Pděkování" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1377 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Bibliography" msgstr "Bibliografie" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1378 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Colophon" msgstr "Tiráž" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1379 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Copyright" msgstr "Autorská práva" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1380 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Dedication" msgstr "Věnování" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1381 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Epigraph" msgstr "Doslov" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1382 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Foreword" msgstr "Předmluva" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1383 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "List of Illustrations" msgstr "Seznam Ilustrací" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1384 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "List of Tables" msgstr "Seznam tabulek" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1385 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Notes" msgstr "Poznámky" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1386 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Preface" msgstr "Úvod" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1387 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "Main Text" msgstr "Hlavní text" @@ -2453,6 +2527,8 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:29 msgid "Author" msgstr "" @@ -2660,8 +2736,8 @@ msgid "Use Roman numerals for series number" msgstr "číslování knih v sérii římskými číslicemi" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47 -msgid "Sort tags list by popularity" -msgstr "Třídit seznam tagů pode popularity" +msgid "Sort tags list by name, popularity, or rating" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:49 msgid "Number of covers to show in the cover browsing mode" @@ -2738,87 +2814,481 @@ msgstr "" msgid "tag browser categories not to display" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:103 +msgid "The layout of the user interface" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:105 +msgid "Show the average rating per item indication in the tag browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:107 +msgid "Disable UI animations" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:476 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:189 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:189 msgid "Copy to Clipboard" msgstr "&Kopírovat do schránky" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:399 msgid "Choose Files" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:245 +msgid "Use library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:246 +msgid "User annotations generated from main library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:671 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:708 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:729 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1060 +msgid "No books selected" +msgstr "Nejsou označeny žádné knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:76 +msgid "No books selected to fetch annotations from" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:101 +msgid "Merging user annotations into database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:129 +msgid "%s
Last Page Read: %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:135 +msgid "%s
Last Page Read: Location %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:154 +msgid "Location %d • %s
%s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:163 +msgid "Page %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:168 +msgid "Location %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:291 +msgid "How many empty books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:292 +msgid "How many empty books should be added?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:391 +msgid "Uploading books to device." +msgstr "Odesílám knihy do zařízení" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137 +msgid "Books" +msgstr "Knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:352 +msgid "EPUB Books" +msgstr "EPUB knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:353 +msgid "LRF Books" +msgstr "LRF knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:354 +msgid "HTML Books" +msgstr "HTML knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:355 +msgid "LIT Books" +msgstr "LIT knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:356 +msgid "MOBI Books" +msgstr "MOBI knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:357 +msgid "Topaz books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:358 +msgid "Text books" +msgstr "TXT knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:359 +msgid "PDF Books" +msgstr "PDF knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:360 +msgid "Comics" +msgstr "Komiksy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:361 +msgid "Archives" +msgstr "Archívy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:365 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:400 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:401 +msgid "" +"Some duplicates were found and merged into the following existing books:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:410 +msgid "Failed to read metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:411 +msgid "Failed to read metadata from the following" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:430 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:435 +msgid "Add to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:430 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1229 +msgid "No book selected" +msgstr "Není označena žádná kniha" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:435 +msgid "No book files found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:457 +msgid "Cannot delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:470 +msgid "Choose formats to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:488 +msgid "Choose formats not to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:508 +msgid "Cannot delete books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:509 +msgid "No device is connected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:519 +msgid "Main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:453 +msgid "Storage Card A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 +msgid "Storage Card B" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:526 +msgid "No books to delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:527 +msgid "None of the selected books are on the device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:601 +msgid "Deleting books from device." +msgstr "Mažu knihy ze zařízení." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:565 +msgid "" +"The selected books will be permanently deleted and the files removed " +"from your computer. Are you sure?" +msgstr "" +"Označené knihy budou trvale smazány a soubory budou odstraněny z " +"vašeho počítače. Opravdu je chcete odstranit?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:586 +msgid "" +"The selected books will be permanently deleted from your device. Are " +"you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:611 +msgid "Cannot download metadata" +msgstr "Nemůžu stáhnout metadata." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:627 +msgid "social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:629 +msgid "covers" +msgstr "obálky" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:629 +msgid "metadata" +msgstr "metadata" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:631 +msgid "Downloading %s for %d book(s)" +msgstr "Stahuji %s pro %d knihu(y)" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:655 +msgid "Failed to download some metadata" +msgstr "Selhalo stahování některých metadat" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:656 +msgid "Failed to download metadata for the following:" +msgstr "Selhalo stahovaní metadat pro následující:" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:659 +msgid "Failed to download metadata:" +msgstr "Selhalo stahování metadat:" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:660 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:637 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:949 +#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 +msgid "Error" +msgstr "Chyba" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:707 +msgid "Cannot edit metadata" +msgstr "Nemůžu upravit metadata" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:728 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:731 +msgid "Cannot merge books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:732 +msgid "At least two books must be selected for merging" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:736 +msgid "" +"All book formats and metadata from the selected books will be added to the " +"first selected book.

The second and subsequently selected " +"books will not be deleted or changed.

Please confirm you want to " +"proceed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:747 +msgid "" +"All book formats and metadata from the selected books will be merged into " +"the first selected book.

After merger the second and " +"subsequently selected books will be deleted.

All book formats " +"of the first selected book will be kept and any duplicate formats in the " +"second and subsequently selected books will be permanently deleted " +"from your computer.

Are you sure you want to proceed?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:759 +msgid "" +"You are about to merge more than 5 books. Are you sure you want to " +"proceed?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:876 +msgid "Cannot save to disk" +msgstr "Chyba zápisu na disk" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:879 +msgid "Choose destination directory" +msgstr "Zvolte cílový adresář" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:912 +msgid "Error while saving" +msgstr "Chyba při ukládání" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:913 +msgid "There was an error while saving." +msgstr "Při ukládání nastala chyba." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:921 +msgid "Could not save some books" +msgstr "Nemohu uložit některé knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:922 +msgid "Click the show details button to see which ones." +msgstr "Klikněte na tlačítko zobrazit detaily pro zjištění které z nich." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:943 +msgid "No books selected to generate catalog for" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:960 +msgid "Generating %s catalog..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:965 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:264 +msgid "No books found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:966 +msgid "" +"No books to catalog\n" +"Check exclude tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:976 +msgid "Catalog generated." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:979 +msgid "Export Catalog Directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:980 +msgid "Select destination for %s.%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:996 +msgid "Fetching news from " +msgstr "Získávám zprávy z " + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1010 +msgid " fetched." +msgstr " získány." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1059 +msgid "Cannot convert" +msgstr "Nemůžu převást" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1088 +msgid "Starting conversion of %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1265 +msgid "Cannot view" +msgstr "Nemůžu zobrazit" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1210 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:76 +msgid "Choose the format to view" +msgstr "Vyberte formát který se má zobrazit" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1218 +msgid "Multiple Books Selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1219 +msgid "" +"You are attempting to open %d books. Opening too many books at once can be " +"slow and have a negative effect on the responsiveness of your computer. Once " +"started the process cannot be stopped until complete. Do you wish to " +"continue?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1228 +msgid "Cannot open folder" +msgstr "Nemohu otevřít adresář" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1266 +msgid "%s has no available formats." +msgstr "%s není dostupná v žádném dostupném formátu." + #: /home/kovid/work/calibre/src/calibre/gui2/add.py:54 msgid "Searching in" msgstr "Hledám v" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:232 msgid "Adding..." msgstr "Přidávám..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 msgid "Searching in all sub-directories..." msgstr "Prohledávám všechny podadresáře..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:258 msgid "Path error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:259 msgid "The specified directory could not be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:599 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 msgid "No books" msgstr "Žádné knihy" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1938 -msgid "No books found" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:330 msgid "Added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:343 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:344 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:353 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:356 msgid "Duplicates found!" msgstr "Byly nalezeny duplikáty!" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 msgid "" "Books with the same title as the following already exist in the database. " "Add them anyway?" msgstr "" "Knihy se stejným názvem jsou již v databázi. Mají být přesto přidány?" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:360 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:427 msgid "Saving..." msgstr "Ukládám..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:480 msgid "Saved" msgstr "Uložené" @@ -2904,25 +3374,25 @@ msgstr "" #: /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:52 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:553 +#: /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/config/config_ui.py:554 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:578 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 -#: /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: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:408 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:568 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:589 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /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:385 +#: /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:400 +#: /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 #: /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 @@ -2933,17 +3403,17 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /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:74 -#: /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: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/main_ui.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:401 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:407 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:410 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:412 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 #: /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 @@ -2965,6 +3435,59 @@ msgid "" "&Multiple books per folder, assumes every ebook file is a different book" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1059 +msgid "Path" +msgstr "Cesta" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:117 +#: /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:220 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:96 +msgid "Formats" +msgstr "Formáty" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1062 +msgid "Collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 +msgid "Click to open" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1068 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1072 +#: /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:458 +msgid "None" +msgstr "Žádné" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:310 +msgid "Click to open Book Details window" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:16 msgid "CSV/XML Options" msgstr "" @@ -3010,7 +3533,7 @@ msgstr "výstup" #: /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/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:167 #: /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 @@ -3020,11 +3543,11 @@ msgstr "výstup" #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:45 +#: /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:49 #: /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:74 +#: /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/search_item_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 @@ -3042,8 +3565,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:222 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1239 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1257 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1467 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1485 msgid "Catalog" msgstr "Katalog" @@ -3385,6 +3908,9 @@ msgid "" "paragraph indent, to ensure that paragraphs can be easily distinguished. " "This option controls the width of that indent." msgstr "" +"

Odstraní-li calibre mezery mezi odstavci, dojde k automatickému nastavení " +"odsazení, aby bylo možné odstavce snadno rozeznat. Tato volba upravuje šířku " +"odsazení." #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 msgid " em" @@ -3478,96 +4004,96 @@ msgid "" "possible." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:99 msgid "Choose cover for " msgstr "Vyberte obálku pro " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:106 msgid "Cannot read" msgstr "Nemůžu přečíst" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:107 msgid "You do not have permission to read the file: " msgstr "Nemáte přístupová práva na čtení souboru: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:115 msgid "Error reading file" msgstr "Chyba při čtení souboru" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "

There was an error reading from file:
" msgstr "

Chyba při čtení souboru:
" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:124 msgid " is not a valid picture" msgstr " není platný obrazový soubor" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "Book Cover" msgstr "Obálka knihy" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 -msgid "Use cover from &source file" -msgstr "Použít Obálku ze &zdrojového souboru" - #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "Change &cover image:" msgstr "Změnit &obálku:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:170 -#: /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:404 msgid "Browse for an image to use as the cover of this book." msgstr "Vybete obrázkový soubor . který se použije jako obálka této knihy." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +msgid "Use cover from &source file" +msgstr "Použít Obálku ze &zdrojového souboru" + +#: /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 msgid "&Title: " msgstr "&Název: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 msgid "Change the title of this book" msgstr "Změnit název táto knihy" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 #: /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:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 msgid "&Author(s): " msgstr "&Autor(ři) " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 msgid "Author So&rt:" msgstr "Autor ve tvaru \"&příjmení, jméno\"." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" msgstr "Autor(ři) této knihy. Vícero autorů by mělo být odděleno čárkami" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 #: /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:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 msgid "&Publisher: " msgstr "&Vydavatel: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Ta&gs: " msgstr "Ta&gy: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 #: /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:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -3575,23 +4101,23 @@ msgstr "" "Tagy řadí knihu do kategorií. Užitečné jsou zvláště při vyhledávání. " "

Můžou to být libovolné slova nebo fráze, oddělené čárkami." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 #: /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:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 msgid "&Series:" msgstr "&Série:" -#: /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/convert/metadata_ui.py:183 #: /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:385 -#: /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:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "List of known series. You can add new series." msgstr "Seznam známých sérií. Můžete přidat novou sérii." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "Book " msgstr "Kniha " @@ -3676,12 +4202,12 @@ msgid "PDB Input" msgstr "PDB vstup" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:32 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47 msgid "Treat each &line as a paragraph" msgstr "Považovat každý řádek za odstavec" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:33 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:48 msgid "Assume print formatting" msgstr "" @@ -3725,11 +4251,6 @@ msgstr "" msgid "RB Output" msgstr "RB Výstup" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2183 -msgid "Choose the format to view" -msgstr "Vyberte formát který se má zobrazit" - #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:82 msgid "Cannot build regex using the GUI builder without a book." msgstr "" @@ -3810,12 +4331,12 @@ msgid "Footer regular expression:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:77 msgid "Invalid regular expression" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:78 msgid "Invalid regular expression: %s" msgstr "" @@ -3835,7 +4356,7 @@ msgstr "&Značka kapitol:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:61 msgid "Remove first &image" -msgstr "" +msgstr "Odstranit první &obrázek" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:62 msgid "Insert &metadata as page at start of book" @@ -3847,11 +4368,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:64 msgid "Remove F&ooter" -msgstr "" +msgstr "Odstranit &patičku stránky" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:65 msgid "Remove H&eader" -msgstr "" +msgstr "Odstranit &záhlaví" #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:16 msgid "" @@ -3899,22 +4420,22 @@ msgstr "" msgid "TXT Input" msgstr "TXT vstup" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:49 msgid "Process using markdown" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:50 msgid "" "

Markdown is a simple markup language for text files, that allows for " "advanced formatting. To learn more visit markdown." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 msgid "Do not insert Table of Contents into output text when using markdown" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:52 msgid "Preserve &spaces" msgstr "" @@ -4023,11 +4544,20 @@ msgid "" "href=\"http://calibre-ebook.com/user_manual/xpath.html\">XPath Tutorial." msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:119 +msgid "Cover browser could not be loaded" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:171 +msgid "Browse by covers" +msgstr "Prohlížet obálky" + #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:205 @@ -4048,280 +4578,311 @@ msgstr "" msgid "No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:115 msgid "star(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:116 msgid "Unrated" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:352 -msgid "Remove all tags" +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:249 +msgid " index:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:432 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +msgid "Automatically number books in this series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:475 +msgid "Remove all tags" +msgstr "Odstranit všechny tagy" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:496 msgid "tags to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:501 msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:48 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:135 msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:154 msgid "Device no longer connected." msgstr "Zařízení už není připojené" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:270 msgid "Get device information" msgstr "Získat informace o zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:281 msgid "Get list of books on device" msgstr "Získat seznam knih v zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:291 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:300 msgid "Send metadata to device" msgstr "Odeslat metadata do zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:305 +msgid "Send collections to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:329 msgid "Upload %d books to device" msgstr "Odeslat %d knih do zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:344 msgid "Delete books from device" msgstr "Smazat knihy ze zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:361 msgid "Download books from device" msgstr "Převzít knihy ze zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:339 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:371 msgid "View book on device" msgstr "Zobrazit knihu v zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 msgid "Set default send to device action" msgstr "Nastavit výchozí nastavení pro odeslání do čtečky" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:386 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:388 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 msgid "Email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 +msgid " and delete from library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:433 msgid "Send to main memory" msgstr "Odeslat do hlavní paměti" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:435 msgid "Send to storage card A" msgstr "Odeslat na pamětovou kartu A" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 msgid "Send to storage card B" msgstr "Odeslat na pamětovou kartu B" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:410 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:451 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:412 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:421 -msgid "Storage Card A" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:414 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:423 -msgid "Storage Card B" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:438 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:470 msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:509 msgid "Connect to folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:482 -msgid "Disconnect from folder" +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:515 +msgid "Connect to iTunes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:520 +msgid "Eject device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:528 msgid "Fetch annotations (experimental)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:638 +msgid "Error communicating with device" +msgstr "Cyba komunikace se zařízením" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:659 +msgid "Select folder to open as device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:704 +msgid "Failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:710 +msgid "Error talking to device" +msgstr "Chyba komunikace se zařízením" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:711 +msgid "" +"There was a temporary error talking to the device. Please unplug and " +"reconnect the device and or reboot." +msgstr "" +"Dočasná chyba komunikace se zařízením. Prosím odpojte a znovu připojte " +"zařízení anebo restarujte počítač." + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:753 +msgid "Device: " +msgstr "Zařízení: " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:755 +msgid " detected." +msgstr " nalezeno." + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:778 +msgid "Connected " +msgstr "Připojeno " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:846 msgid "selected to send" msgstr "vybrané k odeslání" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 msgid "Choose format to send to device" msgstr "Vyberte formát k odeslání do zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 msgid "No device" msgstr "Žádné zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:614 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "Cannot send: No device is connected" msgstr "Nemohu odeslat: Není připojeno žádné zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:617 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:621 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:864 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:868 msgid "No card" msgstr "Žádná karta" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:622 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "Cannot send: Device has no storage card" msgstr "Nemohu odeslat: Zařízení nemá pamětovou kartu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:664 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:910 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:667 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:913 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:668 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:914 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:181 msgid "by" msgstr "od" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "Sending email to" msgstr "Odeslat email" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:712 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:965 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1057 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1118 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1236 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 msgid "No suitable formats" msgstr "Žádné vhodné formáty" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:959 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:738 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:984 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:739 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:989 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:770 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1016 msgid "News:" msgstr "Zprávy:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1017 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:782 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1028 msgid "Sent news to" msgstr "Odeslat zprávy do" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1058 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1237 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1087 msgid "Sending catalogs to device." msgstr "Odeslat katalog do zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:902 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1150 msgid "Sending news to device." msgstr "Odesílám zprávy do zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:957 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 msgid "Sending books to device." msgstr "Odesílám knihy do zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1244 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:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1305 msgid "No space on device" msgstr "Na zařízení není volné místo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1047 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1306 msgid "" "

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

Knihy není možné odeslat do zařízení pro nedostatek volného úložného " "prostoru " -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 msgid "Select available formats and their order for this device" 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:82 msgid "Use sub directories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81 -msgid "Save &template:" +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 +msgid "Use author sort for author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:293 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:994 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:102 -msgid "Path" -msgstr "Cesta" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:117 -#: /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:219 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:292 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:103 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:91 -msgid "Formats" -msgstr "Formáty" +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +msgid "Save &template:" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68 msgid "Fit &cover to view" @@ -4393,47 +4954,47 @@ msgstr "&Profil:" msgid "Edit Comments" 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 "%(plugin_type)s %(plugins)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:175 msgid "plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:184 msgid "" "\n" "Customization: " 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 "Převod" -#: /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 "General" msgstr "Obecné" -#: /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 "Interface" msgstr "Rozhraní" -#: /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 "Add/Save" msgstr "Přidat/Uložit" -#: /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 "Advanced" msgstr "Rozšířené" -#: /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 "" "Content\n" "Server" @@ -4441,193 +5002,193 @@ msgstr "" "Obsahový\n" "Server" -#: /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 "Plugins" msgstr "Moduly" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 msgid "Auto send" msgstr "Automaticky odeslat" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 msgid "Email" msgstr "Email" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:225 msgid "Formats to email. The first matching format will be sent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:226 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:299 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:300 msgid "new email address" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 -msgid "System port selected" +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:502 +msgid "System port selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:503 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:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:933 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:190 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1650 -#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 -msgid "Error" -msgstr "Chyba" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:523 msgid "Failed to install command line tools." msgstr "Selhala Instalce nástrojů pro příkazovou řádku." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:514 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:526 msgid "Command line tools installed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:527 msgid "Command line tools installed in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:528 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:567 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:579 msgid "No valid plugin path" msgstr "Chybí platná cesta k modulům" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:568 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:580 msgid "%s is not a valid plugin path" msgstr "%s není platná cesta k modulům" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:583 msgid "Choose plugin" msgstr "Zvolte modul" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:595 msgid "Plugin cannot be disabled" msgstr "Modul není možné deaktivovat" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:584 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:596 msgid "The plugin: %s cannot be disabled" msgstr "Modul %s nemůže být deaktivován" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:605 msgid "Plugin not customizable" msgstr "Modul není upravitelný" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:606 msgid "Plugin: %s does not need customization" msgstr "Modul %s nevyžaduje žádné úpravy" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:614 msgid "Customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:652 msgid "Cannot remove builtin plugin" msgstr "Vestavěný modul není možné odstranit" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:653 msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." msgstr "" " nemůže být odstraněn. Je to vestavěbý modul. Skuste ho místo odstranění " "deaktivovat." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:684 msgid "You must select a column to delete it" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:677 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:689 msgid "The selected column is not a custom column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:690 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:48 msgid "Are you sure?" msgstr "Jste si jisti?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:691 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:746 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:758 msgid "Error log:" msgstr "Záznam o chybách:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:765 msgid "Access log:" msgstr "Záznam o přístupu" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:781 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:761 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:793 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:340 msgid "Failed to start content server" msgstr "Nepodařilo se spustit obdahový server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:805 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:817 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:587 msgid "Select location for books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:812 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:824 msgid "Invalid size" msgstr "Neplatná velikost" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:813 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:825 msgid "The size %s is invalid. must be of the form widthxheight" msgstr "Velikost %s je neplatná. Požadovaný formát je šířka x výška" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:868 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:884 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:889 msgid "Invalid database location" msgstr "Neplatné umístění databáze" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:869 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:885 msgid "Invalid database location " msgstr "Neplatné umístění databáze " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:886 msgid "
Must be a directory." msgstr "
Musí být adresář." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:890 msgid "Invalid database location.
Cannot write to " msgstr "Neplatné umístění databáze.
Nemůžu zapsat do " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:895 msgid "Must restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:896 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:914 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:930 msgid "Checking database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:934 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:950 msgid "Failed to check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:939 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:955 msgid "Some inconsistencies found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:956 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 " @@ -4635,35 +5196,35 @@ msgid "" "folder directly." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:113 msgid "TabWidget" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:114 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:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:115 msgid "Read metadata only from &file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:116 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:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:117 msgid "&Swap author firstname and lastname" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:118 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" +"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" @@ -4671,80 +5232,98 @@ msgid "" "punctuation, case, etc. Author match is exact." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122 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:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:123 msgid "&Configure metadata from file name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:124 msgid "&Adding books" msgstr "&Přidání knih" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:125 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:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:126 msgid "Save &cover separately" msgstr "Uložit &obálku odděleně" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:127 msgid "Update &metadata in saved copies" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:128 msgid "Save metadata in &OPF file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:129 msgid "Convert non-English characters to &English equivalents" msgstr "Převést neAnglické znaky na Anglické &ekvivalenty" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:130 msgid "Format &dates as:" msgstr "Formát data:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:131 msgid "File &formats to save:" msgstr "&Formáty souborů k uložení:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:132 msgid "Replace space with &underscores" msgstr "Nahradit mezer&u podtržitkem" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:133 msgid "Change paths to &lowercase" msgstr "Změnit cesty na malá písmena" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:134 msgid "&Saving books" msgstr "&Ukládání Knih" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:135 +msgid "Preserve device collections." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:136 +msgid "" +"If checked, collections will not be deleted even if a book with changed " +"metadata is resent and the collection is not in the book's metadata. In " +"addition, editing collections in the device view will be enabled. If " +"unchecked, collections will be always reflect only the metadata in the " +"calibre library." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:137 +msgid " " +msgstr " " + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:138 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:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:139 msgid "Sending to &device" msgstr "Odeslání do &zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:297 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 msgid "Preferences" msgstr "Možnosti" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:552 msgid "" "&Location of ebooks (The ebooks are stored in folders sorted by author and " "metadata is stored in the file metadata.db)" @@ -4752,27 +5331,27 @@ msgstr "" "&Umístění elektronických knih (Knihy jsou umístěné v adresářích podla autora " "a metadata jsou uložené v souboru metadata.db)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:553 msgid "Browse for the new database location" msgstr "Určete nové umístění databáze" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555 msgid "Show notification when &new version is available" msgstr "Zobrazit upozornění pokud je dostupná &nová verze." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556 msgid "Download &social metadata (tags/ratings/etc.) by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:557 msgid "&Overwrite author and title by default when fetching metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:558 msgid "Default network &timeout:" msgstr "Výchozí časový &limit sítě:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:559 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" @@ -4780,166 +5359,182 @@ msgstr "" "Výchozí časový limit pro síťové dotazy (např. pokaždé když jdeme na Internet " "získat informace)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:560 msgid " seconds" msgstr " sekund" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561 msgid "Choose &language (requires restart):" msgstr "Vyberte &jazyk (vyžaduje restart):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562 msgid "Normal" msgstr "Normální" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:563 msgid "High" msgstr "Vysoká" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564 msgid "Low" msgstr "Nízká" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:565 msgid "Job &priority:" msgstr "&Priorita úloh:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:566 msgid "Preferred &output format:" msgstr "Upřednostňovaný výstupní formát:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:567 msgid "Preferred &input format order:" msgstr "Pořadí preference &vstupních formátů:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:570 msgid "Use &Roman numerals for series number" msgstr "Číslovat knihy v sérii &Římskými číslicemi" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571 msgid "Enable system &tray icon (needs restart)" msgstr "Zobrazit &ikonu v sýstémové liště (vyžaduje restart)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572 msgid "Show ¬ifications in system tray" msgstr "Zobrazovat upozor&nění v systémové liště" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 msgid "Show &splash screen at startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574 msgid "Show cover &browser in a separate window (needs restart)" msgstr "Zobrazit prohlížec &obálek v samostatném okně (vyžaduje restart)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:560 -msgid "Search as you type" -msgstr "Vyhledávat při zadávání" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561 -msgid "Automatically send downloaded &news to ebook reader" -msgstr "&Automaticky odeslat stažené zprávy do čtecího zařízení" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562 -msgid "&Delete news from library when it is automatically sent to reader" -msgstr "Smazat zprávy z knihovny když jsou automaticky odeslány do čtečky" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:563 -msgid "&Number of covers to show in browse mode (needs restart):" -msgstr "Počet obálek zobraze&ných v přohlížecím módu (vyžaduje restart)" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564 -msgid "Toolbar" -msgstr "Panel nástrojů" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:565 -msgid "Large" -msgstr "Velké" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:566 -msgid "Medium" -msgstr "Střední" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:567 -msgid "Small" -msgstr "Malé" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:568 -msgid "&Button size in toolbar" -msgstr "&Velikost tlačítek na panelu nástrojů" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569 -msgid "Show &text in toolbar buttons" -msgstr "Zobrazit &text na tlačítkách panelu nástrojů" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:570 -msgid "Select visible &columns in library view" -msgstr "Viditelné sloup&ce v seznamu knih v knihovne" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572 -msgid "Remove a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574 -msgid "Add a user-defined column" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575 +msgid "Show &average ratings in the tags browser" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:576 +msgid "Search as you type" +msgstr "Vyhledávat při zadávání" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 +msgid "Automatically send downloaded &news to ebook reader" +msgstr "&Automaticky odeslat stažené zprávy do čtecího zařízení" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:578 +msgid "&Delete news from library when it is automatically sent to reader" +msgstr "Smazat zprávy z knihovny když jsou automaticky odeslány do čtečky" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:579 +msgid "&Number of covers to show in browse mode (needs restart):" +msgstr "Počet obálek zobraze&ných v přohlížecím módu (vyžaduje restart)" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:580 +msgid "Toolbar" +msgstr "Panel nástrojů" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:581 +msgid "Large" +msgstr "Velké" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:582 +msgid "Medium" +msgstr "Střední" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:583 +msgid "Small" +msgstr "Malé" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:584 +msgid "&Button size in toolbar" +msgstr "&Velikost tlačítek na panelu nástrojů" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:585 +msgid "Show &text in toolbar buttons" +msgstr "Zobrazit &text na tlačítkách panelu nástrojů" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:586 +msgid "Select visible &columns in library view" +msgstr "Viditelné sloup&ce v seznamu knih v knihovne" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:588 +msgid "Remove a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:590 +msgid "Add a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:592 msgid "Edit settings of a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:579 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:595 msgid "Use internal &viewer for:" msgstr "Použít interní &prohlížec pro:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:580 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:596 +msgid "User Interface &layout (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:597 +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:598 +msgid "Disable &animations" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:599 msgid "Add an email address to which to send books" msgstr "Přdat emailovou adresu na kterou posílat knihy" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:581 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:600 msgid "&Add email" msgstr "Přidat em&ail" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:582 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:601 msgid "Make &default" msgstr "Nastavit &výchozí" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 msgid "&Remove email" msgstr "Odst&ranit email" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:584 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:603 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:585 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:604 msgid "&Maximum number of waiting worker processes (needs restart):" msgstr "&Maximální počet procesů ve frontě (vyžaduje restart):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605 msgid "&Check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 msgid "&Install command line tools" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 msgid "Open calibre &configuration directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:589 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 msgid "Limit the max. simultaneous jobs to the available CPU &cores" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:590 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 msgid "Debug &device detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 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 " @@ -4949,25 +5544,25 @@ msgstr "" "pomocí internetového prohlížeče z jakehokoliv místa na světě. Změny v " "nastaení se projeví až po restartu serveru." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 msgid "Server &port:" msgstr "&Port serveru:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 #: /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 "&Uživatelské jméno:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 #: /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 "&Heslo:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 msgid "" "If you leave the password blank, anyone will be able to access your book " "collection using the web interface." @@ -4975,7 +5570,7 @@ msgstr "" "Pokud ponecháte heslo prázdné, kdokoliv bude mít přístup k vaší zbírce knih " "přes webové rozhraní." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:596 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 msgid "" "The maximum size (widthxheight) for displayed covers. Larger covers are " "resized. " @@ -4983,45 +5578,45 @@ msgstr "" "Maximální velikost (šířka x výška) zobrazených obálek. Velké obálky budou " "zmenšené. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 msgid "Max. &cover size:" msgstr "Max. velikost &obálek:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 #: /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 "Zobrazit he&slo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:599 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 msgid "Max. &OPDS items per query:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 msgid "Max. OPDS &ungrouped items:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:601 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 msgid "&Start Server" msgstr "&Spustit server" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 msgid "St&op Server" msgstr "&Zastavit server" -#: /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:622 msgid "&Test Server" msgstr "&Test serveru" -#: /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:623 msgid "Run server &automatically on startup" msgstr "&Automaticky spustit server při startu" -#: /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:624 msgid "View &server logs" msgstr "Zobrazit &serverové záznamy" -#: /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:625 #: /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 " @@ -5032,34 +5627,34 @@ msgid "" "the IP address of the computer calibre is running on." 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:627 msgid "" "Here you can customize the behavior of Calibre by controlling what plugins " "it uses." msgstr "" "Tady můžete upravit chování calibre, určením které moduly bude používat" -#: /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:628 msgid "Enable/&Disable plugin" msgstr "Aktivovat/&Deaktivovat modul" -#: /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:629 msgid "&Customize plugin" msgstr "&Upravit modul" -#: /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:630 msgid "&Remove plugin" msgstr "&Odstranit modul" -#: /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:631 msgid "Add new plugin" msgstr "Přidat nový modul" -#: /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:632 msgid "Plugin &file:" msgstr "&Soubor modulu:" -#: /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:634 msgid "&Add" msgstr "Přid&at" @@ -5096,10 +5691,11 @@ 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:27 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:833 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:535 +#: /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:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:884 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Date" msgstr "Datum" @@ -5115,68 +5711,73 @@ msgstr "" msgid "Create and edit tag-based columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:18 +#: /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:21 +#: /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:24 +#: /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:29 -msgid "Floating point numbers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:31 -msgid "Integers" +#: /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:36 +#: /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:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:64 msgid "No column selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:65 msgid "No column has been selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:69 msgid "Selected column is not a user-defined column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:100 msgid "No lookup name was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:102 msgid "" -"The label must contain only letters and digits, and start with a letter" +"The label must contain only letters, digits and underscores, and start with " +"a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:111 msgid "No column heading was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:117 msgid "The lookup name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:127 msgid "The heading %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:129 msgid "" "The lookup name must be lower case and cannot contain \":\"s or spaces" msgstr "" @@ -5285,39 +5886,60 @@ msgstr "&Znovu zobrazit toto upozornění" msgid "ERROR" msgstr "CHYBA" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:69 +msgid "Location" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1058 +msgid "Format" +msgstr "Formát" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device_ui.py:50 +msgid "Delete from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:29 +msgid "Author sort" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:47 +msgid "Manage authors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 msgid "Author Sort" msgstr "Autor (seřadit jako)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "ISBN" msgstr "ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:162 msgid "Finding metadata..." msgstr "Hledám metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:176 msgid "Could not find metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:177 msgid "The metadata download seems to have stalled. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:186 msgid "Warning" msgstr "Varování" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:187 msgid "Could not fetch metadata from:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:191 msgid "No metadata found" msgstr "Nenalezeny žádné metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:192 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -5396,21 +6018,21 @@ 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:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 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:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "&Rating:" msgstr "&Hodnocení:" #: /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:376 -#: /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:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Rating of this book. 0-5 stars" msgstr "Hodnocení této knihy. 0-5 hvězdiček" @@ -5419,7 +6041,7 @@ 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:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid " stars" msgstr "" @@ -5429,8 +6051,8 @@ 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:382 -#: /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:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 msgid "Open Tag Editor" msgstr "Otevřít Editor značek" @@ -5458,10 +6080,6 @@ 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:183 -msgid "Automatically number books in this series" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 msgid "" "Remove stored conversion settings for the selected books.\n" @@ -5474,204 +6092,207 @@ 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:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 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:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "&Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:123 msgid "Not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136 msgid "Choose formats for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1391 -msgid "Books" -msgstr "Knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 msgid "No permission" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:166 msgid "You do not have permission to read the following files:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:194 msgid "No format selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:205 msgid "Could not read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:206 msgid "Could not read metadata from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:256 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 msgid "Could not read cover" msgstr "Nepodařilo se načíst obálku" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:255 msgid "Could not read cover from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:261 msgid "The cover in the %s format is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:298 msgid "Abort the editing of all remaining books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:442 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:439 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:450 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:442 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:521 +msgid "Cannot use tag editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:522 +msgid "The tags editor cannot be used if you have modified the tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:542 msgid "Downloading cover..." msgstr "Stáhnout obálku..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:558 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:563 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:565 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:559 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:566 msgid "Could not fetch cover.
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:556 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:560 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:576 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:572 msgid "Bad cover" msgstr "Špatná obálka" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:577 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:573 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:610 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:606 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:607 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:708 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:709 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:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 msgid "Edit Meta Information" msgstr "" -#: /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:362 msgid "Meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 msgid "Swap the author and title" msgstr "" -#: /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:368 msgid "Author S&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 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:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "Remove unused series (Series that have no books)" 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:386 msgid "IS&BN:" 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:387 msgid "Publishe&d:" 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:390 msgid "dd MMM yyyy" 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:391 msgid "&Date:" msgstr "" -#: /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:392 msgid "&Comments" msgstr "&Komentáře" -#: /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:393 msgid "&Fetch metadata from server" msgstr "Získat data ze serveru" -#: /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:394 msgid "Available Formats" 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:395 msgid "Add a new format for this book to the database" 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:397 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /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:399 msgid "Set the cover for the book from the selected format" msgstr "" -#: /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:401 msgid "Update metadata from the metadata in the selected format" 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:406 msgid "Reset cover to default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Download &cover" msgstr "Stáhnout obálku" @@ -5951,12 +6572,12 @@ msgid "Choose formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:72 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:76 msgid "Authors" msgstr "Autoři" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:101 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:107 msgid "Publishers" msgstr "Vydavatelé" @@ -6018,7 +6639,7 @@ msgid "Select the content kind of the new category" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:68 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:101 msgid "Are your sure?" msgstr "" @@ -6070,63 +6691,55 @@ msgstr "" msgid "Add tag to available tags and apply it to current book" msgstr "Přidat tag do seznamu dostupných tagů a aplikovat na aktuální knihu" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:501 msgid "Item is blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:502 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:66 -msgid "Item already used" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:67 -msgid "The item %s is already used." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:87 msgid "No item selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:88 msgid "You must select one item from the list of Available items." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:97 msgid "No items selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:98 msgid "You must select at least one items from the list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:102 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:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:72 msgid "Category Editor" 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:73 msgid "Items in use" 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:74 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:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:76 msgid "Rename the item in every book where it is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 msgid "Ctrl+S" msgstr "" @@ -6380,11 +6993,11 @@ msgstr "Regulární výraz (?P<title>)" #: /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:78 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:82 -#: /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:94 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:100 msgid "No match" msgstr "Žádná shoda" @@ -6420,54 +7033,215 @@ msgstr "ISBN:" msgid "Regular expression (?P)" msgstr "Regulární výraz (?P)" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:36 +msgid "Save single format to disk..." +msgstr "Uložit jediný formát na disk..." + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:52 +msgid "Edit metadata individually" +msgstr "Upravit metadata Individuálně" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:55 +msgid "Edit metadata in bulk" +msgstr "Upravit metadata dávkově" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:58 +msgid "Download metadata and covers" +msgstr "Stáhnout metadata a obálky" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:61 +msgid "Download only metadata" +msgstr "Stáhnout pouze metadata" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:63 +msgid "Download only covers" +msgstr "Stáhnout pouze obálky" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:66 +msgid "Download only social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:72 +msgid "Merge into first selected book - delete others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:75 +msgid "Merge into first selected book - keep others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:83 +msgid "Add books from a single directory" +msgstr "Přidat Knihy z jednoho adresáře" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:85 +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 "" +"Přidat knihy z adresárů, včetně podadresářů (předpokládá se, že každý " +"adresář představuje jednu knihu a soubory v něm jsou různé formáty té samé " +"knihy)" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:89 +msgid "" +"Add books from directories, including sub directories (Multiple books per " +"directory, assumes every ebook file is a different book)" +msgstr "" +"Přidat knihy z adresárů, včetně podadresářů (vícero knih v jednom adresáři, " +"předpokládá se že každý soubor představuje jednu knihu)" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:92 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "Přidat prázdnou knihu. (Položka knihy bez žádných formátů)" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:283 +msgid "Save to disk" +msgstr "Uložit na disk" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104 +msgid "Save to disk in a single directory" +msgstr "Uložit na disk v jednom adresáři" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:402 +msgid "Save only %s format to disk" +msgstr "Uložit jen formát %s na disk" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:405 +msgid "Save only %s format to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:289 +msgid "View" +msgstr "Zobrazit" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:120 +msgid "View specific format" +msgstr "Zobrazit určitý formát" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126 +msgid "Remove selected books" +msgstr "Smazat vybrané knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:128 +msgid "Remove files of a specific format from selected books.." +msgstr "Odstranit soubory se zvoleným formátem z označených knih" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:131 +msgid "Remove all formats from selected books, except..." +msgstr "" +"Odstranit všechny soubory se zvoleným formátem z označených knih, mimo..." + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:134 +msgid "Remove covers from selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:137 +msgid "Remove matching books from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:154 +msgid "Convert individually" +msgstr "Převést Individuálně" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:156 +msgid "Bulk convert" +msgstr "Převést dávkově" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:160 +msgid "Create catalog of books in your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:168 +msgid "Run welcome wizard" +msgstr "Spustit uvítacího průvodce" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:200 +msgid "Similar books..." +msgstr "Podobné knihy..." + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:232 +msgid "Add books to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:248 +msgid "Manage collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:328 +msgid "Cover Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:346 +msgid "Tag Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:403 +msgid "Book Details" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:60 msgid "Job" msgstr "Úloha" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:61 msgid "Status" msgstr "Stav" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:62 msgid "Progress" msgstr "Průběh" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:63 msgid "Running time" msgstr "Uplynulý čas" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:75 msgid "There are %d running jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:101 msgid "Unknown job" msgstr "Neznáma úloha" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:82 msgid "There are %d waiting jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:212 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:219 msgid "Cannot kill job" msgstr "Nemůžu ukončit úlohu" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:217 msgid "Cannot kill jobs that communicate with the device" msgstr "Není možné ukončit úlohy, které komunikují se zařízením" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:220 msgid "Job has already run" msgstr "Úloha je již dokončená" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:248 msgid "Unavailable" msgstr "Není k dispozici" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:280 +msgid "Jobs:" +msgstr "Úlohy:" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:298 +msgid "Click to see list of active jobs." +msgstr "Kliknutím zobrazíte seznam aktivních úloh." + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 msgid " - Jobs" msgstr " - Úlohy" @@ -6479,112 +7253,90 @@ msgstr "" msgid "Y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 msgid "On Device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 msgid "Size (MB)" msgstr "Velikost (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 msgid "Rating" msgstr "Hodnocení" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:285 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:296 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1003 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1007 -#: /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:414 -msgid "None" -msgstr "Žádné" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:302 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 msgid "Book %s of %s." msgstr "Kniha %s z %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:639 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1071 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:674 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1176 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:399 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:830 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:881 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:834 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:885 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:835 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 -msgid "Collections" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:993 -msgid "Format" -msgstr "Formát" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1053 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1156 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1056 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1159 msgid "Double click to edit me

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:110 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:115 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:116 msgid "Ascending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:119 msgid "Descending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:131 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:134 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:475 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:524 msgid "Not allowed" msgstr "Nedovolené" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:525 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -6682,282 +7434,253 @@ msgstr "" msgid "Do not check for updates" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:67 -msgid "Choose a location for your calibre e-book library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:76 -msgid "Failed to create library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:77 -msgid "Failed to create calibre library at: %r. Aborting." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 -msgid "Initializing user interface..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 -msgid "Repairing failed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 -msgid "The database repair failed. Starting with a new empty library." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:595 msgid "Calibre Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:86 +msgid "Choose a location for your calibre e-book library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 +msgid "Failed to create library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +msgid "Failed to create calibre library at: %r." +msgstr "" + +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 +msgid "Initializing user interface..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 +msgid "Repairing failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:179 +msgid "The database repair failed. Starting with a new empty library." +msgstr "" + +#: /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 "Neplatné umístění databáze" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:194 msgid "Bad database location %r. calibre will now quit." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:207 msgid "Corrupted database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:208 msgid "" "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." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:206 +#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:227 msgid "" "Bad database location %r. Will start with a new, empty calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:238 msgid "Starting %s: Loading books..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:283 msgid "If you are sure it is not running" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:285 msgid "Cannot Start " msgstr "Nemůžu spistit " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:286 msgid "%s is already running." msgstr "%s je již spuštěno" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:289 msgid "may be running in the system tray, in the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:291 msgid "upper right region of the screen." msgstr "pravá horní oblast obrazovky" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:293 msgid "lower right region of the screen." msgstr "pravý dolní okraj obrazovky" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:296 msgid "try rebooting your computer." msgstr "skuste restartovat počítač." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:290 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:302 +#: /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 "pokuste se vymazat smazat soubor" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:253 msgid "calibre" msgstr "calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 msgid "&Restrict to:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "set in ui.py" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 msgid "Advanced search" msgstr "Rozšířené vyhledávání" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "Alt+S" msgstr "Alt+S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "&Search:" msgstr "&Hledat" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:404 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 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/main_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 msgid "Reset Quick Search" msgstr "Zrušit rychlé vyhledávání" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "Choose saved search or enter name for new saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Copy current search text (instead of search name)" msgstr "Zkopírovat právě hledaný text (namísto hledání názvu)" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 msgid "Save current search under the name shown in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Delete current saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:415 -msgid "Sort by &popularity" -msgstr "Setřídit podle &popularity" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:416 -msgid "Match any" -msgstr "Najít kterékoliv" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:417 -msgid "Match all" -msgstr "Porovnat vše" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:418 -msgid "Create, edit, and delete user categories" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:419 -msgid "Manage &user categories" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "Add books" msgstr "Přidat knihy" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:421 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:422 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "Remove books" msgstr "Odstranit knihy" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Del" msgstr "Del" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:425 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "Edit meta information" msgstr "Upravit Metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:426 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "Merge book records" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "M" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "Send to device" msgstr "Odeslat do zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:430 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:355 -msgid "Save to disk" -msgstr "Uložit na disk" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:431 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:284 msgid "S" msgstr "S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:432 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:285 msgid "Fetch news" msgstr "Stáhnout zprávy" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:286 msgid "F" msgstr "F" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:287 msgid "Convert E-books" msgstr "Převést knihy" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:435 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:288 msgid "C" msgstr "C" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:436 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:369 -msgid "View" -msgstr "Zobrazit" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:290 msgid "V" msgstr "V" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:438 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:291 msgid "Open containing folder" msgstr "Otevřít nadřazený adresář" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:439 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:292 msgid "Show book details" msgstr "Zobrazit podrobnosti o knize" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:440 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:293 msgid "Books by same author" msgstr "Knihy od stejného autora" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:294 msgid "Books in this series" msgstr "Knihy v této sérii" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:295 msgid "Books by this publisher" msgstr "Knihy od tohoto vydavatele" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:296 msgid "Books with the same tags" msgstr "Knihy se stejnými tagy" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:298 msgid "Configure calibre" msgstr "Nastavit calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:299 msgid "Ctrl+P" msgstr "Ctrl+P" @@ -6989,15 +7712,35 @@ msgstr "Kniha nemá ani název ani ISBN" msgid "No matches found for this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:260 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:313 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:355 +msgid "Search (For Advanced Search click the button to the left)" +msgstr "Vyhledávání (pro rozšířené vyhledávání klikněte na tlačítko vlevo)" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:392 +msgid "Saved Searches" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:46 +msgid "({0} of {1})" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:52 +msgid "(all books)" +msgstr "Všechny knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:54 +msgid "({0} of all)" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:58 msgid "Press a key..." msgstr "" @@ -7058,82 +7801,75 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:24 -msgid "Jobs:" -msgstr "Úlohy:" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:32 -msgid "Click to see list of active jobs." -msgstr "Kliknutím zobrazíte seznam aktivních úloh." - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:83 -msgid "Hide Book Details" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:191 +msgid "Rename '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:83 -msgid "Show Book Details" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:195 +msgid "Edit sort for '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:84 -msgid "Hide Tag Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:84 -msgid "Show Tag Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:85 -msgid "Hide Cover Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:85 -msgid "Show Cover Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:95 -msgid "Side bar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:135 -msgid "Cover browser could not be loaded: " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:142 -msgid "Rename" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:200 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:203 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:207 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:161 -msgid "Manage " +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:218 +msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:221 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:232 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:329 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:433 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:271 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:420 -msgid "The name %s is already used." +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 +msgid "Duplicate search name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 +msgid "The saved search name %s is already used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:768 +msgid "Sort by name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:768 +msgid "Sort by popularity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:769 +msgid "Sort by average rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:775 +msgid "Match all" +msgstr "Porovnat vše" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:775 +msgid "Match any" +msgstr "Najít kterékoliv" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:780 +msgid "Manage &user categories" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:63 @@ -7175,631 +7911,104 @@ msgid "" "reconvert them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:70 -msgid "Save single format to disk..." -msgstr "Uložit jediný formát na disk..." - #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:162 -msgid "Search (For Advanced Search click the button to the left)" -msgstr "Vyhledávání (pro rozšířené vyhledávání klikněte na tlačítko vlevo)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168 -msgid "Saved Searches" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:191 -msgid "Error communicating with device" -msgstr "Cyba komunikace se zařízením" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:208 msgid "&Restore" msgstr "&Obnovit" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:164 msgid "&Donate to support calibre" msgstr "&Přispějte na vývoj calibre." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:172 msgid "&Restart" msgstr "&Restart" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:206 msgid "

For help see the: User Manual
" msgstr "

Nápovědu najdete: User Manual
" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:212 msgid "%s: %s by Kovid Goyal %%(version)s
%%(device)s

" msgstr "%s: %s by Kovid Goyal %%(version)s
%%(device)s

" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:281 -msgid "Edit metadata individually" -msgstr "Upravit metadata Individuálně" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:283 -msgid "Edit metadata in bulk" -msgstr "Upravit metadata dávkově" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:285 -msgid "Download metadata and covers" -msgstr "Stáhnout metadata a obálky" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:286 -msgid "Download only metadata" -msgstr "Stáhnout pouze metadata" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:287 -msgid "Download only covers" -msgstr "Stáhnout pouze obálky" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:288 -msgid "Download only social metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:292 -msgid "Merge into first selected book - delete others" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:294 -msgid "Merge into first selected book - keep others" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:301 -msgid "Add books from a single directory" -msgstr "Přidat Knihy z jednoho adresáře" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 -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 "" -"Přidat knihy z adresárů, včetně podadresářů (předpokládá se, že každý " -"adresář představuje jednu knihu a soubory v něm jsou různé formáty té samé " -"knihy)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:305 -msgid "" -"Add books from directories, including sub directories (Multiple books per " -"directory, assumes every ebook file is a different book)" -msgstr "" -"Přidat knihy z adresárů, včetně podadresářů (vícero knih v jednom adresáři, " -"předpokládá se že každý soubor představuje jednu knihu)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:308 -msgid "Add Empty book. (Book entry with no formats)" -msgstr "Přidat prázdnou knihu. (Položka knihy bez žádných formátů)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:356 -msgid "Save to disk in a single directory" -msgstr "Uložit na disk v jednom adresáři" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:357 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2299 -msgid "Save only %s format to disk" -msgstr "Uložit jen formát %s na disk" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:360 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2302 -msgid "Save only %s format to disk in a single directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:370 -msgid "View specific format" -msgstr "Zobrazit určitý formát" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:375 -msgid "Remove selected books" -msgstr "Smazat vybrané knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:377 -msgid "Remove files of a specific format from selected books.." -msgstr "Odstranit soubory se zvoleným formátem z označených knih" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:379 -msgid "Remove all formats from selected books, except..." -msgstr "" -"Odstranit všechny soubory se zvoleným formátem z označených knih, mimo..." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:381 -msgid "Remove covers from selected books" -msgstr "Smazat obálku z označených knih" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:420 -msgid "Convert individually" -msgstr "Převést Individuálně" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:421 -msgid "Bulk convert" -msgstr "Převést dávkově" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:424 -msgid "Create catalog of books in your calibre library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:440 -msgid "Run welcome wizard" -msgstr "Spustit uvítacího průvodce" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:480 -msgid "Similar books..." -msgstr "Podobné knihy..." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:237 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:689 -msgid "Select folder to open as device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:800 -msgid "Browse by covers" -msgstr "Prohlížet obálky" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:870 -msgid "({0} of {1})" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:875 -msgid "(all books)" -msgstr "Všechny knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:877 -msgid "({0} of all)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1000 -msgid "Device: " -msgstr "Zařízení: " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1002 -msgid " detected." -msgstr " nalezeno." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1034 -msgid "Connected " -msgstr "Připojeno " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1046 -msgid "Device database corrupted" -msgstr "Databáze zařízení je poškozená" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1047 -msgid "" -"\n" -"

The database of books on the reader is corrupted. Try the " -"following:\n" -"

    \n" -"
  1. Unplug the reader. Wait for it to finish regenerating " -"the database (i.e. wait till it is ready to be used). Plug it back in. Now " -"it should work with %(app)s. If not try the next step.
  2. \n" -"
  3. Quit %(app)s. Find the file media.xml in the reader's " -"main memory. Delete it. Unplug the reader. Wait for it to regenerate the " -"file. Re-connect it and start %(app)s.
  4. \n" -"
\n" -" " -msgstr "" -"\n" -"

Databáze knih v zařízení je poškozená. Skuste nasledující " -"postup:\n" -"

    \n" -"
  1. Odpojte zařízení. Počkejte dokud neobnoví databázi (t.j. " -"dokud nebude připravené na použití). Znovu ho zapojte. Potom by mělo " -"fungovať s %(app)s. Pokud ne, skuste nasledující krok.
  2. \n" -"
  3. Zavřetee %(app)s. Najděte soubor media.xml v hlavní " -"paměti zařízení a smažte ho. Odpojte zařízeníe. Počkajte Dokud soubor " -"nezregeneruje. Zařízení znovu připojte a spusťte %(app)s.
  4. \n" -"
\n" -" " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1110 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1287 -msgid "Use library only" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1111 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1288 -msgid "User annotations generated from main library only" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1118 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1604 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1661 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1699 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1720 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1850 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1915 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2033 -msgid "No books selected" -msgstr "Nejsou označeny žádné knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1119 -msgid "No books selected to fetch annotations from" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1144 -msgid "Merging user annotations into database" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1172 -msgid "%s
Last Page Read: %d (%d%%)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1178 -msgid "%s
Last Page Read: Location %d (%d%%)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1197 -msgid "Location %d • %s
%s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1206 -msgid "Page %d • %s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1211 -msgid "Location %d • %s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1331 -msgid "How many empty books?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1332 -msgid "How many empty books should be added?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1380 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1431 -msgid "Uploading books to device." -msgstr "Odesílám knihy do zařízení" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1392 -msgid "EPUB Books" -msgstr "EPUB knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1393 -msgid "LRF Books" -msgstr "LRF knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1394 -msgid "HTML Books" -msgstr "HTML knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1395 -msgid "LIT Books" -msgstr "LIT knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1396 -msgid "MOBI Books" -msgstr "MOBI knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1397 -msgid "Topaz books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1398 -msgid "Text books" -msgstr "TXT knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1399 -msgid "PDF Books" -msgstr "PDF knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1400 -msgid "Comics" -msgstr "Komiksy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1401 -msgid "Archives" -msgstr "Archívy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1405 -msgid "Supported books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1440 -msgid "Merged some books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1441 -msgid "" -"Some duplicates were found and merged into the following existing books:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1450 -msgid "Failed to read metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1451 -msgid "Failed to read metadata from the following" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1471 -msgid "Cannot delete" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1474 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2177 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2202 -msgid "No book selected" -msgstr "Není označena žádná kniha" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1484 -msgid "Choose formats to be deleted" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1502 -msgid "Choose formats not to be deleted" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1540 -msgid "" -"The selected books will be permanently deleted and the files removed " -"from your computer. Are you sure?" -msgstr "" -"Označené knihy budou trvale smazány a soubory budou odstraněny z " -"vašeho počítače. Opravdu je chcete odstranit?" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1557 -msgid "" -"The selected books will be permanently deleted from your device. Are " -"you sure?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1572 -msgid "Deleting books from device." -msgstr "Mažu knihy ze zařízení." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1603 -msgid "Cannot download metadata" -msgstr "Nemůžu stáhnout metadata." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1619 -msgid "social metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1621 -msgid "covers" -msgstr "obálky" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1621 -msgid "metadata" -msgstr "metadata" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1623 -msgid "Downloading %s for %d book(s)" -msgstr "Stahuji %s pro %d knihu(y)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1645 -msgid "Failed to download some metadata" -msgstr "Selhalo stahování některých metadat" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646 -msgid "Failed to download metadata for the following:" -msgstr "Selhalo stahovaní metadat pro následující:" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1649 -msgid "Failed to download metadata:" -msgstr "Selhalo stahování metadat:" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1660 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1698 -msgid "Cannot edit metadata" -msgstr "Nemůžu upravit metadata" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1719 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1722 -msgid "Cannot merge books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1723 -msgid "At least two books must be selected for merging" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1727 -msgid "" -"All book formats and metadata from the selected books will be added to the " -"first selected book.

The second and subsequently selected " -"books will not be deleted or changed.

Please confirm you want to " -"proceed." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1738 -msgid "" -"All book formats and metadata from the selected books will be merged into " -"the first selected book.

After merger the second and " -"subsequently selected books will be deleted.

All book formats " -"of the first selected book will be kept and any duplicate formats in the " -"second and subsequently selected books will be permanently deleted " -"from your computer.

Are you sure you want to proceed?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1750 -msgid "" -"You are about to merge more than 5 books. Are you sure you want to " -"proceed?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1849 -msgid "Cannot save to disk" -msgstr "Chyba zápisu na disk" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1852 -msgid "Choose destination directory" -msgstr "Zvolte cílový adresář" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1885 -msgid "Error while saving" -msgstr "Chyba při ukládání" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1886 -msgid "There was an error while saving." -msgstr "Při ukládání nastala chyba." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1893 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1894 -msgid "Could not save some books" -msgstr "Nemohu uložit některé knihy" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1895 -msgid "Click the show details button to see which ones." -msgstr "Klikněte na tlačítko zobrazit detaily pro zjištění které z nich." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1916 -msgid "No books selected to generate catalog for" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1933 -msgid "Generating %s catalog..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1939 -msgid "" -"No books to catalog\n" -"Check exclude tags" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1949 -msgid "Catalog generated." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1952 -msgid "Export Catalog Directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1953 -msgid "Select destination for %s.%s" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1967 -msgid "Fetching news from " -msgstr "Získávám zprávy z " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1981 -msgid " fetched." -msgstr " získány." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2032 -msgid "Cannot convert" -msgstr "Nemůžu převást" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2061 -msgid "Starting conversion of %d book(s)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2177 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2235 -msgid "Cannot view" -msgstr "Nemůžu zobrazit" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2191 -msgid "Multiple Books Selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2192 -msgid "" -"You are attempting to open %d books. Opening too many books at once can be " -"slow and have a negative effect on the responsiveness of your computer. Once " -"started the process cannot be stopped until complete. Do you wish to " -"continue?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2201 -msgid "Cannot open folder" -msgstr "Nemohu otevřít adresář" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2236 -msgid "%s has no available formats." -msgstr "%s není dostupná v žádném dostupném formátu." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2277 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2282 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:389 msgid "Cannot configure" msgstr "Nemůžu nastavit" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2278 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:385 msgid "Cannot configure while there are running jobs." msgstr "Nastavení není možné změnit dokud neproběhne zpracování všech úloh" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2283 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:390 msgid "Cannot configure before calibre is restarted." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2334 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:433 msgid "No detailed info available" msgstr "Bližší informace nejsou dostupné" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2335 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:434 msgid "No detailed information is available for books on the device." msgstr "Bližší informace o knihách v tomto zařízení nejsou dostupné" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2385 -msgid "Failed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2391 -msgid "Error talking to device" -msgstr "Chyba komunikace se zařízením" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2392 -msgid "" -"There was a temporary error talking to the device. Please unplug and " -"reconnect the device and or reboot." -msgstr "" -"Dočasná chyba komunikace se zařízením. Prosím odpojte a znovu připojte " -"zařízení anebo restarujte počítač." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2415 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2443 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:514 msgid "Conversion Error" msgstr "Chyba převodu" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2416 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:487 msgid "" "

Could not convert: %s

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

Nelze převést: %s

Kniha je chráněna pomocí DRM. " +"Před převodem nejprve musíte odstranit DRM pomocí nástroje třetí strany." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2429 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:500 msgid "Recipe Disabled" msgstr "Zdroj zakázán" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2444 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2491 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:555 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." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2516 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:580 msgid "There are active jobs. Are you sure you want to quit?" msgstr "Prpbíha zpracování úloh. Opravdu chcete program ukončit?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2519 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583 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:2523 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:587 msgid "WARNING: Active jobs" msgstr "UPOZORNĚNÍ: Probíhá zpracování úloh." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2575 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:640 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2594 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:52 msgid "" "Latest version: %s" @@ -7807,15 +8016,18 @@ msgstr "" "Poslední verze: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2602 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:60 msgid "Update available" msgstr "Aktualizace dostupná" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2603 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:61 msgid "" "%s has been updated to version %s. See the new features. Visit the download page?" msgstr "" +"%s povýšilo ma verzi %s.Můžete se podívat na nové vlastnosti. Chcete zobrazit stránku pro " +"stažení?" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:43 msgid "Edit bookmark" @@ -8280,82 +8492,94 @@ msgstr "" msgid "Print eBook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 msgid "Copy Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 msgid "Paste Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:270 msgid "" "Library\n" "%d\n" "books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:271 msgid "" "Reader\n" "%s\n" "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:272 msgid "" "Card A\n" "%s\n" "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:273 msgid "" "Card B\n" "%s\n" "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:277 msgid "Click to see the books available on your computer" msgstr "Klikněte pro zobrazení knih dostupných ve vašem počítači" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 msgid "Click to see the books in the main memory of your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:281 msgid "Click to see the books on storage card A in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:282 msgid "Click to see the books on storage card B in your reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:290 msgid "Books located at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:548 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:549 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:550 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:551 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:552 msgid "Title Case" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:974 +msgid "Drag to resize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1006 +msgid "Show" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1012 +msgid "Hide" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:367 msgid "" "If you use the WordPlayer e-book app on your Android phone, you can access " @@ -8618,48 +8842,48 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:270 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:230 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:273 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:233 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:276 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:236 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:279 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:280 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:239 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:240 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:430 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:440 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 msgid "no" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:430 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:440 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 msgid "unchecked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:433 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:443 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 msgid "checked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:433 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:443 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 msgid "empty" msgstr "" @@ -8885,7 +9109,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/cli.py:344 msgid "You must specify at least one book to remove" -msgstr "" +msgstr "Je třeba určit alespoň jednu knihu k odstranění" #: /home/kovid/work/calibre/src/calibre/library/cli.py:363 msgid "" @@ -9037,7 +9261,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/cli.py:655 -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:503 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:505 msgid "Show detailed output information. Useful for debugging" msgstr "" "Zobrazit podrobné výstupní informace. Užitečné pro hledání chyb v programu" @@ -9046,7 +9270,7 @@ msgstr "" msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:688 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:710 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -9058,17 +9282,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:699 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:721 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:710 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:732 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:729 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:751 msgid "" "\n" " %prog custom_columns [options]\n" @@ -9077,19 +9301,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:758 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:748 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:770 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:750 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:772 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:756 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:778 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -9099,15 +9323,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:764 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:796 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:809 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -9119,43 +9343,47 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:487 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:70 +msgid "%sAverage rating is %3.1f" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:545 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:489 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:547 msgid "Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:491 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:549 msgid "Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1542 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1770 msgid "

Migrating old database to ebook library in %s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1571 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1799 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1588 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1681 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1909 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1720 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1950 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1742 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972 msgid "Checked id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:111 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 msgid "Ratings" msgstr "" @@ -9341,43 +9569,43 @@ msgstr "" msgid "Write process PID to the specified file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:108 msgid "%d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:124 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:127 msgid "%d items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:141 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144 msgid "RATING: %s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:147 msgid "TAGS: %s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:148 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:151 msgid "SERIES: %s [%s]
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:189 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:192 msgid "Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:228 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:231 msgid "Books in your library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:234 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:237 msgid "By " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:235 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:238 msgid "Books sorted by " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:535 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Newest" msgstr "" @@ -9451,6 +9679,10 @@ msgstr "" msgid "User-created tag browser categories" msgstr "" +#: /home/kovid/work/calibre/src/calibre/utils/config.py:702 +msgid "Preserve all collections even if not in library metadata." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43 msgid "Waiting..." msgstr "" @@ -9520,34 +9752,38 @@ msgid "English (Pakistan)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:106 -msgid "English (Singapore)" +msgid "English (Israel)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:107 -msgid "English (Yemen)" +msgid "English (Singapore)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:108 -msgid "English (Ireland)" +msgid "English (Yemen)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:109 -msgid "English (China)" +msgid "English (Ireland)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:110 -msgid "Spanish (Paraguay)" +msgid "English (China)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 -msgid "German (AT)" +msgid "Spanish (Paraguay)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:112 -msgid "Dutch (NL)" +msgid "German (AT)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:113 +msgid "Dutch (NL)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:114 msgid "Dutch (BE)" msgstr "" @@ -9604,97 +9840,97 @@ msgid "" "Do not download latest version of builtin recipes from the calibre server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:43 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:44 msgid "Unknown News Source" msgstr "Neznámý zdroj zpráv" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:595 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:608 msgid "The \"%s\" recipe needs a username and password." msgstr "\"%s\" zdroj musí obsahovat jméno a heslo." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:692 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:706 msgid "Download finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:694 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:708 msgid "Failed to download the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:700 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:714 msgid "Failed to download parts of the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:716 msgid " from " msgstr " od " -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:704 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:821 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:807 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:842 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:828 msgid "Fetching feeds..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:847 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:833 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:853 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:839 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:855 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:841 msgid "Generating masthead..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:936 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:922 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:952 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:938 msgid "Feeds downloaded to %s" msgstr "Stáhnout zdroje z %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:962 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:948 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:974 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:960 msgid "Downloading cover from %s" msgstr "Stahování obálky z %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1009 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1000 msgid "Masthead image downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1205 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1190 msgid "Untitled Article" msgstr "Nepojmenovaný článek" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1276 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1261 msgid "Article downloaded: %s" msgstr "Článek stažen: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1287 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1272 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1304 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1289 msgid "Fetching feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1451 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1436 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1467 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1452 msgid "" "You do not have permission to download this issue. Either your subscription " "has expired or you have exceeded the maximum allowed downloads for today." @@ -9706,16 +9942,16 @@ msgstr "Vy" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:73 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:82 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:181 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:183 msgid "Scheduled" msgstr "Naplánováno" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:182 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:184 msgid "Custom" msgstr "uživatelský" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:480 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 msgid "" "%prog URL\n" "\n" @@ -9725,18 +9961,18 @@ msgstr "" "\n" "Kde URL je například http://google.com" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:483 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:485 msgid "Base directory into which URL is saved. Default is %default" msgstr "" "Základní adresář, do kterého bude URL uloženo. Standardně je to %default" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:486 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:488 msgid "" "Timeout in seconds to wait for a response from the server. Default: %default " "s" msgstr "Časový limit čekání na odezvu ze serveru. Standardně: %default s" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:489 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:491 msgid "" "Maximum number of levels to recurse i.e. depth of links to follow. Default " "%default" @@ -9744,7 +9980,7 @@ msgstr "" "Maximání hloubka rekurze, t.j. počet úrovní odkazů, které se mají procházet. " "Standardně %default" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:492 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 msgid "" "The maximum number of files to download. This only applies to files from tags. Default is %default" @@ -9752,13 +9988,13 @@ msgstr "" "Maximální počet stahovaných souborů. Tato hodnota se vztahuje na soubory v " " tagách. Standardně %default" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 msgid "" "Minimum interval in seconds between consecutive fetches. Default is %default " "s" msgstr "Minimální interval stahování v sekundách. Standatně %default s" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 msgid "" "The character encoding for the websites you are trying to download. The " "default is to try and guess the encoding." @@ -9766,7 +10002,7 @@ msgstr "" "Kódování znaků použité na webových stránkách, které chcete stáhnout. " "Vevýchozím nastavení se program pokusí rozeznat kódování automaticky." -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:500 msgid "" "Only links that match this regular expression will be followed. This option " "can be specified multiple times, in which case as long as a link matches any " @@ -9777,7 +10013,7 @@ msgstr "" "se shodují minimálně s jedním výrazem. Standardně budou následovány všechny " "odkazy." -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:500 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:502 msgid "" "Any link that matches this regular expression will be ignored. This option " "can be specified multiple times, in which case as long as any regexp matches " @@ -9791,7 +10027,7 @@ msgstr "" "odkazy. V případě, že jsou použity obě mořnosti, --filter-regexp i --match-" "regexp bude --filter-regexp aplikován jako první." -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:502 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:504 msgid "Do not download CSS stylesheets." msgstr "Nestahovat kaskádové styly." @@ -10617,6 +10853,9 @@ msgstr "Nestahovat kaskádové styly." #~ msgstr "" #~ "Formát, který má byt použit při ukládání jednotlivých souborů na disk" +#~ msgid "Sort tags list by popularity" +#~ msgstr "Třídit seznam tagů pode popularity" + #~ msgid " plugins" #~ msgstr " moduly" @@ -10882,6 +11121,12 @@ msgstr "Nestahovat kaskádové styly." #~ "

Pro další nápovědu nevštivte %s.kovidgoyal.net
" +#~ msgid "Device database corrupted" +#~ msgstr "Databáze zařízení je poškozená" + +#~ msgid "Sort by &popularity" +#~ msgstr "Setřídit podle &popularity" + #~ msgid "Click to browse books by their covers" #~ msgstr "Kliknutím otevřete prohlížec obálek" @@ -10903,9 +11148,47 @@ msgstr "Nestahovat kaskádové styly." #~ msgid "This profile is intended for the SONY PRS line. The 500/505/700 etc." #~ msgstr "Tento profil je určen pro řadu SONY PRS. Zařízení 500/505/700 atd." +#~ msgid "" +#~ "\n" +#~ "

The database of books on the reader is corrupted. Try the " +#~ "following:\n" +#~ "

    \n" +#~ "
  1. Unplug the reader. Wait for it to finish regenerating " +#~ "the database (i.e. wait till it is ready to be used). Plug it back in. Now " +#~ "it should work with %(app)s. If not try the next step.
  2. \n" +#~ "
  3. Quit %(app)s. Find the file media.xml in the reader's " +#~ "main memory. Delete it. Unplug the reader. Wait for it to regenerate the " +#~ "file. Re-connect it and start %(app)s.
  4. \n" +#~ "
\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ "

Databáze knih v zařízení je poškozená. Skuste nasledující " +#~ "postup:\n" +#~ "

    \n" +#~ "
  1. Odpojte zařízení. Počkejte dokud neobnoví databázi (t.j. " +#~ "dokud nebude připravené na použití). Znovu ho zapojte. Potom by mělo " +#~ "fungovať s %(app)s. Pokud ne, skuste nasledující krok.
  2. \n" +#~ "
  3. Zavřetee %(app)s. Najděte soubor media.xml v hlavní " +#~ "paměti zařízení a smažte ho. Odpojte zařízeníe. Počkajte Dokud soubor " +#~ "nezregeneruje. Zařízení znovu připojte a spusťte %(app)s.
  4. \n" +#~ "
\n" +#~ " " + #~ msgid "Choose a location for your ebook library." #~ msgstr "Zvolte umístění pro vaši elektronickou knihovnu." +#~ msgid "" +#~ "\n" +#~ "%prog [options] ISBN\n" +#~ "\n" +#~ "Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" +#~ msgstr "" +#~ "\n" +#~ "%prog [možnosti] ISBN\n" +#~ "\n" +#~ "Stáhnout obálku knihy identifikované uvedeným kódém ISBN z LibraryThing.com\n" + #~ msgid "Invalid library location" #~ msgstr "Neplatné umístění knihovny" diff --git a/src/calibre/translations/de.po b/src/calibre/translations/de.po index 7e61589c11..36dbf8bd84 100644 --- a/src/calibre/translations/de.po +++ b/src/calibre/translations/de.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-06 21:03+0000\n" -"PO-Revision-Date: 2010-06-09 22:10+0000\n" -"Last-Translator: S. Dorscht \n" +"POT-Creation-Date: 2010-07-03 01:21+0000\n" +"PO-Revision-Date: 2010-07-06 12:31+0000\n" +"Last-Translator: MS \n" "Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-06-11 03:41+0000\n" +"X-Launchpad-Export-Date: 2010-07-07 03:37+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -24,39 +24,40 @@ msgstr "Macht absolut gar nichts" #: /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:54 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:75 #: /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:418 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:347 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:466 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:396 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:101 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:428 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:329 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:332 +#: /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/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:230 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:270 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:273 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:373 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:19 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:235 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:276 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:279 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:390 #: /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 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:46 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:317 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:62 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:118 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:120 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:943 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1055 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:945 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1057 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:28 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 @@ -72,9 +73,9 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:818 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:908 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:979 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:910 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:915 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:981 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:137 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:139 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:108 @@ -102,47 +103,49 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:233 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:235 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:273 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:280 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:21 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:107 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:657 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:666 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:946 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:815 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:818 +#: /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:22 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:903 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1192 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1195 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:481 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:339 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:826 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:989 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1806 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1809 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:185 #: /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:302 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:314 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:876 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:913 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1392 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1394 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1516 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:335 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:347 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:950 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1019 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1620 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1622 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1744 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:268 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:131 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:134 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:68 -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:114 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 -#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:115 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:64 +#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:78 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:47 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:50 msgid "Unknown" @@ -178,7 +181,7 @@ msgstr "" "allen verlinkten Dateien erstellen. Dieses Plugin läuft immer, wenn sie eine " "HTML-Datei zur Bibliothek hinzufügen." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:50 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -186,7 +189,7 @@ msgstr "" "Zeichenkodierung der Eingabe-HTML-Dateien. Üblicherweise ist das: cp1252, " "latin1, iso-8859-1 und utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:57 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 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 " @@ -196,49 +199,49 @@ msgstr "" "pmlname_img oder images. Dieses Plugin wird immer dann ausgeführt, wenn Sie " "eine PML-Datei zur Bibliothek hinzufügen." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:89 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:90 msgid "Extract cover from comic files" msgstr "Umschlagbild aus Comic-Dateien extrahieren" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:116 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:127 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:139 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:149 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:170 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:180 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:190 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:200 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:210 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:220 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:231 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:242 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:254 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:275 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:286 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:296 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:306 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:117 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:128 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:140 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:150 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:160 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:171 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:181 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:191 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:201 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:211 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:221 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:232 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:243 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:255 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:276 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:287 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:297 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:307 msgid "Read metadata from %s files" msgstr "Metadaten aus %s Dateien lesen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:265 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:266 msgid "Read metadata from ebooks in RAR archives" msgstr "Metadaten von eBooks in RAR-Archiven lesen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:317 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:318 msgid "Read metadata from ebooks in ZIP archives" msgstr "Metadaten aus Büchern in ZIP-Archiven lesen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:328 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:338 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:348 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:370 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:381 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:391 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:331 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:341 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:351 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:373 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:384 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:394 msgid "Set metadata in %s files" msgstr "Geben Sie die Metadaten in %s-Dateien an" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:359 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:362 msgid "Set metadata from %s files" msgstr "Geben Sie die Metadaten von %s-Dateien an" @@ -283,7 +286,7 @@ msgstr "" "hilfreich, wenn Sie nichts über das Eingabe-Dokument wissen." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:57 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:266 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:412 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -295,70 +298,70 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Dieses Profil ist geeignet für das SONY PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:78 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:300 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:447 msgid "This profile is intended for the SONY PRS-900." msgstr "Dieses Profil ist geeignet für das SONY PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:330 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:477 msgid "This profile is intended for the Microsoft Reader." msgstr "Dieses Profil ist geeignet für den Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:97 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:341 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:488 msgid "This profile is intended for the Mobipocket books." msgstr "Dieses Profil ist geeignet für Mobipocket-Bücher." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:110 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:354 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:501 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Dieses Profil ist geeignet für den Hanlin V3 und dessen Klone." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:122 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Dieses Profil ist geeignet für den Hanlin V5 und dessen Klone." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:132 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:374 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:521 msgid "This profile is intended for the Cybook G3." msgstr "Dieses Profil ist geeignet für das Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:145 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:387 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:534 msgid "This profile is intended for the Cybook Opus." msgstr "Dieses Profil ist geeignet für den Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:157 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:398 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:545 msgid "This profile is intended for the Amazon Kindle." msgstr "Dieses Profil ist geeignet für den Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:169 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:580 msgid "This profile is intended for the Irex Illiad." msgstr "Dieses Profil ist geeignet für den Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:181 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:446 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:593 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Dieses Profil ist geeignet für den IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:460 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:607 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Dieses Profil ist geeignet für den IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:206 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:474 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:621 msgid "This profile is intended for the B&N Nook." msgstr "Dieses Profil ist geeignet für den B&N Nook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:226 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:228 msgid "Output profile" msgstr "Ausgabe-Profil" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:230 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:232 msgid "" "This profile tries to provide sane defaults and is useful if you want to " "produce a document intended to be read at a computer or on a range of " @@ -368,25 +371,25 @@ msgstr "" "hilfreich, wenn Sie ein Dokument zum Lesen an einem Computer oder auf einer " "Reihe von verschiedenen Geräten erstellen wollen." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:254 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:257 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Geeignet für das iPad und ähnliche Geräte mit einer Auflösung von 768 x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:279 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:425 msgid "This profile is intended for the Kobo Reader." msgstr "Dieses Profil ist geeignet für den Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:291 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:438 msgid "This profile is intended for the SONY PRS-300." msgstr "Dieses Profil ist geeignet für das SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:309 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:456 msgid "This profile is intended for the 5-inch JetBook." msgstr "Dieses Profil ist geeignet für das 5-Zoll JetBook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:318 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:465 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -394,7 +397,7 @@ msgstr "" "Dieses Profil ist geeignet für die SONY PRS-Reihe. PRS 500/505/700 etc. in " "horizontaler Darstellung. Vor allem für Comics hilfreich." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:416 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Dieses Profil ist geeignet für den Amazon Kindle DX." @@ -414,15 +417,19 @@ msgstr "Lokale Plugin-Anpassung" msgid "Disabled plugins" msgstr "Ausgeschaltene Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:77 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35 +msgid "Enabled plugins" +msgstr "Aktivierte Module" + +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:83 msgid "No valid plugin found in " msgstr "Kein gültiges Plugin gefunden in " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:278 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:460 msgid "Initialization of plugin %s failed with traceback:" msgstr "Starten des Plugins %s schlug fehl. Traceback:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:493 msgid "" " %prog options\n" "\n" @@ -434,19 +441,19 @@ msgstr "" " Calibre anpassen durch das Laden externer Plugins.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:439 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:499 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "" "Plugin hinzufügen durch die Angabe des Pfads zur ZIP-Datei, die das Plugin " "enthält." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:441 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" "Anpassbares Plugin entfernen. Dies hat keinen Einfluss auf festinstallierte " "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:443 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:503 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." @@ -454,15 +461,15 @@ msgstr "" "Plugin anpassen. Geben Sie den Namen des Pugins und die Anpassung durch ein " "Komma getrennt an." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:445 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:505 msgid "List all installed plugins" msgstr "Installierte Plugins auflisten" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:447 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:507 msgid "Enable the named plugin" msgstr "Gewähltes Plugin einschalten" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:449 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:509 msgid "Disable the named plugin" msgstr "Gewähltes Plugin ausschalten" @@ -470,7 +477,7 @@ msgstr "Gewähltes Plugin ausschalten" msgid "Communicate with Android phones." msgstr "Kommunikation mit Android-Telefonen." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:39 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:45 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -478,37 +485,47 @@ msgstr "" "Durch Kommata getrennte Liste von Verzeichnissen an die eBooks auf das Gerät " "gesendet werden. Das erste vorhandene wird benutzt" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:77 msgid "Communicate with S60 phones." msgstr "Kommunikation mit S60-Telefonen." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:46 -msgid "Communicate with iBooks through iTunes." -msgstr "Kommunikation mit iBooks über iTunes." +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:87 +msgid "Communicate with iTunes/iBooks." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:93 msgid "Apple device detected, launching iTunes, please wait ..." msgstr "Gerät von Apple entdeckt, starte iTunes, einen Moment bitte..." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:154 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:172 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:175 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:246 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:249 msgid "Updating device metadata listing..." msgstr "Aktualisiere die Liste der Geräte-Metadaten..." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:240 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:271 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:861 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1023 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:323 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:921 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:957 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2791 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2830 msgid "%d of %d" msgstr "%d von %d" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:277 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1028 +#: /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:2836 msgid "finished" msgstr "abgeschlossen" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:452 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:544 +msgid "Use Series as Category in iTunes/iBooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:546 +msgid "Cache covers from iTunes/iBooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:558 msgid "" "Some books not found in iTunes database.\n" "Delete using the iBooks app.\n" @@ -518,17 +535,7 @@ msgstr "" "Zum Löschen die iBooks App verwenden.\n" "Klicken Sie 'Zeige Details' für eine Liste." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:647 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:28 -msgid "settings for device drivers" -msgstr "Einstellungen der Geräte-Treiber" - -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:649 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:30 -msgid "Ordered list of formats the device will accept" -msgstr "Geordnete Liste der Formate, die das Gerät akzeptiert" - -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:762 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:886 msgid "" "Some cover art could not be converted.\n" "Click 'Show Details' for a list." @@ -536,6 +543,22 @@ msgstr "" "Einige Umschlagbilder konnten nicht konvertiert werden.\n" "Klicken Sie 'Zeige Details' für eine Liste." +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2471 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:807 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:813 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:239 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:167 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:180 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1504 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:128 +msgid "News" +msgstr "Nachrichten" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2698 +msgid "Communicate with iTunes." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/binatone/driver.py:17 msgid "Communicate with the Binatone Readme eBook reader." msgstr "Kommunikation mit dem Binatone Readme eBook Reader." @@ -558,6 +581,14 @@ msgstr "Kommunikation mit dem Cybook Gen 3 / Opus eBook Reader." msgid "Communicate with the EB600 eBook reader." msgstr "Kommunikation mit dem EB600 eBook Reader." +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:193 +msgid "Communicate with the Astak Mentor EB600" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:216 +msgid "Communicate with the PocketBook 301 reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" msgstr "Entourage Edge" @@ -570,6 +601,10 @@ msgstr "Kommunikation mit dem Entourage Edge." msgid "Communicate with the ESlick eBook reader." msgstr "Kommunikation mit dem ESlick eBook Reader." +#: /home/kovid/work/calibre/src/calibre/devices/eslick/driver.py:49 +msgid "Communicate with the Sigmatek eBook reader." +msgstr "Kommunikation mit dem Sigmatek eBook Reader." + #: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:16 #: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:30 msgid "Use an arbitrary folder as a device." @@ -584,14 +619,20 @@ msgstr "Geräte-Schnittstellen" msgid "Communicate with Hanlin V3 eBook readers." msgstr "Kommunikation mit Hanlin V3 eBook Readern." -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:90 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:87 msgid "Communicate with Hanlin V5 eBook readers." msgstr "Kommunikation mit Hanlin V5 eBook Readern." -#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:109 +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:106 msgid "Communicate with the BOOX eBook reader." msgstr "Kommunikation mit dem BOOX eBook Reader." +#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:121 +msgid "" +"Comma separated list of directories to send e-books to on the device. The " +"first one that exists will be used." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "Kommunikation mit dem Hanvon N520 eBook Reader." @@ -618,7 +659,7 @@ msgstr "Kommunikation mit dem IRex Iliad eBook Reader." #: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17 #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:29 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:38 msgid "John Schember" msgstr "John Schember" @@ -638,22 +679,56 @@ msgstr "Kommunikation mit dem Iriver Story Reader." msgid "Communicate with the JetBook eBook reader." msgstr "Kommunikation mit dem JetBook eBook Reader." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:21 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:42 msgid "Communicate with the Kindle eBook reader." msgstr "Kommunikation mit dem Kindle eBook Reader." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:147 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:169 msgid "Communicate with the Kindle 2 eBook reader." msgstr "Kommunikation mit dem Kindle 2 eBook Reader." -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:157 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:210 msgid "Communicate with the Kindle DX eBook reader." msgstr "Kommunikation mit dem Kindle DX eBook Reader." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:14 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:22 msgid "Communicate with the Kobo Reader" msgstr "Kommunikation mit dem Kobo Reader" +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:51 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:54 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:157 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:64 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:67 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:130 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:137 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:160 +msgid "Getting list of books on device..." +msgstr "Die Liste der Bücher auf dem Gerät beziehen ..." + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:218 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:258 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:244 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:262 +msgid "Removing books from device..." +msgstr "Bücher vom Gerät entfernen ..." + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:262 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:274 +msgid "Removing books from device metadata listing..." +msgstr "Bücher von der Metadaten-Liste des Geräts entfernen ..." + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:308 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:208 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:238 +msgid "Adding books to device metadata listing..." +msgstr "Bücher zur Metadaten-Liste des Geräts hinzufügen ..." + #: /home/kovid/work/calibre/src/calibre/devices/misc.py:15 msgid "Communicate with the Palm Pre" msgstr "Kommunikation mit dem Palm Pre" @@ -662,6 +737,10 @@ msgstr "Kommunikation mit dem Palm Pre" msgid "Communicate with the Booq Avant" msgstr "Kommunikation mit dem Booq Avant" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:55 +msgid "Communicate with the Sweex MM300" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "Kommunikation mit dem Nokia 770 Internet Tablet." @@ -670,6 +749,10 @@ msgstr "Kommunikation mit dem Nokia 770 Internet Tablet." msgid "Communicate with the Nokia 810 internet tablet." msgstr "Kommunikation mit dem Nokia 810 Internet Tablet." +#: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:74 +msgid "Communicate with the Nokia E52" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:20 msgid "The Nook" msgstr "Der Nook" @@ -690,7 +773,7 @@ msgstr "Kommunikation mit dem Sony PRS-500 eBook Reader." msgid "Communicate with all the Sony eBook readers." msgstr "Kommunikation mit allen Sony eBook Readern." -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:60 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:61 msgid "" "Comma separated list of metadata fields to turn into collections on the " "device. Possibilities include: " @@ -719,25 +802,25 @@ msgstr "Kommunikation mit dem Newsmy Reader." msgid "Communicate with the iPapyrus reader." msgstr "Kommunikation mit dem iPapyrus Reader." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:247 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:245 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" "Das Laufwerk %s konnte nicht gefunden werden. Versuchen Sie einen Neustart." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:427 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:425 msgid "Unable to detect the %s mount point. Try rebooting." msgstr "" "Konnte den %s Mount Point nicht finden. Versuchen Sie einen Neustart." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:492 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:490 msgid "Unable to detect the %s disk drive." msgstr "Das %s-Laufwerk konnte nicht erkannt werden." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:585 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:583 msgid "Could not find mount helper: %s." msgstr "Mount Helper konnte nicht gefunden werden: %s." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:597 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:595 msgid "" "Unable to detect the %s disk drive. Your kernel is probably exporting a " "deprecated version of SYSFS." @@ -745,100 +828,77 @@ msgstr "" "%s Festplatte konnte nicht erkannt werden. Ihr Kernel exportiert " "möglicherweise eine abgelehnte Version von SYSFS." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:605 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:603 msgid "Unable to mount main memory (Error code: %d)" msgstr "Hauptspeicher konnte nicht eingehängt werden (Fehler-Code: %d)" +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:740 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:742 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 msgid "The reader has no storage card in this slot." msgstr "Das Gerät hat keine Speicherkarte in diesem Laufwerk." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:746 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 msgid "Selected slot: %s is not supported." msgstr "Gewählter Slot: %s wird nicht unterstützt." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:779 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:773 msgid "There is insufficient free space in main memory" msgstr "Nicht genügend freier Spreicherplatz im Hauptspeicher" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:781 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:783 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:775 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:777 msgid "There is insufficient free space on the storage card" msgstr "Nicht genügend freier Speicherplatz auf der Speicherkarte" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:813 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:819 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:847 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:239 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:141 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:152 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1276 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:120 -msgid "News" -msgstr "Nachrichten" - #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:12 msgid "Configure Device" msgstr "Gerät konfigurieren" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:32 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:37 +msgid "settings for device drivers" +msgstr "Einstellungen der Geräte-Treiber" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:39 +msgid "Ordered list of formats the device will accept" +msgstr "Geordnete Liste der Formate, die das Gerät akzeptiert" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:41 msgid "Place files in sub directories if the device supports them" msgstr "" "Dateien in Unterverzeichnissen speichern soweit das Gerät dies unterstützt" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:34 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81 msgid "Read metadata from files on device" msgstr "Metadaten aus Dateien auf dem Gerät lesen" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:36 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:45 +msgid "Use author sort instead of author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:47 msgid "Template to control how books are saved" msgstr "Vorlage zur Kontrolle wie Bücher gespeichert werden" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 msgid "Extra customization" msgstr "Besondere Anpassung" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:28 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:37 msgid "Communicate with an eBook reader." msgstr "Kommunikation mit einem eBook Reader." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:44 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:53 msgid "Get device information..." msgstr "Geräte-Information beziehen ..." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:53 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:56 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:59 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:119 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:126 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:149 -msgid "Getting list of books on device..." -msgstr "Die Liste der Bücher auf dem Gerät beziehen ..." - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:174 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:176 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:188 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:190 msgid "Transferring books to device..." msgstr "Bücher ans Gerät übertragen ..." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:191 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:220 -msgid "Adding books to device metadata listing..." -msgstr "Bücher zur Metadaten-Liste des Geräts hinzufügen ..." - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:224 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:242 -msgid "Removing books from device..." -msgstr "Bücher vom Gerät entfernen ..." - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:246 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251 -msgid "Removing books from device metadata listing..." -msgstr "Bücher von der Metadaten-Liste des Geräts entfernen ..." - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:305 msgid "Sending metadata to device..." msgstr "Metadaten ans Gerät senden ..." @@ -1613,15 +1673,15 @@ msgstr "" msgid "Failed to parse date/time" msgstr "Analyse von Datum/Zeit schlug fehl" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:802 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:809 msgid "Converting input to HTML..." msgstr "Eingabe zu HTML konvertieren ..." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:829 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:836 msgid "Running transforms on ebook..." msgstr "Veränderungen am eBook durchführen ..." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:916 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:923 msgid "Creating" msgstr "Erstellen" @@ -1673,14 +1733,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:86 msgid "" "Do not use SVG for the book cover. Use this option if your EPUB is going to " -"be used ona device that does not support SVG, like the iPhone or the " +"be used on a device that does not support SVG, like the iPhone or the " "JetBook Lite. Without this option, such devices will display the cover as a " "blank page." msgstr "" -"SVG nicht für Umschlagbilder verwenden. Verwenden Sie diese Einstellung, " -"falls das EPUB auf einem Gerät verwendet wird, das SVG nicht unterstützt, " -"wie z.B. das iPhone oder das JetBook Lite. Ohne diese Einstellung zeigen " -"diese Geräte anstelle eines Umschlagbildes eine leere Seite." #: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:94 msgid "" @@ -1720,7 +1776,7 @@ msgstr "Kein Inhaltsverzeichnis am Anfang des Buches einfügen." msgid "Add Table of Contents to beginning of the book." msgstr "Inhaltsverzeichnis am Anfang des Buches hinzufügen." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:243 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:248 msgid "" "Traverse links in HTML files breadth first. Normally, they are traversed " "depth first." @@ -1728,7 +1784,7 @@ msgstr "" "Links in HTML-Dateien in der Breite durchlaufen. Normalerweise werden Links " "in die Tiefe durchlaufen." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:250 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:255 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. " @@ -1738,7 +1794,7 @@ msgstr "" "Darf nicht negativ sein. 0 gibt an, dass keine Links in der ursprünglichen " "HTML-Datei verfolgt werden. Voreinstellung ist %default." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:264 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 " @@ -1750,7 +1806,7 @@ msgstr "" "wenn Sie wissen, was Sie tun, denn es kann verschiedene nervige " "Nebenwirkungen beim Rest des Konvertierungsprozesses zur Folge haben." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:267 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:272 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." @@ -1897,7 +1953,7 @@ msgid "Path to output file" msgstr "Pfad zur Zieldatei" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:114 msgid "Verbose processing" msgstr "Ausführlicher fortfahren" @@ -2000,84 +2056,86 @@ msgstr "Nichtproportionale Schriftartfamilie einbetten" msgid "Comic" msgstr "Comic" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:372 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:389 #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:46 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:336 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:831 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 +#: /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:882 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:543 msgid "Title" msgstr "Titel" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:373 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:341 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:832 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:390 +#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:883 msgid "Author(s)" msgstr "Autor(en)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:374 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:53 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 +#: /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 "Herausgeber" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:375 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:392 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "Produzent" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:376 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393 +#: /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:185 #: /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/library/models.py:297 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1008 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:107 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1073 msgid "Comments" msgstr "Bemerkung" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:384 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:54 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:286 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1004 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:106 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1069 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:139 msgid "Tags" msgstr "Etiketten (Tags)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:386 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:302 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1013 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:105 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:87 msgid "Series" msgstr "Reihe" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:404 msgid "Language" msgstr "Sprache" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:389 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:996 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 msgid "Timestamp" msgstr "Zeitstempel" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:51 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:408 +#: /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 "Veröffentlicht" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:410 msgid "Rights" msgstr "Rechte" @@ -2085,7 +2143,7 @@ msgstr "Rechte" msgid "EDITORIAL REVIEW" msgstr "BUCHKRITIK" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:22 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:41 msgid "" "Extract common e-book formats from archives (zip/rar) files. Also try to " "autodetect if they are actually cbz/cbr files." @@ -2212,35 +2270,43 @@ msgstr "Umschlagbild gespeichert unter" msgid "No cover found" msgstr "Kein Umschlagbild gefunden" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:33 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:15 +msgid "Cover download" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:42 +msgid "Downloads metadata from Douban.com" +msgstr "Herunterladen der Metadaten von Douban.com" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:34 msgid "Metadata download" msgstr "Metadaten laden" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 msgid "ratings" msgstr "Bewertungen" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 msgid "tags" msgstr "Etiketten" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:112 msgid "description/reviews" msgstr "Beschreibung/Bewertungen" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:113 msgid "Download %s from %s" msgstr "Lade %s von %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:136 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:139 msgid "Downloads metadata from Google Books" msgstr "Lädt Metadaten von Google Books" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:152 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:156 msgid "Downloads metadata from isbndb.com" msgstr "Lädt Metadaten von isbndb.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:180 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:184 msgid "" "To use isbndb.com you must sign up for a %sfree account%s and enter your " "access key below." @@ -2248,11 +2314,15 @@ msgstr "" "Zur Verwendung von isbndb.com müssen Sie einen %skostenlosen Account%s " "erstellen und Ihren Zugangsschlüssel unten eingeben." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:188 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:194 msgid "Downloads social metadata from amazon.com" msgstr "Lädt soziale Metadaten von amazon.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:213 +msgid "Downloads series/tags/rating information from librarything.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:95 msgid "" "\n" "%prog [options] key\n" @@ -2277,27 +2347,27 @@ msgstr "" "bei isbndb.com erstellt werden kann.\n" "\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:105 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:106 msgid "The ISBN ID of the book you want metadata for." msgstr "Die ISBN des Buches, für das Sie Metadaten abrufen möchten." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 msgid "The author whose book to search for." msgstr "Der Autor des gesuchten Buches." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 msgid "The title of the book to search for." msgstr "Der Titel des gesuchten Buches." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 msgid "The publisher of the book to search for." msgstr "Der Herausgeber des gesuchten Buches." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:53 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:68 msgid "LibraryThing.com timed out. Try again later." msgstr "LibraryThing.com antwortet nicht. Versuchen Sie es später." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:60 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:75 msgid "" "Could not fetch cover as server is experiencing high load. Please try again " "later." @@ -2305,29 +2375,25 @@ msgstr "" "Konnte aufgrund zu hoher Serverlast kein Umschlagbild abrufen. Bitte " "versuchen Sie es später wieder." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:61 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:76 msgid " not found." msgstr " nicht gefunden." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:64 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:79 msgid "LibraryThing.com server error. Try again later." msgstr "LibraryThing.com Server Fehler. Versuchen Sie es später." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:71 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:86 msgid "" "\n" "%prog [options] ISBN\n" "\n" -"Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" +"Fetch a cover image/social metadata for the book identified by ISBN from " +"LibraryThing.com\n" msgstr "" -"\n" -"%prog [options] ISBN\n" -"\n" -"Umschlagbild des Buches mit der angegebenen ISBN von LibraryThing.com " -"abrufen\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1220 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1371 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1226 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1398 msgid "Cover" msgstr "Umschlagbild" @@ -2368,70 +2434,70 @@ msgstr "Alle Artikel" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Dies ist ein Amazon Topaz-Buch. Es kann nicht verarbeitet werden." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1372 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 msgid "Title Page" msgstr "Titelseite" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1373 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 #: /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 msgid "Table of Contents" msgstr "Inhaltsverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1374 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Index" msgstr "Index" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1375 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Glossary" msgstr "Glossar" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1376 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 msgid "Acknowledgements" msgstr "Danksagung" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1377 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Bibliography" msgstr "Literaturverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1378 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Colophon" msgstr "Schlussschrift" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1379 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Copyright" msgstr "Copyright" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1380 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Dedication" msgstr "Widmung" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1381 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Epigraph" msgstr "Epigraph" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1382 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Foreword" msgstr "Vorwort" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1383 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "List of Illustrations" msgstr "Abbildungsverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1384 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "List of Tables" msgstr "Tabellenverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1385 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Notes" msgstr "Anmerkungen" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1386 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Preface" msgstr "Vorwort" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1387 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "Main Text" msgstr "Haupttext" @@ -2660,6 +2726,8 @@ msgstr "" "Zeigt Informationen über das PDF an.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:29 msgid "Author" msgstr "Autor" @@ -2929,8 +2997,8 @@ msgid "Use Roman numerals for series number" msgstr "Benutze römische Ziffern für Reihennummerierung" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47 -msgid "Sort tags list by popularity" -msgstr "Liste der Etiketten nach Beliebtheit sortieren" +msgid "Sort tags list by name, popularity, or rating" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:49 msgid "Number of covers to show in the cover browsing mode" @@ -3013,62 +3081,477 @@ msgstr "" msgid "tag browser categories not to display" msgstr "Etiketten-Browser Kategorien nicht anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:103 +msgid "The layout of the user interface" +msgstr "Das Aussehen der Benutzeroberfläche" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:105 +msgid "Show the average rating per item indication in the tag browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:107 +msgid "Disable UI animations" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:476 msgid "Copied" msgstr "Kopiert" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:189 msgid "Copy" msgstr "Kopieren" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:189 msgid "Copy to Clipboard" msgstr "In die Zwischenablage kopieren" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:399 msgid "Choose Files" msgstr "Dateien wählen" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:245 +msgid "Use library only" +msgstr "Nur Bibliothek verwenden" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:246 +msgid "User annotations generated from main library only" +msgstr "Nur aus der Hauptbibliothek erstellte Benutzeranmerkungen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:671 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:708 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:729 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1060 +msgid "No books selected" +msgstr "Keine Bücher ausgewählt" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:76 +msgid "No books selected to fetch annotations from" +msgstr "Es sind keine Bücher zum Abrufen von Anmerkungen ausgewählt" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:101 +msgid "Merging user annotations into database" +msgstr "Füge Benutzeranmerkungen zur Datenbank hinzu" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:129 +msgid "%s
Last Page Read: %d (%d%%)" +msgstr "%s
Letzte gelesene Seite: %d (%d%%)" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:135 +msgid "%s
Last Page Read: Location %d (%d%%)" +msgstr "%s
Letzte gelesene Seite: Position %d (%d%%)" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:154 +msgid "Location %d • %s
%s
" +msgstr "Position %d • %s
%s
" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:163 +msgid "Page %d • %s
" +msgstr "Seite %d • %s
" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:168 +msgid "Location %d • %s
" +msgstr "Position %d • %s
" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:291 +msgid "How many empty books?" +msgstr "Wie viele leere Bücher?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:292 +msgid "How many empty books should be added?" +msgstr "Wie viele leere Bücher sollen hinzugefügt werden?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:391 +msgid "Uploading books to device." +msgstr "Lade Bücher auf das Gerät." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137 +msgid "Books" +msgstr "Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:352 +msgid "EPUB Books" +msgstr "EPUB Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:353 +msgid "LRF Books" +msgstr "LRF Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:354 +msgid "HTML Books" +msgstr "HTML Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:355 +msgid "LIT Books" +msgstr "LIT Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:356 +msgid "MOBI Books" +msgstr "MOBI Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:357 +msgid "Topaz books" +msgstr "Topaz Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:358 +msgid "Text books" +msgstr "Text Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:359 +msgid "PDF Books" +msgstr "PDF Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:360 +msgid "Comics" +msgstr "Comics" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:361 +msgid "Archives" +msgstr "Archive" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:365 +msgid "Supported books" +msgstr "Unterstützte Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:400 +msgid "Merged some books" +msgstr "Einige Bücher zusammenfügen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:401 +msgid "" +"Some duplicates were found and merged into the following existing books:" +msgstr "" +"Es wurden einige Duplikate gefunden und mit den folgenden, schon vorhandenen " +"Büchern zusammengefügt:" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:410 +msgid "Failed to read metadata" +msgstr "Lesen der Metadaten schlug fehl" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:411 +msgid "Failed to read metadata from the following" +msgstr "Lesen der Metadaten schlug fehl bei folgenden" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:430 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:435 +msgid "Add to library" +msgstr "Zur Bibliothek hinzufügen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:430 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1229 +msgid "No book selected" +msgstr "Kein Buch ausgewählt" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:435 +msgid "No book files found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:457 +msgid "Cannot delete" +msgstr "Löschen nicht möglich" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:470 +msgid "Choose formats to be deleted" +msgstr "Zu löschende Formate auswählen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:488 +msgid "Choose formats not to be deleted" +msgstr "Nicht zu löschende Formate auswählen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:508 +msgid "Cannot delete books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:509 +msgid "No device is connected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:519 +msgid "Main memory" +msgstr "Hauptspeicher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:453 +msgid "Storage Card A" +msgstr "Speicherkarte A" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 +msgid "Storage Card B" +msgstr "Speicherkarte B" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:526 +msgid "No books to delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:527 +msgid "None of the selected books are on the device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:601 +msgid "Deleting books from device." +msgstr "Lösche Bücher vom Gerät." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:565 +msgid "" +"The selected books will be permanently deleted and the files removed " +"from your computer. Are you sure?" +msgstr "" +"Die gewählten Bücher werden dauerhaft gelöscht und die Dateien vom " +"Computer entfernt. Sin Sie sicher?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:586 +msgid "" +"The selected books will be permanently deleted from your device. Are " +"you sure?" +msgstr "" +"Die gewählten Bücher werden von ihrem Gerät dauerhaft gelöscht. Sind " +"Sie sicher?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:611 +msgid "Cannot download metadata" +msgstr "Konnte Metadaten nicht laden" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:627 +msgid "social metadata" +msgstr "soziale Metadaten" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:629 +msgid "covers" +msgstr "Umschlagbilder" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:629 +msgid "metadata" +msgstr "Metadaten" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:631 +msgid "Downloading %s for %d book(s)" +msgstr "Lade %s für %d Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:655 +msgid "Failed to download some metadata" +msgstr "Das Laden der Metadaten schlug teilweise fehl" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:656 +msgid "Failed to download metadata for the following:" +msgstr "Das Laden der Metadaten schlug für folgende Bücher fehl:" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:659 +msgid "Failed to download metadata:" +msgstr "Laden der Metadaten schlug fehl:" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:660 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:637 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:949 +#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 +msgid "Error" +msgstr "Fehler" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:707 +msgid "Cannot edit metadata" +msgstr "Kann Metadaten nicht bearbeiten" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:728 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:731 +msgid "Cannot merge books" +msgstr "Konnte Bücher nicht zusammenfügen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:732 +msgid "At least two books must be selected for merging" +msgstr "Es müssen wenigstens zwei Bücher zum Zusammenfügen ausgewählt werden" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:736 +msgid "" +"All book formats and metadata from the selected books will be added to the " +"first selected book.

The second and subsequently selected " +"books will not be deleted or changed.

Please confirm you want to " +"proceed." +msgstr "" +"Alle Buchformate und Metadaten des gewählten Buches werden zum zuerst " +"gewählten Buch hinzugefügt.

Das zweite und danach gewählte " +"Bücher werden nicht gelöscht oder verändert.

Zum Fortfahren bitte " +"bestätigen." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:747 +msgid "" +"All book formats and metadata from the selected books will be merged into " +"the first selected book.

After merger the second and " +"subsequently selected books will be deleted.

All book formats " +"of the first selected book will be kept and any duplicate formats in the " +"second and subsequently selected books will be permanently deleted " +"from your computer.

Are you sure you want to proceed?" +msgstr "" +"Alle Buchformate und Metadaten des gewählten Buches werden zum zuerst " +"gewählten Buch hinzugefügt.

Nach dem Zusammenfügen werden das " +"zweite und danach gewählte Bücher gelöscht.

Alle Buchformate " +"des zuerst gewählten Buches bleiben bestehen und alle doppelten Formate im " +"zweiten und den danach gewählten Bücher werden unwiderruflich von Ihrem " +"Rechner gelöscht.

Wollen Sie wirklich fortfahren?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:759 +msgid "" +"You are about to merge more than 5 books. Are you sure you want to " +"proceed?" +msgstr "" +"Sie versuchen mehr als 5 Bücher zusammenzufügen. Wollen Sie damit " +"wirklich fortfahren?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:876 +msgid "Cannot save to disk" +msgstr "Speichern auf Festplatte nicht möglich" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:879 +msgid "Choose destination directory" +msgstr "Zielverzeichnis auswählen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:912 +msgid "Error while saving" +msgstr "Fehler während des Speicherns" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:913 +msgid "There was an error while saving." +msgstr "Es gab einen Fehler während des Speicherns." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:921 +msgid "Could not save some books" +msgstr "Konnte einige Bücher nicht speichern" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:922 +msgid "Click the show details button to see which ones." +msgstr "" +"Klicken Sie auf die Schaltfläche Details zeigen, um zu sehen, welche es gibt." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:943 +msgid "No books selected to generate catalog for" +msgstr "Keine Bücher ausgewählt, für die ein Katalog erstellt werden soll" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:960 +msgid "Generating %s catalog..." +msgstr "Erstelle %s Katalog..." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:965 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:264 +msgid "No books found" +msgstr "Keine Bücher gefunden" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:966 +msgid "" +"No books to catalog\n" +"Check exclude tags" +msgstr "Keine Bücher im Katalog. Bitte ausgeschlossene Etiketten prüfen." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:976 +msgid "Catalog generated." +msgstr "Katalog erstellt." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:979 +msgid "Export Catalog Directory" +msgstr "Katalog-Verzeichnis exportieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:980 +msgid "Select destination for %s.%s" +msgstr "Wählen Sie das Ziel für %s.%s" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:996 +msgid "Fetching news from " +msgstr "Rufe Nachrichten ab von " + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1010 +msgid " fetched." +msgstr " abgerufen." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1059 +msgid "Cannot convert" +msgstr "Konvertierung nicht möglich" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1088 +msgid "Starting conversion of %d book(s)" +msgstr "Starte Konvertierung von %d Büchern" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1265 +msgid "Cannot view" +msgstr "Ansehen nicht möglich" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1210 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:76 +msgid "Choose the format to view" +msgstr "Format zur Vorschau wählen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1218 +msgid "Multiple Books Selected" +msgstr "Mehrere Bücher ausgewählt" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1219 +msgid "" +"You are attempting to open %d books. Opening too many books at once can be " +"slow and have a negative effect on the responsiveness of your computer. Once " +"started the process cannot be stopped until complete. Do you wish to " +"continue?" +msgstr "" +"Sie versuchen %d Bücher zu öffnen. Das gleichzeitige Öffnen zu vieler Bücher " +"kann lange dauern und einen negative Wirkung auf die Reaktionszeit Ihres " +"Rechners haben. Einmal gestartet kann der Prozess nicht beendet werden, " +"bevor er abgeschlossen ist. Möchten Sie fortfahren?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1228 +msgid "Cannot open folder" +msgstr "Konnte Verzeichnis nicht öffnen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1266 +msgid "%s has no available formats." +msgstr "%s hat keine verfügbaren Formate." + #: /home/kovid/work/calibre/src/calibre/gui2/add.py:54 msgid "Searching in" msgstr "Suche in" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:232 msgid "Adding..." msgstr "Füge hinzu..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 msgid "Searching in all sub-directories..." msgstr "Suche in allen Unterverzeichnissen..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:258 msgid "Path error" msgstr "Verzeichnis Fehler" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:259 msgid "The specified directory could not be processed." msgstr "Das angegebene Verzeichnis konnte nicht bearbeitet werden." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:260 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:599 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 msgid "No books" msgstr "Keine Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1938 -msgid "No books found" -msgstr "Keine Bücher gefunden" - -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:330 msgid "Added" msgstr "Hinzugefügt" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:343 msgid "Adding failed" msgstr "Hinzufügen schlug fehl" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:344 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." @@ -3077,11 +3560,11 @@ msgstr "" "Versuchen Sie Calibre neu zu starten und fügen Sie die Bücher in kleineren " "Mengen hinzu, bis Sie das verantwortliche Buch finden." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:356 msgid "Duplicates found!" msgstr "Duplikate gefunden!" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 msgid "" "Books with the same title as the following already exist in the database. " "Add them anyway?" @@ -3089,15 +3572,15 @@ msgstr "" "Es gibt schon Bücher mit dem selben Titel wie die folgenden in der " "Datenbank. Trotzdem hinzufügen?" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:360 msgid "Adding duplicates..." msgstr "Füge Duplikate hinzu..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:427 msgid "Saving..." msgstr "Speichere..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:480 msgid "Saved" msgstr "Gespeichert" @@ -3166,6 +3649,14 @@ msgid "" "

Make sure that the folder you chose for your calibre library is " "not under the root folder you choose.

" msgstr "" +"

Calibre kann Ihren Rechner automatisch nach vorhandenen Büchern " +"durchsuchen. Diese Bücher werden dann in die Calibre Bibliothek " +"kopiert. Dieser Assistent hilft bei der Anpassung der Suche und des " +"Imports Ihrer bestehenden Büchersammlung.

\n" +"

Wählen Sie einen Stammordner. Bücher werden nur in diesem Ordner und " +"allen Unterordnern gesucht.

\n" +"

Stellen Sie sicher, dass der Ordner, den Sie für Ihre Calibre Bibliothek " +"auswählen, sich nicht unter dem gewählten Stammordner befindet.

" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 msgid "&Root folder:" @@ -3185,25 +3676,25 @@ msgstr "" #: /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:52 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:539 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:553 +#: /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/config/config_ui.py:554 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:578 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 -#: /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: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:408 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:568 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:589 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /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:385 +#: /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:400 +#: /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 #: /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 @@ -3214,17 +3705,17 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 #: /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:74 -#: /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: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/main_ui.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:401 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:407 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:410 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:412 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:272 #: /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 @@ -3250,6 +3741,59 @@ msgstr "" "&Mehrere Bücher pro Verzeichnis, wobei jede Buch-Datei ein anderes Buch " "darstellt" +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1059 +msgid "Path" +msgstr "Pfad" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:117 +#: /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:220 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:96 +msgid "Formats" +msgstr "Formate" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1062 +msgid "Collections" +msgstr "Sammlungen" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 +msgid "Click to open" +msgstr "Zum Öffnen klicken" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1068 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1072 +#: /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:458 +msgid "None" +msgstr "Keine" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:310 +msgid "Click to open Book Details window" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:16 msgid "CSV/XML Options" msgstr "CSV/XML Einstellungen" @@ -3295,7 +3839,7 @@ msgstr "Ausgabe" #: /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/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:167 #: /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 @@ -3305,11 +3849,11 @@ msgstr "Ausgabe" #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:45 +#: /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:49 #: /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:74 +#: /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/search_item_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 @@ -3327,8 +3871,8 @@ msgstr "eBook Einstellungen" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:222 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1239 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1257 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1467 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1485 msgid "Catalog" msgstr "Katalog" @@ -3803,77 +4347,77 @@ msgstr "" "Metadaten eingeben. Die Ausgabe-Datei wird möglichst viel dieser Metadaten " "enthalten." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:99 msgid "Choose cover for " msgstr "Wählen Sie das Umschlagbild für " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:106 msgid "Cannot read" msgstr "Lesen nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:107 msgid "You do not have permission to read the file: " msgstr "Sie haben nicht die nötigen Rechte, um diese Datei zu lesen: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:115 msgid "Error reading file" msgstr "Fehler beim Lesen der Datei" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "

There was an error reading from file:
" msgstr "

Es trat ein Fehler beim Lesen dieser Datei auf:
" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:124 msgid " is not a valid picture" msgstr " ist kein gültiges Bild" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "Book Cover" msgstr "Umschlagbild" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 -msgid "Use cover from &source file" -msgstr "Um&schlagbild der Quelldatei verwenden" - #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "Change &cover image:" msgstr "&Umschlagbild ändern:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:170 -#: /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:404 msgid "Browse for an image to use as the cover of this book." msgstr "Nach Umschlagbild durchsuchen..." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +msgid "Use cover from &source file" +msgstr "Um&schlagbild der Quelldatei verwenden" + +#: /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 msgid "&Title: " msgstr "&Titel: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 msgid "Change the title of this book" msgstr "Titel dieses Buches ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 #: /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:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 msgid "&Author(s): " msgstr "&Autor(en): " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 msgid "Author So&rt:" msgstr "So&rtierung nach Autor:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -3881,20 +4425,20 @@ msgstr "" "Autor dieses Buches ändern. Mehrere Autoren sollten durch Kommata getrennt " "werden" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 #: /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:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 msgid "&Publisher: " msgstr "&Herausgeber: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Ta&gs: " msgstr "&Etiketten: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 #: /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:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -3903,23 +4447,23 @@ msgstr "" "Büchern.

Sie können für Etiketten durch Kommata getrennte Wörter " "oder Sätze verwenden." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 #: /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:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 msgid "&Series:" msgstr "&Reihen:" -#: /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/convert/metadata_ui.py:183 #: /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:385 -#: /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:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "List of known series. You can add new series." msgstr "Liste der bekannten Reihen. Sie können neue Reihen hinzufügen." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "Book " msgstr "Buch " @@ -4004,12 +4548,12 @@ msgid "PDB Input" msgstr "PDB-Eingabe" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:32 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47 msgid "Treat each &line as a paragraph" msgstr "Jede Zei&le als Absatz behandeln" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:33 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:48 msgid "Assume print formatting" msgstr "Druck-Formatierung übernehmen" @@ -4053,11 +4597,6 @@ msgstr "Seitenverhältnis des Umschl&agbildes beibehalten" msgid "RB Output" msgstr "RB-Ausgabe" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2183 -msgid "Choose the format to view" -msgstr "Format zur Vorschau wählen" - #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:82 msgid "Cannot build regex using the GUI builder without a book." msgstr "" @@ -4145,12 +4684,12 @@ msgid "Footer regular expression:" msgstr "Regulärer Ausdruck Fußzeile:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:77 msgid "Invalid regular expression" msgstr "Ungültiger regulärer Ausdruck" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:78 msgid "Invalid regular expression: %s" msgstr "Ungültiger regulärer Ausdruck: %s" @@ -4238,11 +4777,11 @@ msgstr "&Filter für Inhaltsverzeichnis:" msgid "TXT Input" msgstr "TXT Input" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:49 msgid "Process using markdown" msgstr "Prozess verwendet Markdown" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:50 msgid "" "

Markdown is a simple markup language for text files, that allows for " "advanced formatting. To learn more visit Markdown." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 msgid "Do not insert Table of Contents into output text when using markdown" msgstr "" "Kein Inhaltsverzeichnis in den Ausgabetext bei der Verwendung von Markdown " "einfügen." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:52 msgid "Preserve &spaces" msgstr "Leer&zeichen beibehalten" @@ -4374,11 +4913,20 @@ msgstr "" "von XPath finden Sie im XPath Tutorial." +#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:119 +msgid "Cover browser could not be loaded" +msgstr "Cover-Browser konnte nicht geladen werden" + +#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:171 +msgid "Browse by covers" +msgstr "Umschlagbilder durchsuchen" + #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:52 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:253 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:205 @@ -4399,236 +4947,283 @@ msgstr "Ja" msgid "No" msgstr "Nein" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:115 msgid "star(s)" msgstr "Stern(e)" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:116 msgid "Unrated" msgstr "Unbewertet" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:249 +msgid " index:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:432 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +msgid "Automatically number books in this series" +msgstr "Bücher in dieser Reihe automatisch nummerieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:475 msgid "Remove all tags" msgstr "Alle Etiketten entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:496 msgid "tags to add" msgstr "Etiketten hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:501 msgid "tags to remove" msgstr "Etiketten entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:48 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:135 msgid "No details available." msgstr "Keine weiteren Informationen verfügbar." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:154 msgid "Device no longer connected." msgstr "Gerät ist nicht mehr verbunden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:270 msgid "Get device information" msgstr "Geräteinformationen erstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:281 msgid "Get list of books on device" msgstr "Liste der Bücher auf dem Gerät erstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:291 msgid "Get annotations from device" msgstr "Anmerkungen vom Gerät laden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:300 msgid "Send metadata to device" msgstr "Metadaten zum Gerät senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:305 +msgid "Send collections to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:329 msgid "Upload %d books to device" msgstr "%d Bücher auf das Gerät laden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:344 msgid "Delete books from device" msgstr "Bücher vom Gerät löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:361 msgid "Download books from device" msgstr "Bücher vom Gerät herunterladen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:339 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:371 msgid "View book on device" msgstr "Buch auf dem Gerät ansehen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 msgid "Set default send to device action" msgstr "Geben Sie die voreingestellte Übertragungsart an" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:386 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:388 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 msgid "Email to" msgstr "eMail an" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 +msgid " and delete from library" +msgstr " und aus der Bibliothek löschen" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:433 msgid "Send to main memory" msgstr "An Hauptspeicher senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:435 msgid "Send to storage card A" msgstr "An Speicherkarte A senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 msgid "Send to storage card B" msgstr "An Speicherkarte B senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:410 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:451 msgid "Main Memory" msgstr "Hauptspeicher" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:412 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:421 -msgid "Storage Card A" -msgstr "Speicherkarte A" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:414 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:423 -msgid "Storage Card B" -msgstr "Speicherkarte B" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 msgid "Send and delete from library" msgstr "Übertragen und aus der Bibliothek löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:438 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:470 msgid "Send specific format" msgstr "Angegebenes Format übertragen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:509 msgid "Connect to folder" msgstr "Mit Verzeichnis verbinden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:482 -msgid "Disconnect from folder" -msgstr "Von Verzeichnis trennen" +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:515 +msgid "Connect to iTunes" +msgstr "Mit iTunes verbinden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:520 +msgid "Eject device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:528 msgid "Fetch annotations (experimental)" msgstr "Anmerkungen abrufen (experimentell)" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:638 +msgid "Error communicating with device" +msgstr "Fehler bei der Kommunikation mit dem Gerät" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:659 +msgid "Select folder to open as device" +msgstr "Verzeichnis wählen, das als Gerät geöffnet werden soll" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:704 +msgid "Failed" +msgstr "Fehlgeschlagen" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:710 +msgid "Error talking to device" +msgstr "Fehler in der Kommunikation zum Gerät" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:711 +msgid "" +"There was a temporary error talking to the device. Please unplug and " +"reconnect the device and or reboot." +msgstr "" +"Es trat ein Fehler in der Kommunikation mit dem Gerät auf. Bitte entfernen " +"und schließen Sie das Gerät wieder an und - oder starten Sie neu." + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:753 +msgid "Device: " +msgstr "Gerät: " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:755 +msgid " detected." +msgstr " gefunden." + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:778 +msgid "Connected " +msgstr "Angeschlossen: " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:846 msgid "selected to send" msgstr "zum Übertragen ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 msgid "Choose format to send to device" msgstr "Format wählen, das ans Gerät geschickt wird" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 msgid "No device" msgstr "Kein Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:614 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "Cannot send: No device is connected" msgstr "Übertragung schlug fehl: Kein Gerät verbunden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:617 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:621 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:864 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:868 msgid "No card" msgstr "Keine Speicherkarte" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:622 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "Cannot send: Device has no storage card" msgstr "Übertragung schlug fehl: Keine Speicherkarte im Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:664 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:910 msgid "E-book:" msgstr "eBook:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:667 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:913 msgid "Attached, you will find the e-book" msgstr "Im Anhang finden Sie das eBook" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:668 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:914 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:181 msgid "by" msgstr "von" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 msgid "in the %s format." msgstr "im %s Format." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:682 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "Sending email to" msgstr "Sende eMail an" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:712 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:965 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1057 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1118 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1236 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 msgid "No suitable formats" msgstr "Keine geeigneten Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:959 msgid "Auto convert the following books before sending via email?" msgstr "" "Die folgenden Bücher vor dem Versenden per eMail automatisch konvertieren?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" "Konnte die folgenden Bücher nicht versenden, da geeignete Formate fehlen:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:738 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:984 msgid "Failed to email books" msgstr "Senden der Bücher schlug fehl" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:739 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Failed to email the following books:" msgstr "Senden der folgenden Bücher schlug fehl:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:989 msgid "Sent by email:" msgstr "Per eMail versendet:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:770 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1016 msgid "News:" msgstr "Nachrichten:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1017 msgid "Attached is the" msgstr "Im Anhang ist" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:782 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1028 msgid "Sent news to" msgstr "Nachrichten senden an" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1058 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1237 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Die folgenden Bücher vor dem Laden auf das Gerät automatisch konvertieren?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1087 msgid "Sending catalogs to device." msgstr "Sende Kataloge ans Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:902 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1150 msgid "Sending news to device." msgstr "Sende Nachrichten an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:957 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 msgid "Sending books to device." msgstr "Sende Bücher an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1244 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." @@ -4637,49 +5232,33 @@ msgstr "" "fehlen. Konvertieren Sie die Bücher zuerst in ein von Ihrem Gerät " "unterstütztes Format." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1305 msgid "No space on device" msgstr "Gerätespeicher voll" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1047 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1306 msgid "" "

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

Es können keine Bücher mehr auf das Gerät geladen werden, da der " "Gerätespeicher voll ist " -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 msgid "Select available formats and their order for this device" msgstr "Verfügbare Formate und deren Reihenfolge für dieses Gerät wählen" -#: /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:82 msgid "Use sub directories" msgstr "Unterverzeichnisse verwenden" -#: /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:83 +msgid "Use author sort for author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 msgid "Save &template:" msgstr "Vor&lage speichern:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:293 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:994 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:102 -msgid "Path" -msgstr "Pfad" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:117 -#: /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:219 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:292 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:103 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:91 -msgid "Formats" -msgstr "Formate" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68 msgid "Fit &cover to view" msgstr "Umschlagbild an Ansicht anpassen" @@ -4752,15 +5331,15 @@ msgstr "&Profil:" msgid "Edit Comments" msgstr "Kommentare verändern" -#: /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 "%(plugin_type)s %(plugins)s" msgstr "%(plugin_type)s %(plugins)s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:175 msgid "plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:184 msgid "" "\n" "Customization: " @@ -4768,23 +5347,23 @@ msgstr "" "\n" "Anpassung: " -#: /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 "Konvertierung" -#: /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 "General" msgstr "Allgemein" -#: /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 "Interface" msgstr "Bedienungsoberfläche" -#: /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 "Add/Save" msgstr "Hinzufügen/Speichern" -#: /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" @@ -4792,11 +5371,11 @@ msgstr "" "eMail\n" "Versand" -#: /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 "Advanced" msgstr "Erweitert" -#: /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 "" "Content\n" "Server" @@ -4804,23 +5383,23 @@ msgstr "" "Content\n" "Server" -#: /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 "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 msgid "Auto send" msgstr "Automatisches Übertragen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 msgid "Email" msgstr "eMail" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:225 msgid "Formats to email. The first matching format will be sent." msgstr "Formate für eMail. Das erste passende Format wird versendet." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:226 msgid "" "If checked, downloaded news will be automatically mailed
to this email " "address (provided it is in one of the listed formats)." @@ -4829,156 +5408,160 @@ msgstr "" "Adresse versendet (vorausgesetzt sie entspricht einem der angegebenen " "Formate)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:299 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:300 msgid "new email address" msgstr "Neue eMail-Adresse" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 +msgid "Wide" +msgstr "Breit" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 +msgid "Narrow" +msgstr "Schmal" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:502 msgid "System port selected" msgstr "System-Port ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:503 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 "" +"Der Wert %d, den Sie für den Content Server Port gewählt haben, ist " +"ein System Port. Ihr Betriebssystem erlaubt es möglicherweise nicht, " +"dass der Server auf diesem Port läuft. Sie sind auf der sicheren Seite, wenn " +"Sie eine Port Zahl größer als 1024 wählen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:933 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:190 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1650 -#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 -msgid "Error" -msgstr "Fehler" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:523 msgid "Failed to install command line tools." msgstr "Die Installation der Befehlszeilen-Tools schlug fehl." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:514 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:526 msgid "Command line tools installed" msgstr "Kommandozeilen-Tools installiert" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:527 msgid "Command line tools installed in" msgstr "Kommandozeilen-Tools installiert in" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:528 msgid "" "If you move calibre.app, you have to re-install the command line tools." msgstr "" "Wenn Sie Calibre.app verschieben, müssen Sie die Befehlszeilen-Tools neu " "installieren." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:567 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:579 msgid "No valid plugin path" msgstr "Kein gültiger Plugin-Pfad" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:568 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:580 msgid "%s is not a valid plugin path" msgstr "%s ist kein gültiger Plugin-Pfad" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:583 msgid "Choose plugin" msgstr "Plugin wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:595 msgid "Plugin cannot be disabled" msgstr "Plugin kann nicht ausgeschaltet werden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:584 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:596 msgid "The plugin: %s cannot be disabled" msgstr "Das Plugin: %s kann nicht ausgeschaltet werden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:605 msgid "Plugin not customizable" msgstr "Plugin nicht anpassbar" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:606 msgid "Plugin: %s does not need customization" msgstr "Plugin: %s bedarf keines Anpassens" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:614 msgid "Customize" msgstr "Anpassen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:652 msgid "Cannot remove builtin plugin" msgstr "Kann festinstalliertes Plugin nicht entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:653 msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." msgstr "" " kann nicht entfernt werden, da es ein festinstalliertes Plugin ist. " "Versuchen Sie, es auszuschalten." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:672 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:684 msgid "You must select a column to delete it" msgstr "Sie müssen eine Spalte auswählen, um sie zu löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:677 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:689 msgid "The selected column is not a custom column" msgstr "Die gewählte Spalte ist keine benutzerdefinierte Spalte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:678 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:690 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:48 msgid "Are you sure?" msgstr "Sicher?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:691 msgid "Do you really want to delete column %s and all its data?" msgstr "Wollen Sie wirklich die Spalte %s und ihre gesamten Daten löschen?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:746 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:758 msgid "Error log:" msgstr "Fehler Log:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:765 msgid "Access log:" msgstr "Zugriffs-Protokolldatei:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:781 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:761 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:793 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:340 msgid "Failed to start content server" msgstr "Content Server konnte nicht gestartet werden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:805 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:817 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:587 msgid "Select location for books" msgstr "Speicherort für Bücher wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:812 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:824 msgid "Invalid size" msgstr "Ungültige Größe" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:813 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:825 msgid "The size %s is invalid. must be of the form widthxheight" msgstr "" "Die Größe %s ist ungültig. Sie muss der Form BreitexHöhe entsprechen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:868 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:884 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:889 msgid "Invalid database location" msgstr "Ortsangabe der Datenbank ungültig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:869 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:885 msgid "Invalid database location " msgstr "Ortsangabe der Datenbank ungültig " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:886 msgid "
Must be a directory." msgstr "
Muss ein Verzeichnis sein." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:890 msgid "Invalid database location.
Cannot write to " msgstr "Ortsangabe der Datenbank ungültig.
Speichern nicht möglich " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:895 msgid "Must restart" msgstr "Neustart erforderlich" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:896 msgid "" "The changes you made require that Calibre be restarted. Please restart as " "soon as practical." @@ -4986,19 +5569,19 @@ msgstr "" "Die gewählten Änderungen erfordern einen Neustart von Calibre. Bitte starten " "Sie baldmöglichst neu." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:914 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:930 msgid "Checking database integrity" msgstr "Überprüfe Vollständigkeit der Datenbank" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:934 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:950 msgid "Failed to check database integrity" msgstr "Überprüfung der Vollständigkeit der Datenbank schlug fehl" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:939 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:955 msgid "Some inconsistencies found" msgstr "Einige Inkonsistenzen gefunden." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:956 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 " @@ -5010,11 +5593,11 @@ msgstr "" "Sie sollten diese manuell überprüfen. Dies kann passieren, wenn Sie die " "Dateien direkt im Bibliotheksverzeichnis verändern." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:113 msgid "TabWidget" msgstr "TabWidget" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:114 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 " @@ -5024,11 +5607,11 @@ msgstr "" "hinzufügen, ausliest. Calibre kann entweder aus dem Inhalt oder aus dem " "Dateinamen Metadaten auslesen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:115 msgid "Read metadata only from &file name" msgstr "Metadaten nur aus dem Date&inamen lesen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:116 msgid "" "Swap the firstname and lastname of the author. This affects only metadata " "read from file names." @@ -5036,30 +5619,22 @@ msgstr "" "Vorname und Nachname des Autors vertauschen. Dies betrifft nur aus " "Dateinamen gelesene Metadaten." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:117 msgid "&Swap author firstname and lastname" msgstr "Vorname und Nachname des Autors vertau&schen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:118 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" +"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 "" -"Wenn ein bestehendes Buch mit dem gleichen Titel und Autor gefunden wird, " -"dass aber nicht das Format besitzt welches hinzufgefügt werden soll, so wird " -"dem bestehenden Buch das neue Format hinzugefügt anstatt einen neuen Eintrag " -"zu erstellen. Wenn das bestehende Buch bereits das Format hat, wird es " -"einfach ignoriert.\n" -"Der Titelvergleich ignoriert führende unbestimmte Artikel wie (\"der\", " -"\"ein\", \"eine\"), Punktierung, Groß- und Kleinschreibung, usw. Der " -"Autorenvergleich ist exakt." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122 msgid "" "If books with similar titles and authors found, &merge the new files " "automatically" @@ -5067,15 +5642,15 @@ msgstr "" "Falls Bücher mit ähnlichen Titeln und Autoren gefunden werden, die neuen " "Dateien automatisch mit diesen zusa&mmenfügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:123 msgid "&Configure metadata from file name" msgstr "Metadaten aus dem Dateinamen &konfigurieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:124 msgid "&Adding books" msgstr "Bücher &hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:125 msgid "" "Here you can control how calibre will save your books when you click the " "Save to Disk button:" @@ -5083,43 +5658,60 @@ msgstr "" "Hier können Sie einstellen, wie Calibre Ihre Bücher speichert, wenn Sie die " "Schaltfläche Auf Festplatte speichern klicken:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:126 msgid "Save &cover separately" msgstr "Ums&chlagbild getrennt speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:127 msgid "Update &metadata in saved copies" msgstr "&Metadaten in gespeicherten Kopien aktualisieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:128 msgid "Save metadata in &OPF file" msgstr "Metadaten in &OPF Datei speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:129 msgid "Convert non-English characters to &English equivalents" msgstr "Nicht-Englische Zeichen in &Englische Entsprechungen umwandeln" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:130 msgid "Format &dates as:" msgstr "&Daten formatieren als:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:131 msgid "File &formats to save:" msgstr "Datei&formate speichern:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:132 msgid "Replace space with &underscores" msgstr "Leerzeichen mit &Unterstrich ersetzen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:133 msgid "Change paths to &lowercase" msgstr "Pfade in K&leinschreibung umwandeln" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:134 msgid "&Saving books" msgstr "Bücher &speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:135 +msgid "Preserve device collections." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:136 +msgid "" +"If checked, collections will not be deleted even if a book with changed " +"metadata is resent and the collection is not in the book's metadata. In " +"addition, editing collections in the device view will be enabled. If " +"unchecked, collections will be always reflect only the metadata in the " +"calibre library." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:137 +msgid " " +msgstr " " + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:138 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 " @@ -5130,17 +5722,18 @@ msgstr "" "einzelne Geräte überschrieben werden, indem die Geräte-Interface-Plugins in " "\"Einstellungen -> Plugins\" angepasst werden." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:139 msgid "Sending to &device" msgstr "An das Gerät sen&den" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:297 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 msgid "Preferences" msgstr "Einstellungen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:552 msgid "" "&Location of ebooks (The ebooks are stored in folders sorted by author and " "metadata is stored in the file metadata.db)" @@ -5149,29 +5742,29 @@ msgstr "" "sortiert gespeichert und die Metadaten werden in der Datei metadata.db " "gespeichert)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:553 msgid "Browse for the new database location" msgstr "Zu einem neuen Ort der Datenbank wechseln" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555 msgid "Show notification when &new version is available" msgstr "Benachrichtigung anzeigen, wenn &neue Version verfügbar ist" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556 msgid "Download &social metadata (tags/ratings/etc.) by default" msgstr "" "&Soziale Metadaten (Etikettierung/Bewertung/etc.) laden als Voreinstellung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:557 msgid "&Overwrite author and title by default when fetching metadata" msgstr "" "Autor und Titel standardmäßig überschreiben, wenn Metadaten geholt werden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:558 msgid "Default network &timeout:" msgstr "Voreinstellung für Zei&tüberschreitung bei Netzwerkverbindungen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:559 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" @@ -5179,140 +5772,156 @@ msgstr "" "Voreinstellung der Zeitüberschreitung für Netzwerkabrufe festsetzen (Gilt " "immer dann, wenn aus dem Internet Informationen abgerufen werden sollen)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:560 msgid " seconds" msgstr " Sekunden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561 msgid "Choose &language (requires restart):" msgstr "Sprache wäh&len (erfordert Neustart):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562 msgid "Normal" msgstr "Normal" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:563 msgid "High" msgstr "Hoch" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564 msgid "Low" msgstr "Niedrig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:565 msgid "Job &priority:" msgstr "Auftrags&priorität:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:566 msgid "Preferred &output format:" msgstr "Bev&orzugtes Ausgabe-Format:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:567 msgid "Preferred &input format order:" msgstr "Bevorzugte Reihenfolge des E&ingabe-Formats:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:570 msgid "Use &Roman numerals for series number" msgstr "&Römische Ziffern für Reihennummerierung verwenden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571 msgid "Enable system &tray icon (needs restart)" msgstr "" "Symbol im Sys&tembereich der Kontrollleiste aktivieren (erfordert Neustart)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572 msgid "Show ¬ifications in system tray" msgstr "Be&nachrichtigungen im Systembereich der Kontrollleiste anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 msgid "Show &splash screen at startup" -msgstr "" +msgstr "Spla&sh-Screen beim Starten anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574 msgid "Show cover &browser in a separate window (needs restart)" msgstr "Zeige Cover-Ansicht in einem eigenen Fenster (erfordert Neustart)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575 +msgid "Show &average ratings in the tags browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:576 msgid "Search as you type" msgstr "Suchen während der Eingabe" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 msgid "Automatically send downloaded &news to ebook reader" msgstr "Geladene &Nachrichten automatisch an das Gerät senden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:578 msgid "&Delete news from library when it is automatically sent to reader" msgstr "" "Nachrichten nach der automatischen Übertragung auf das Gerät aus der " "Bibliothek &löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:579 msgid "&Number of covers to show in browse mode (needs restart):" msgstr "" "A&nzahl der anzuzeigenden Umschlagbilder in der Cover-Ansicht (erfordert " "Neustart):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:580 msgid "Toolbar" msgstr "Symbolleiste" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:565 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:581 msgid "Large" msgstr "Groß" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:566 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:582 msgid "Medium" msgstr "Mittel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:567 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:583 msgid "Small" msgstr "Klein" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:568 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:584 msgid "&Button size in toolbar" msgstr "&Größe der Schaltflächen in der Symbolleiste" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:585 msgid "Show &text in toolbar buttons" msgstr "Zeige &Text in Schaltflächen der Symbolleiste" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:586 msgid "Select visible &columns in library view" msgstr "Si&chtbare Spalten in Bibliothek-Ansicht wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:588 msgid "Remove a user-defined column" msgstr "Benutzerdefinierte Spalte entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:590 msgid "Add a user-defined column" msgstr "Benutzerdefinierte Spalte hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:576 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:592 msgid "Edit settings of a user-defined column" msgstr "Einstellungen einer benutzerdefinierten Spalte ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:579 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:595 msgid "Use internal &viewer for:" msgstr "Internen &Viewer verwenden für:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:580 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:596 +msgid "User Interface &layout (needs restart):" +msgstr "Aussehen der Benutzeroberf&läche (Neustart erforderlich):" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:597 +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:598 +msgid "Disable &animations" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:599 msgid "Add an email address to which to send books" msgstr "Eine eMail-Adresse hinzufügen, an die die Bücher gesendet werden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:581 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:600 msgid "&Add email" msgstr "eM&ail hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:582 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:601 msgid "Make &default" msgstr "Als Voreinstellung verwenden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 msgid "&Remove email" msgstr "eMail entfe&rnen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:584 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:603 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-" @@ -5322,35 +5931,35 @@ msgstr "" "eMails werden automatisch für geladene Nachrichten an alle eMail-Adressen " "mit aktiviertem Auto-Send verschickt." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:585 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:604 msgid "&Maximum number of waiting worker processes (needs restart):" msgstr "" "&Maximale Anzahl der Arbeitsprozesse in der Warteschlange (erfordert " "Neustart):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605 msgid "&Check database integrity" msgstr "Vollständigkeit der &Datenbank überprüfen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 msgid "&Install command line tools" msgstr "Kommandozeilen-Tools &installieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 msgid "Open calibre &configuration directory" msgstr "&Calibre Einstellungsverzeichnis öffnen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:589 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 msgid "Limit the max. simultaneous jobs to the available CPU &cores" msgstr "" "Die maximale Anzahl gleichzeitiger Aufträge auf die Anzahl der &CPU-Kerne " "beschränken." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:590 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 msgid "Debug &device detection" msgstr "Fehlersuche bei &der Geräteerkennung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 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 " @@ -5360,25 +5969,25 @@ msgstr "" "von überall aus mit Hilfe eines Browsers auf Ihre Büchersammlung zugreifen " "können. Einstellungsänderungen erfolgen erst nach einem Neustart des Servers." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 msgid "Server &port:" msgstr "Server &Port:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 #: /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 "Ben&utzername:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 #: /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 "&Passwort:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 msgid "" "If you leave the password blank, anyone will be able to access your book " "collection using the web interface." @@ -5386,7 +5995,7 @@ msgstr "" "Wenn Sie das Kennwort leer lassen, kann jeder auf Ihre Büchersammlung über " "das Webinterface zugreifen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:596 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 msgid "" "The maximum size (widthxheight) for displayed covers. Larger covers are " "resized. " @@ -5394,45 +6003,45 @@ msgstr "" "Maximale Größe (BreitexHöhe) der angezeigten Umschlagbilder. Größere " "Umschlagbilder werden verkleinert. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 msgid "Max. &cover size:" msgstr "Maximale Ums&chlagbild-Größe:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 #: /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 "Pa&sswort anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:599 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 msgid "Max. &OPDS items per query:" msgstr "Maximale &ODPS Einträge pro Anfrage:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 msgid "Max. OPDS &ungrouped items:" -msgstr "" +msgstr "Max. OPDS &ungeordnete Elemente:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:601 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 msgid "&Start Server" msgstr "Server &starten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 msgid "St&op Server" msgstr "Server st&oppen" -#: /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:622 msgid "&Test Server" msgstr "Server &testen" -#: /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:623 msgid "Run server &automatically on startup" msgstr "Server &automatisch beim Starten hochfahren" -#: /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:624 msgid "View &server logs" msgstr "Server Logs ansehen" -#: /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:625 #: /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 " @@ -5450,7 +6059,7 @@ msgstr "" "vollständige Servername oder die IP-Adresse des Rechners sein, auf dem " "Calibre läuft." -#: /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:627 msgid "" "Here you can customize the behavior of Calibre by controlling what plugins " "it uses." @@ -5458,27 +6067,27 @@ msgstr "" "Hier können Sie das Verhalten von Calibrie anpassen, indem sie festlegen, " "welche Plugins verwendet werden." -#: /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:628 msgid "Enable/&Disable plugin" msgstr "Plugin &ein-/ausschalten" -#: /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:629 msgid "&Customize plugin" msgstr "Plugin &anpassen" -#: /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:630 msgid "&Remove plugin" msgstr "Plugin entfe&rnen" -#: /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:631 msgid "Add new plugin" msgstr "Neues Plugin hinzufügen" -#: /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:632 msgid "Plugin &file:" msgstr "&Plugin-Datei:" -#: /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:634 msgid "&Add" msgstr "&Hinzufügen" @@ -5515,10 +6124,11 @@ msgid "Number" msgstr "Nummer" #: /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:27 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:833 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:535 +#: /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:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:884 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Date" msgstr "Datum" @@ -5534,69 +6144,76 @@ msgstr "Erklärender Text hinzugefügt in create_ct_column.py" msgid "Create and edit tag-based columns" msgstr "Erstelle und bearbeite Etiketten-basierte Spalten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:19 msgid "Text, column shown in the tag browser" msgstr "Text, Spalte im Etiketten-Browser angezeigt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:21 +#: /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 "" "Durch Kommata getrennter Text, wie Etiketten, angezeigt im Etiketten-Browser" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:24 +#: /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 "Langer Text, wie Kommentare, nicht im Etiketten-Browser angezeigt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:29 +#: /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 "Fließkommazahlen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:35 msgid "Integers" msgstr "Ganzzahlen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:37 msgid "Ratings, shown with stars" msgstr "Bewertungen, angezeigt durch Sterne" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:40 msgid "Yes/No" msgstr "Ja/Nein" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:64 msgid "No column selected" msgstr "Keine Spalte ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:65 msgid "No column has been selected" msgstr "Es wurde keine Spalte ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:69 msgid "Selected column is not a user-defined column" msgstr "Die gewählte Spalte ist keine benutzerdefinierte Spalte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:100 msgid "No lookup name was provided" msgstr "Es wurde kein Suchname angegeben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:102 msgid "" -"The label must contain only letters and digits, and start with a letter" +"The label must contain only letters, digits and underscores, and start with " +"a letter" msgstr "" +"Die Beschriftung darf nur Buchstaben, Ziffern und Unterstriche enthalten und " +"muss mit einem Buchstaben beginnen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:111 msgid "No column heading was provided" msgstr "Es wurde keine Spaltenüberschrift angegeben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:117 msgid "The lookup name %s is already used" msgstr "Der Suchname %s wird schon verwendet" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:127 msgid "The heading %s is already used" msgstr "Die Überschrift %s wird schon verwendet" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:129 msgid "" "The lookup name must be lower case and cannot contain \":\"s or spaces" msgstr "" @@ -5621,11 +6238,15 @@ msgid "" "Used for searching the column. Must contain only digits and lower case " "letters." msgstr "" +"Zur Verwendung für das Durchsuchen der Spalte. Darf nur Zahlen und " +"kleingeschriebene Buchstaben enthalten." #: /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 "" +"Spaltenüberschrift in der Bibliotheksansicht und Kategoriename im Etiketten-" +"Browser" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:106 msgid "Column &type" @@ -5633,7 +6254,7 @@ msgstr "Spalten&typ" #: /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 "" +msgstr "Art der Information, die in der Spalte enthalten ist." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:108 msgid "" @@ -5645,6 +6266,13 @@ msgid "" "

  • dd MMMM yy gives 05 January 10
  • \n" " " msgstr "" +"

    Datumsformat. Verwenden Sie 1-4 'd's für den Tag, 1-4 'M's für den Monat, " +"und 2 oder 4 'y's für das Jahr.

    \n" +"

    Zum Beispiel:\n" +"

      \n" +"
    • ddd, d MMM yyyy ergibt Mon, 5 Jan 2010
    • \n" +"
    • dd MMMM yy ergibt 05 Januar 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" @@ -5713,41 +6341,62 @@ msgstr "&Warnung erneut anzeigen" msgid "ERROR" msgstr "FEHLER" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:69 +msgid "Location" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1058 +msgid "Format" +msgstr "Format" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device_ui.py:50 +msgid "Delete from device" +msgstr "Vom Gerät löschen" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:29 +msgid "Author sort" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:47 +msgid "Manage authors" +msgstr "Autoren verwalten" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 msgid "Author Sort" msgstr "Sortierung nach Autor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "ISBN" msgstr "ISBN" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:162 msgid "Finding metadata..." msgstr "Finde Metadaten..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:176 msgid "Could not find metadata" msgstr "Konnte Metadaten nicht finden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:177 msgid "The metadata download seems to have stalled. Try again later." msgstr "" "Der Download der Metadaten scheint zum Stillstand gekommen zu sein. " "Versuchen Sie es später erneut." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:186 msgid "Warning" msgstr "Warnung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:187 msgid "Could not fetch metadata from:" msgstr "Konnte Metadaten nicht abrufen von:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:191 msgid "No metadata found" msgstr "Keine Metadaten gefunden" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:192 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" @@ -5837,7 +6486,7 @@ msgid "Author s&ort: " msgstr "S&ortierung nach Autor: " #: /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:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -5846,14 +6495,14 @@ msgstr "" "Dickens\" zum Beispiel als \"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:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "&Rating:" msgstr "&Bewertung:" #: /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:376 -#: /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:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Rating of this book. 0-5 stars" msgstr "Bewertung dieses Buches: 0-5 Sterne" @@ -5862,7 +6511,7 @@ msgid "No change" msgstr "Keine Änderung" #: /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:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid " stars" msgstr " Sterne" @@ -5872,8 +6521,8 @@ msgstr "Etiketten hinzufü&gen: " #: /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:382 -#: /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:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 msgid "Open Tag Editor" msgstr "Etiketten-Editor öffnen" @@ -5907,225 +6556,232 @@ msgstr "" "Falls Sie zuerst Buch A und dann Buch B wählen,\n" "erhält Buch A Reihennummer 1 und Buch B Reihennummer 2." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 -msgid "Automatically number books in this series" -msgstr "Bücher in dieser Reihe automatisch nummerieren" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 msgid "" "Remove stored conversion settings for the selected books.\n" "\n" "Future conversion of these books will use the default settings." msgstr "" +"Die gespeicherten Konvertierungs-Einstellungen für die gewählten Bücher " +"löschen.\n" +"\n" +"Für zukünftige Konvertierungen dieser Bücher werden die Voreinstellungen " +"verwendet." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:187 msgid "Remove &stored conversion settings for the selected books" msgstr "" +"Ge&speicherte Konvertierungs-Einstellungen für die gewählten Bücher löschen" #: /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:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 msgid "&Basic metadata" -msgstr "" +msgstr "&Basis-Metadaten" #: /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:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "&Custom metadata" -msgstr "" +msgstr "Ben&utzerdefinierte Metadaten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:123 msgid "Not a valid picture" msgstr "Kein gültiges Bild." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136 msgid "Choose formats for " msgstr "Formate wählen für " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1391 -msgid "Books" -msgstr "Bücher" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 msgid "No permission" msgstr "Zugriff verweigert" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:166 msgid "You do not have permission to read the following files:" msgstr "Sie haben nicht die Berechtigung, die folgenden Dateien zu lesen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:194 msgid "No format selected" msgstr "Kein Format gewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:205 msgid "Could not read metadata" msgstr "Konnte Metadaten nicht lesen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:206 msgid "Could not read metadata from %s format" msgstr "Konnte Metadaten des Formats %s nicht lesen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:256 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 msgid "Could not read cover" msgstr "Konnte Umschlagbild nicht lesen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:255 msgid "Could not read cover from %s format" msgstr "Konnte Umschlagbild des Formats %s nicht lesen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:261 msgid "The cover in the %s format is invalid" msgstr "Das Umschlagbild im Format %s ist ungültig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:298 msgid "Abort the editing of all remaining books" msgstr "Editieren aller verbleibenden Bücher abbrechen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:442 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:439 msgid "This ISBN number is valid" msgstr "Diese ISBN ist gültig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:450 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:442 msgid "This ISBN number is invalid" msgstr "Diese ISBN ist ungültig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:521 +msgid "Cannot use tag editor" +msgstr "Kann Etiketteneditor nicht verwenden" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:522 +msgid "The tags editor cannot be used if you have modified the tags" +msgstr "" +"Der Etiketteneditor kann nicht verwendet werden, falls sie die Etiketten " +"verändert haben" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:542 msgid "Downloading cover..." msgstr "Lade Umschlagbild..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:558 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:563 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:569 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:565 msgid "Cannot fetch cover" msgstr "Kann kein Umschlagbild abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:559 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:566 msgid "Could not fetch cover.
    " msgstr "Konnte kein Umschlagbild abrufen.
    " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:556 msgid "The download timed out." msgstr "Der Download timed out." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:560 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" "Konnte kein Umschlagbild für dieses Buch finden. Geben Sie zuerst die ISBN " "an." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:576 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:572 msgid "Bad cover" msgstr "Falsches Umschlagbild" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:577 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:573 msgid "The cover is not a valid picture" msgstr "Das Umschlagbild ist kein gültiges Bild" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:610 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:606 msgid "There were errors" msgstr "Es sind Fehler aufgetreten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:607 msgid "There were errors downloading social metadata" msgstr "Während des Ladens von sozialen Metadaten sind Fehler aufgetreten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 msgid "Cannot fetch metadata" msgstr "Konnte Metadaten nicht abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "Sie müssen wenigstens ISBN, Titel, Autor oder Herausgeber angeben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:708 msgid "Permission denied" msgstr "Zugriff verweigert" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:709 msgid "Could not open %s. Is it being used by another program?" msgstr "" "Konnte %s nicht öffnen. Wird es von einem anderen Programm verwendet?" -#: /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:361 msgid "Edit Meta Information" msgstr "Meta-Informationen bearbeiten" -#: /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:362 msgid "Meta information" msgstr "Meta-Informationen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 msgid "Swap the author and title" msgstr "Tausche Autor und Titel" -#: /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:368 msgid "Author S&ort: " msgstr "S&ortierung nach Autor: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "" "Automatically create the author sort entry based on the current author entry" msgstr "" "Automatisch den Eintrag für die Sortierung nach Autor basierend auf dem " "aktuellen Autor erstellen" -#: /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:384 msgid "Remove unused series (Series that have no books)" msgstr "Unbenutzte Reihen entfernen (Reihen ohne Bücher)" -#: /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:386 msgid "IS&BN:" msgstr "IS&BN:" -#: /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:387 msgid "Publishe&d:" msgstr "Veröffentlichun&g:" -#: /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:390 msgid "dd MMM yyyy" msgstr "TT MMM YYYY" -#: /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:391 msgid "&Date:" msgstr "&Datum:" -#: /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:392 msgid "&Comments" msgstr "&Bemerkungen" -#: /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:393 msgid "&Fetch metadata from server" msgstr "Metadaten vom Server abru&fen" -#: /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:394 msgid "Available Formats" msgstr "Verfügbare Formate" -#: /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:395 msgid "Add a new format for this book to the database" msgstr "Ein neues Format für dieses Buch zur Datenbank hinzufügen" -#: /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:397 msgid "Remove the selected formats for this book from the database." msgstr "Markierte Formate dieses Buches aus der Datenbank löschen" -#: /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:399 msgid "Set the cover for the book from the selected format" msgstr "Umschlagbild des Buches aus dem gewählten Format festlegen" -#: /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:401 msgid "Update metadata from the metadata in the selected format" msgstr "Metadaten durch die Metadaten im angegebenen Format aktualisieren" -#: /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:406 msgid "Reset cover to default" msgstr "Umschlagbild auf Voreinstellung zurücksetzen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Download &cover" msgstr "Ums&chlagbild laden" @@ -6141,14 +6797,16 @@ msgstr "Abbruch läuft ..." msgid "" "The current saved search will be permanently deleted. Are you sure?" msgstr "" +"Die aktuell gespeicherte Suche wird dauerhaft gelöscht. Sind Sie " +"sicher?" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:83 msgid "Saved Search Editor" -msgstr "" +msgstr "Editor für gespeicherte Suche" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:84 msgid "Saved Search: " -msgstr "" +msgstr "Gespeicherte Suche: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:85 msgid "Select a saved search to edit" @@ -6160,15 +6818,15 @@ msgstr "Löscht diese selektierte gespeicherte Suche" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 msgid "Enter a new saved search name." -msgstr "" +msgstr "Einen neuen Namen für die gespeicherte Suche eingeben." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 msgid "Add the new saved search" -msgstr "" +msgstr "Die neue gespeicherte Suche hinzufügen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 msgid "Change the contents of the saved search" -msgstr "" +msgstr "Inhalt der gespeicherten Suche ändern" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:119 msgid "Need username and password" @@ -6424,74 +7082,76 @@ msgid "Choose formats" msgstr "Formate auswählen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:72 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:76 msgid "Authors" msgstr "Autoren" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:101 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:107 msgid "Publishers" msgstr "Herausgeber" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:110 msgid " (not on any book)" -msgstr "" +msgstr " (in keinem Buch)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:162 msgid "" "The current tag category will be permanently deleted. Are you sure?" msgstr "" +"Die aktuelle Etiketten-Kategorie wird dauerhaft gelöscht. Sind Sie " +"sicher?" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:153 msgid "User Categories Editor" -msgstr "" +msgstr "Editor für Benutzer-Kategorien" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:154 msgid "A&vailable items" -msgstr "" +msgstr "&Verfügbare Elemente" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:155 msgid "Apply tags to current tag category" -msgstr "" +msgstr "Etiketten auf aktuelle Etiketten-Kategorie anwenden" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:157 msgid "A&pplied items" -msgstr "" +msgstr "An&gewandte Elemente" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 msgid "Unapply (remove) tag from current tag category" -msgstr "" +msgstr "Etikett aus aktueller Etiketten-Kategorie entfernen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 msgid "Category name: " -msgstr "" +msgstr "Kategorie-Name: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 msgid "Select a category to edit" -msgstr "" +msgstr "Kategorie zur Bearbeitung auswählen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 msgid "Delete this selected tag category" -msgstr "" +msgstr "Die gewählte Etiketten-Kategorie löschen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 msgid "Enter a new category name. Select the kind before adding it." -msgstr "" +msgstr "Neuen Kategorie-Namen eingeben. Art vor dem Hinzufügen auswählen." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:165 msgid "Add the new category" -msgstr "" +msgstr "Neue Kategorie hinzufügen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 msgid "Category filter: " -msgstr "" +msgstr "Kategorie-Filter: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 msgid "Select the content kind of the new category" -msgstr "" +msgstr "Art des Inhalts der neuen Kategorie auswählen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:68 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:101 msgid "Are your sure?" msgstr "Sind Sie sicher?" @@ -6549,63 +7209,60 @@ msgstr "" "Etikett zu den verfügbaren Etiketten hinzufügen und dem aktuellen Buch " "zuweisen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:501 msgid "Item is blank" msgstr "Eintrag ist leer" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:502 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" +"Ein Element kann nicht auf nichts eingestellt werden. Löschen Sie es " +"stattdessen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:66 -msgid "Item already used" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:67 -msgid "The item %s is already used." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:87 msgid "No item selected" msgstr "Kein Eintrag ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:88 msgid "You must select one item from the list of Available items." msgstr "" +"Sie müssen ein Element aus der Liste der verfügbaren Elemente wählen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:97 msgid "No items selected" msgstr "Keine Einträge ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:98 msgid "You must select at least one items from the list." -msgstr "" +msgstr "Sie müssen wenigstens eines der Elemente aus der Liste auswählen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:102 msgid "Are you certain you want to delete the following items?" -msgstr "" +msgstr "Sind Sie sicher, dass Sie die folgenden Elemente löschen wollen?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:72 msgid "Category Editor" msgstr "Kategorie-Editor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:72 -msgid "Items in use" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:73 +msgid "Items in use" +msgstr "Elemente in Verwendung" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:74 msgid "" "Delete item from database. This will unapply the item from all books and " "then remove it from the database." msgstr "" +"Element aus der Datenbank löschen. Dies entfernt das Element von allen " +"Büchern und löscht es dann aus der Datenbank." -#: /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:76 msgid "Rename the item in every book where it is used." -msgstr "" +msgstr "Element in jedem Buch, in dem es verwendet wird, umbenennen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 msgid "Ctrl+S" msgstr "Strg+S" @@ -6884,11 +7541,11 @@ msgstr "Regulärer Ausdruck (?P<title>)" #: /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:78 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:82 -#: /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:94 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:100 msgid "No match" msgstr "Kein Treffer" @@ -6924,54 +7581,215 @@ msgstr "ISBN:" msgid "Regular expression (?P)" msgstr "Regulärer Ausdruck (?P)" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:36 +msgid "Save single format to disk..." +msgstr "Speichere einzelnes Format auf Festplatte..." + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:52 +msgid "Edit metadata individually" +msgstr "Metadaten einzeln bearbeiten" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:55 +msgid "Edit metadata in bulk" +msgstr "Metadaten auf einmal bearbeiten" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:58 +msgid "Download metadata and covers" +msgstr "Metadaten und Umschlagbilder laden" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:61 +msgid "Download only metadata" +msgstr "Nur Metadaten laden" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:63 +msgid "Download only covers" +msgstr "Nur Umschlagbilder laden" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:66 +msgid "Download only social metadata" +msgstr "Nur soziale Metadaten laden" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:72 +msgid "Merge into first selected book - delete others" +msgstr "In das zuerst gewählte Buch zusammenführen - andere löschen" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:75 +msgid "Merge into first selected book - keep others" +msgstr "In das zuerst gewählte Buch zusammenführen - andere behalten" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:83 +msgid "Add books from a single directory" +msgstr "Bücher aus einem einzelnen Verzeichnis hinzufügen" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:85 +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 "" +"Bücher aus Verzeichnissen hinzufügen, inklusive Unterverzeichnissen (ein " +"Buch pro Verzeichnis, jede eBook Datei im Verzeichnis ist dasselbe Buch in " +"verschiedenen Formaten)" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:89 +msgid "" +"Add books from directories, including sub directories (Multiple books per " +"directory, assumes every ebook file is a different book)" +msgstr "" +"Bücher aus Verzeichnissen hinzufügen, inklusive Unterverzeichnissen " +"(verschiedene Bücher im Verzeichnis, jede eBook Datei ist ein anderes Buch)" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:92 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "Leeres Buch hinzufügen. (Bucheintrag ohne Formate)" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:283 +msgid "Save to disk" +msgstr "Auf Festplatte speichern" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104 +msgid "Save to disk in a single directory" +msgstr "Auf Festplatte in ein einziges Verzeichnis speichern" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:402 +msgid "Save only %s format to disk" +msgstr "Nur das %s Format auf Festplatte speichern" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:405 +msgid "Save only %s format to disk in a single directory" +msgstr "" +"Dur das %s Format in ein einzelnes Verzeichnis auf der Festplatte speichern" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:289 +msgid "View" +msgstr "Vorschau" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:120 +msgid "View specific format" +msgstr "Spezielles Format ansehen" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126 +msgid "Remove selected books" +msgstr "Gewählte Bücher entfernen" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:128 +msgid "Remove files of a specific format from selected books.." +msgstr "Dateien des angegebenen Formates der gewählten Bücher entfernen..." + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:131 +msgid "Remove all formats from selected books, except..." +msgstr "Alle Formate der gewählten Bücher entfernen, außer..." + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:134 +msgid "Remove covers from selected books" +msgstr "Umschlagbilder der gewählten Bücher entfernen" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:137 +msgid "Remove matching books from device" +msgstr "Passende Bücher vom Gerät löschen" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:154 +msgid "Convert individually" +msgstr "Einzeln konvertieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:156 +msgid "Bulk convert" +msgstr "Auf einmal konvertieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:160 +msgid "Create catalog of books in your calibre library" +msgstr "Erstelle Katalog der Bücher in der Calibre Bibliothek" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:168 +msgid "Run welcome wizard" +msgstr "Willkommens-Assistenten ausführen" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:200 +msgid "Similar books..." +msgstr "Ähnliche Bücher..." + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:232 +msgid "Add books to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:248 +msgid "Manage collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:328 +msgid "Cover Browser" +msgstr "Cover-Browser" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:346 +msgid "Tag Browser" +msgstr "Etiketten-Browser" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:403 +msgid "Book Details" +msgstr "Buchdetails" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:60 msgid "Job" msgstr "Auftrag" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:61 msgid "Status" msgstr "Status" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:62 msgid "Progress" msgstr "Fortschritt" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:63 msgid "Running time" msgstr "Laufzeit" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:75 msgid "There are %d running jobs:" msgstr "Es gibt %d laufende Aufträge:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:101 msgid "Unknown job" msgstr "Unbekannter Auftrag" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:82 msgid "There are %d waiting jobs:" msgstr "Es gibt %d wartende Aufträge:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:212 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:219 msgid "Cannot kill job" msgstr "Kann Auftrag nicht abbrechen" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:217 msgid "Cannot kill jobs that communicate with the device" msgstr "Kann Aufträge, die mit dem Gerät kommunizieren, nicht abbrechen" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:220 msgid "Job has already run" msgstr "Auftrag wird schon ausgeführt" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:248 msgid "Unavailable" msgstr "Nicht verfügbar" #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:280 +msgid "Jobs:" +msgstr "Aufträge:" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:298 +msgid "Click to see list of active jobs." +msgstr "Aktive Aufträge anzeigen" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 msgid " - Jobs" msgstr " - Aufträge" @@ -6983,112 +7801,90 @@ msgstr "N" msgid "Y" msgstr "J" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 msgid "On Device" msgstr "Auf dem Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 msgid "Size (MB)" msgstr "Größe (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 msgid "Rating" msgstr "Bewertung" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:285 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:291 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:296 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1003 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1007 -#: /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:414 -msgid "None" -msgstr "Keine" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:302 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 msgid "Book %s of %s." msgstr "Buch %s von %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:639 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1071 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:674 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1176 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:399 msgid "The lookup/search name is \"{0}\"" -msgstr "" +msgstr "Der Such-Name ist \"{0}\"" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:830 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:881 msgid "In Library" msgstr "In der Bibliothek" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:834 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:885 msgid "Size" msgstr "Größe" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:835 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:997 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 -msgid "Collections" -msgstr "Sammlungen" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:993 -msgid "Format" -msgstr "Format" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1053 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1156 msgid "Marked for deletion" msgstr "Zum Löschen ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1056 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1159 msgid "Double click to edit me

    " msgstr "Doppelklick ermöglicht Bearbeitung

    " -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:110 msgid "Hide column %s" msgstr "Spalte %s ausblenden" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:115 msgid "Sort on %s" -msgstr "" +msgstr "Sortieren nach %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:116 msgid "Ascending" msgstr "aufsteigend" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:119 msgid "Descending" msgstr "absteigend" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:131 msgid "Change text alignment for %s" -msgstr "" +msgstr "Textausrichtung ändern für %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 msgid "Left" msgstr "Links" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:133 msgid "Right" msgstr "Rechts" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:134 msgid "Center" msgstr "Zentriert" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Show column" msgstr "Spalte anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 msgid "Restore default layout" -msgstr "" +msgstr "Voreingestelltes Layout wiederherstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:475 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:524 msgid "Not allowed" msgstr "Das ist nicht gestattet" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:525 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -7186,55 +7982,56 @@ msgstr "Information zur Fehlersuche auf die Konsole ausgeben" msgid "Do not check for updates" msgstr "Nicht nach Updates suchen" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:595 +msgid "Calibre Library" +msgstr "Calibre Bibliothek" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:86 msgid "Choose a location for your calibre e-book library" msgstr "Wählen Sie einen Ort für Ihre Calibre eBook Bibliothek" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:95 msgid "Failed to create library" msgstr "Das Erstellen der Bibliothek schlug fehl" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:77 -msgid "Failed to create calibre library at: %r. Aborting." -msgstr "Das Erstellen der Bibliothek schlug fehl in: %r. Abbruch." +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:96 +msgid "Failed to create calibre library at: %r." +msgstr "Erstellen der Calibre Bibliothek schlug fehl in: %r." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:132 +#: /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 "Wählen Sie einen Ort für Ihre neue Calibre eBook Bibliothek" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153 msgid "Initializing user interface..." -msgstr "" +msgstr "Starten der Benutzeroberfläche..." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:178 msgid "Repairing failed" msgstr "Reparatur schlug fehl" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:179 msgid "The database repair failed. Starting with a new empty library." msgstr "" "Die Reparatur der Datenbank schlug fehl. Es erfolgt ein Start mit einer " "neuen, leeren Bibliothek." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:595 -msgid "Calibre Library" -msgstr "Calibre Bibliothek" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:175 -msgid "Choose a location for your new calibre e-book library" -msgstr "Wählen Sie einen Ort für Ihre neue Calibre eBook Bibliothek" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:218 +#: /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 "Schlechter Datenbank Standort" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:194 msgid "Bad database location %r. calibre will now quit." msgstr "Ungültiger Datenbank-Ort %r. Calibre beendet sich jetzt." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:207 msgid "Corrupted database" msgstr "Beschädigte Datenbank" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:208 msgid "" "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 " @@ -7244,88 +8041,90 @@ msgstr "" "es automatisch zu reparieren? Wenn Sie Nein sagen, wird eine neue, leere " "Calibre Bibliothek erstellt werden." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:206 +#: /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 "" "Repariere Datenbank. Dies kann für eine große Büchersammlung einige Zeit " "dauern" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:227 msgid "" "Bad database location %r. Will start with a new, empty calibre library" msgstr "" "Ungültiger Datenbank-Ort %r. Starte mit einer neuen, leeren Calibre " "Bibliothek" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:238 msgid "Starting %s: Loading books..." -msgstr "" +msgstr "Starte %s: Lade Bücher..." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:283 msgid "If you are sure it is not running" msgstr "Wenn Sie sicher sind, dass es nicht gestartet ist" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:285 msgid "Cannot Start " msgstr "Start nicht möglich " -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:286 msgid "%s is already running." msgstr "%s ist schon gestartet." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:289 msgid "may be running in the system tray, in the" msgstr "kann im Systemtray gestartet sein, im" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:291 msgid "upper right region of the screen." msgstr "oberen rechten Bereich des Bildschirms." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:293 msgid "lower right region of the screen." msgstr "unteren rechten Bereich des Bildschirms." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:296 msgid "try rebooting your computer." msgstr "Versuchen Sie Ihren Rechner neu zu starten." -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:290 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:302 +#: /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 "Versuche Sie die Datei zu löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:253 msgid "calibre" msgstr "Calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:255 msgid "&Restrict to:" -msgstr "" +msgstr "Besch&ränken auf:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:256 msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" +"Es werden nur die Bücher angezeigt, die auf die gewählte gespeicherte Suche " +"zutreffen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:257 msgid "set in ui.py" msgstr "Einstellen in ui.py" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:258 msgid "Advanced search" msgstr "Erweiterte Suche" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:260 msgid "Alt+S" msgstr "Alt+S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:403 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:261 msgid "&Search:" msgstr "&Suche:" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:404 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:263 msgid "" "

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

    Words separated by spaces are ANDed" @@ -7334,147 +8133,117 @@ msgstr "" "Kommentaren, etc.

    Durch Leerzeichen getrennte Worte werden mit UND " "verknüpft" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:264 msgid "Reset Quick Search" msgstr "Quick Search löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:266 msgid "Choose saved search or enter name for new saved search" msgstr "" "Gespeicherte Suche wählen oder Namen für neue gespeicherte Suche eingeben" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:267 msgid "Copy current search text (instead of search name)" msgstr "Aktuellen Suchtext kopieren (anstelle des Namens der Suche)" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:269 msgid "Save current search under the name shown in the box" msgstr "Aktuelle Suche unter dem in der Box angezeigten Namen speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:271 msgid "Delete current saved search" msgstr "Aktuell gespeicherte Suche löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:415 -msgid "Sort by &popularity" -msgstr "Nach Beliebtheit sortieren" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:416 -msgid "Match any" -msgstr "Übereinstimmung mit irgendeinem" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:417 -msgid "Match all" -msgstr "Übereinstimmung mit allen" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:418 -msgid "Create, edit, and delete user categories" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:419 -msgid "Manage &user categories" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:273 msgid "Add books" msgstr "Bücher hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:421 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:274 msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:422 -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:276 msgid "Remove books" msgstr "Bücher entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:277 msgid "Del" msgstr "Löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:425 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:278 msgid "Edit meta information" msgstr "Meta-Informationen editieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:426 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:279 msgid "E" msgstr "E" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:280 msgid "Merge book records" -msgstr "" +msgstr "Bucheinträge zusammenfügen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:281 msgid "M" msgstr "M" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:282 msgid "Send to device" msgstr "An Reader übertragen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:430 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:355 -msgid "Save to disk" -msgstr "Auf Festplatte speichern" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:431 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:284 msgid "S" msgstr "S" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:432 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:285 msgid "Fetch news" msgstr "Nachrichten abrufen" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:286 msgid "F" msgstr "F" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:287 msgid "Convert E-books" msgstr "In eBooks umwandeln" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:435 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:288 msgid "C" msgstr "C" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:436 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:369 -msgid "View" -msgstr "Vorschau" - -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:290 msgid "V" msgstr "V" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:438 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:291 msgid "Open containing folder" msgstr "Öffne Speicherort" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:439 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:292 msgid "Show book details" msgstr "Zeige Buchdetails" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:440 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:293 msgid "Books by same author" msgstr "Bücher desselben Autors" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:294 msgid "Books in this series" msgstr "Bücher dieser Reihe" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:295 msgid "Books by this publisher" msgstr "Bücher dieses Herausgebers" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:296 msgid "Books with the same tags" msgstr "Bücher mit denselben Etiketten" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:298 msgid "Configure calibre" msgstr "Calibre konfigurieren" -#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:299 msgid "Ctrl+P" msgstr "Ctrl+P" @@ -7507,14 +8276,34 @@ msgstr "Buch hat weder Titel noch ISBN" msgid "No matches found for this book" msgstr "Keine Treffer für dieses Buch" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:83 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:260 msgid "Search" msgstr "Suche" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:313 msgid "The selected search will be permanently deleted. Are you sure?" -msgstr "" +msgstr "Die gewählte Suche wird dauerhaft gelöscht. Sind Sie sicher?" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:355 +msgid "Search (For Advanced Search click the button to the left)" +msgstr "Suche (Zur erweiterten Suche die Schaltfläche links klicken)" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:392 +msgid "Saved Searches" +msgstr "Gespeicherte Suchergebnisse" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:46 +msgid "({0} of {1})" +msgstr "({0} von {1})" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:52 +msgid "(all books)" +msgstr "(Alle Bücher)" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:54 +msgid "({0} of all)" +msgstr "({0} von allen)" #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:58 msgid "Press a key..." @@ -7576,84 +8365,77 @@ msgstr "Löschen" msgid "&Alternate shortcut:" msgstr "&Alternatives Tastenkürzel:" -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:24 -msgid "Jobs:" -msgstr "Aufträge:" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:32 -msgid "Click to see list of active jobs." -msgstr "Aktive Aufträge anzeigen" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:83 -msgid "Hide Book Details" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:191 +msgid "Rename '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:83 -msgid "Show Book Details" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:195 +msgid "Edit sort for '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:84 -msgid "Hide Tag Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:84 -msgid "Show Tag Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:85 -msgid "Hide Cover Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:85 -msgid "Show Cover Browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:95 -msgid "Side bar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/sidebar.py:135 -msgid "Cover browser could not be loaded: " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:142 -msgid "Rename" -msgstr "Umbenennen" - -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:200 msgid "Hide category %s" -msgstr "" +msgstr "Kategorie %s ausblenden" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:203 msgid "Show category" -msgstr "" +msgstr "Kategorie anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:207 msgid "Show all categories" +msgstr "Alle Kategorien anzeigen" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:218 +msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:161 -msgid "Manage " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:221 msgid "Manage Saved Searches" -msgstr "" +msgstr "Gespeicherte Suchen verwalten" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:232 msgid "Manage User Categories" -msgstr "" +msgstr "Benutzer-Kategorien verwalten" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:329 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:433 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:271 msgid "Searches" msgstr "Suchergebnisse" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:420 -msgid "The name %s is already used." +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 +msgid "Duplicate search name" +msgstr "Such-Name duplizieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 +msgid "The saved search name %s is already used." +msgstr "Der gespeicherte Such-Name %s wird schon verwendet." + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:768 +msgid "Sort by name" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:768 +msgid "Sort by popularity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:769 +msgid "Sort by average rating" +msgstr "Nach Bewertungsdurchschnitt sortieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:775 +msgid "Match all" +msgstr "Übereinstimmung mit allen" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:775 +msgid "Match any" +msgstr "Übereinstimmung mit irgendeinem" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:780 +msgid "Manage &user categories" +msgstr "Ben&utzer-Kategorien verwalten" + #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:182 msgid "Convert book %d of %d (%s)" @@ -7697,613 +8479,63 @@ msgstr "" "Die folgenden Bücher wurden schon in das %s Format konvertiert. Möchten Sie " "sie erneut konvertieren?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:70 -msgid "Save single format to disk..." -msgstr "Speichere einzelnes Format auf Festplatte..." - #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:162 -msgid "Search (For Advanced Search click the button to the left)" -msgstr "Suche (Zur erweiterten Suche die Schaltfläche links klicken)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168 -msgid "Saved Searches" -msgstr "Gespeicherte Suchergebnisse" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:191 -msgid "Error communicating with device" -msgstr "Fehler bei der Kommunikation mit dem Gerät" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:208 msgid "&Restore" msgstr "&Wiederherstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:164 msgid "&Donate to support calibre" msgstr "Spen&den Sie, um Calibre zu unterstützen" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 msgid "&Eject connected device" msgstr "Verbundenes Gerät ausw&erfen" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:172 msgid "&Restart" msgstr "&Neustart" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:206 msgid "

    For help see the: User Manual
    " msgstr "" "

    Hilfe finden Sie in der Bedienungsanleitung
    " -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:212 msgid "%s: %s by Kovid Goyal %%(version)s
    %%(device)s

    " msgstr "%s: %s von Kovid Goyal %%(version)s
    %%(device)s

    " -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:281 -msgid "Edit metadata individually" -msgstr "Metadaten einzeln bearbeiten" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:283 -msgid "Edit metadata in bulk" -msgstr "Metadaten auf einmal bearbeiten" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:285 -msgid "Download metadata and covers" -msgstr "Metadaten und Umschlagbilder laden" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:286 -msgid "Download only metadata" -msgstr "Nur Metadaten laden" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:287 -msgid "Download only covers" -msgstr "Nur Umschlagbilder laden" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:288 -msgid "Download only social metadata" -msgstr "Nur soziale Metadaten laden" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:292 -msgid "Merge into first selected book - delete others" -msgstr "In das zuerst gewählte Buch zusammenführen - andere löschen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:294 -msgid "Merge into first selected book - keep others" -msgstr "In das zuerst gewählte Buch zusammenführen - andere behalten" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:301 -msgid "Add books from a single directory" -msgstr "Bücher aus einem einzelnen Verzeichnis hinzufügen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:302 -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 "" -"Bücher aus Verzeichnissen hinzufügen, inklusive Unterverzeichnissen (ein " -"Buch pro Verzeichnis, jede eBook Datei im Verzeichnis ist dasselbe Buch in " -"verschiedenen Formaten)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:305 -msgid "" -"Add books from directories, including sub directories (Multiple books per " -"directory, assumes every ebook file is a different book)" -msgstr "" -"Bücher aus Verzeichnissen hinzufügen, inklusive Unterverzeichnissen " -"(verschiedene Bücher im Verzeichnis, jede eBook Datei ist ein anderes Buch)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:308 -msgid "Add Empty book. (Book entry with no formats)" -msgstr "Leeres Buch hinzufügen. (Bucheintrag ohne Formate)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:356 -msgid "Save to disk in a single directory" -msgstr "Auf Festplatte in ein einziges Verzeichnis speichern" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:357 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2299 -msgid "Save only %s format to disk" -msgstr "Nur das %s Format auf Festplatte speichern" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:360 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2302 -msgid "Save only %s format to disk in a single directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:370 -msgid "View specific format" -msgstr "Spezielles Format ansehen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:375 -msgid "Remove selected books" -msgstr "Gewählte Bücher entfernen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:377 -msgid "Remove files of a specific format from selected books.." -msgstr "Dateien des angegebenen Formates der gewählten Bücher entfernen..." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:379 -msgid "Remove all formats from selected books, except..." -msgstr "Alle Formate der gewählten Bücher entfernen, außer..." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:381 -msgid "Remove covers from selected books" -msgstr "Umschlagbilder der gewählten Bücher entfernen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:420 -msgid "Convert individually" -msgstr "Einzeln konvertieren" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:421 -msgid "Bulk convert" -msgstr "Auf einmal konvertieren" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:424 -msgid "Create catalog of books in your calibre library" -msgstr "Erstelle Katalog der Bücher in der Calibre Bibliothek" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:440 -msgid "Run welcome wizard" -msgstr "Willkommens-Assistenten ausführen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:480 -msgid "Similar books..." -msgstr "Ähnliche Bücher..." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:237 msgid "Calibre Quick Start Guide" msgstr "Calibre Quick-Start-Guide" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:689 -msgid "Select folder to open as device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:800 -msgid "Browse by covers" -msgstr "Umschlagbilder durchsuchen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:870 -msgid "({0} of {1})" -msgstr "({0} von {1})" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:875 -msgid "(all books)" -msgstr "(Alle Bücher)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:877 -msgid "({0} of all)" -msgstr "({0} von allen)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1000 -msgid "Device: " -msgstr "Gerät: " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1002 -msgid " detected." -msgstr " gefunden." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1034 -msgid "Connected " -msgstr "Angeschlossen: " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1046 -msgid "Device database corrupted" -msgstr "Gerätedatenbank ist beschädigt" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1047 -msgid "" -"\n" -"

    The database of books on the reader is corrupted. Try the " -"following:\n" -"

      \n" -"
    1. Unplug the reader. Wait for it to finish regenerating " -"the database (i.e. wait till it is ready to be used). Plug it back in. Now " -"it should work with %(app)s. If not try the next step.
    2. \n" -"
    3. Quit %(app)s. Find the file media.xml in the reader's " -"main memory. Delete it. Unplug the reader. Wait for it to regenerate the " -"file. Re-connect it and start %(app)s.
    4. \n" -"
    \n" -" " -msgstr "" -"\n" -"

    Die Bücherdatenbank des Gerätes ist beschädigt. Versuchen " -"Sie folgendes:\n" -"

      \n" -"
    1. Entfernen Sie das Gerät. Warten Sie, bis das Gerät die " -"Datenbank wiederhergestellt hat (d.h. warten Sie, bis das Gerät wieder " -"benutzt werden kann). Stecken Sie das Gerät wieder an. Nun sollte es mit " -"%(app)s funktionieren. Falls nicht, versuchen Sie den nächsten " -"Schritt.
    2. \n" -"
    3. Schließen Sie %(app)s. Suchen Sie die Datei media.xml im " -"Hauptspeicher des Gerätes. Löschen Sie sie. Entfernen Sie das Gerät. Warten " -"Sie, bis das Gerät die Datei wiederhergestellt hat. Stecken Sie das Gerät " -"wieder an und starten Sie %(app)s.
    4. \n" -"
    \n" -" " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1110 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1287 -msgid "Use library only" -msgstr "Nur Bibliothek verwenden" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1111 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1288 -msgid "User annotations generated from main library only" -msgstr "Nur aus der Hauptbibliothek erstellte Benutzeranmerkungen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1118 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1604 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1661 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1699 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1720 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1850 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1915 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2033 -msgid "No books selected" -msgstr "Keine Bücher ausgewählt" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1119 -msgid "No books selected to fetch annotations from" -msgstr "Es sind keine Bücher zum Abrufen von Anmerkungen ausgewählt" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1144 -msgid "Merging user annotations into database" -msgstr "Füge Benutzeranmerkungen zur Datenbank hinzu" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1172 -msgid "%s
    Last Page Read: %d (%d%%)" -msgstr "%s
    Letzte gelesene Seite: %d (%d%%)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1178 -msgid "%s
    Last Page Read: Location %d (%d%%)" -msgstr "%s
    Letzte gelesene Seite: Position %d (%d%%)" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1197 -msgid "Location %d • %s
    %s
    " -msgstr "Position %d • %s
    %s
    " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1206 -msgid "Page %d • %s
    " -msgstr "Seite %d • %s
    " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1211 -msgid "Location %d • %s
    " -msgstr "Position %d • %s
    " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1331 -msgid "How many empty books?" -msgstr "Wie viele leere Bücher?" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1332 -msgid "How many empty books should be added?" -msgstr "Wie viele leere Bücher sollen hinzugefügt werden?" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1380 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1431 -msgid "Uploading books to device." -msgstr "Lade Bücher auf das Gerät." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1392 -msgid "EPUB Books" -msgstr "EPUB Bücher" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1393 -msgid "LRF Books" -msgstr "LRF Bücher" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1394 -msgid "HTML Books" -msgstr "HTML Bücher" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1395 -msgid "LIT Books" -msgstr "LIT Bücher" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1396 -msgid "MOBI Books" -msgstr "MOBI Bücher" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1397 -msgid "Topaz books" -msgstr "Topaz Bücher" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1398 -msgid "Text books" -msgstr "Text Bücher" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1399 -msgid "PDF Books" -msgstr "PDF Bücher" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1400 -msgid "Comics" -msgstr "Comics" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1401 -msgid "Archives" -msgstr "Archive" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1405 -msgid "Supported books" -msgstr "Unterstützte Bücher" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1440 -msgid "Merged some books" -msgstr "Einige Bücher zusammenfügen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1441 -msgid "" -"Some duplicates were found and merged into the following existing books:" -msgstr "" -"Es wurden einige Duplikate gefunden und mit den folgenden, schon vorhandenen " -"Büchern zusammengefügt:" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1450 -msgid "Failed to read metadata" -msgstr "Lesen der Metadaten schlug fehl" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1451 -msgid "Failed to read metadata from the following" -msgstr "Lesen der Metadaten schlug fehl bei folgenden" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1471 -msgid "Cannot delete" -msgstr "Löschen nicht möglich" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1474 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2177 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2202 -msgid "No book selected" -msgstr "Kein Buch ausgewählt" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1484 -msgid "Choose formats to be deleted" -msgstr "Zu löschende Formate auswählen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1502 -msgid "Choose formats not to be deleted" -msgstr "Nicht zu löschende Formate auswählen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1540 -msgid "" -"The selected books will be permanently deleted and the files removed " -"from your computer. Are you sure?" -msgstr "" -"Die gewählten Bücher werden dauerhaft gelöscht und die Dateien vom " -"Computer entfernt. Sicher?" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1557 -msgid "" -"The selected books will be permanently deleted from your device. Are " -"you sure?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1572 -msgid "Deleting books from device." -msgstr "Lösche Bücher vom Gerät." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1603 -msgid "Cannot download metadata" -msgstr "Konnte Metadaten nicht laden" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1619 -msgid "social metadata" -msgstr "soziale Metadaten" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1621 -msgid "covers" -msgstr "Umschlagbilder" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1621 -msgid "metadata" -msgstr "Metadaten" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1623 -msgid "Downloading %s for %d book(s)" -msgstr "Lade %s für %d Bücher" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1645 -msgid "Failed to download some metadata" -msgstr "Das Laden der Metadaten schlug teilweise fehl" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646 -msgid "Failed to download metadata for the following:" -msgstr "Das Laden der Metadaten schlug für folgende Bücher fehl:" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1649 -msgid "Failed to download metadata:" -msgstr "Laden der Metadaten schlug fehl:" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1660 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1698 -msgid "Cannot edit metadata" -msgstr "Kann Metadaten nicht bearbeiten" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1719 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1722 -msgid "Cannot merge books" -msgstr "Konnte Bücher nicht zusammenfügen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1723 -msgid "At least two books must be selected for merging" -msgstr "Es müssen wenigstens zwei Bücher zum Zusammenfügen ausgewählt werden" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1727 -msgid "" -"All book formats and metadata from the selected books will be added to the " -"first selected book.

    The second and subsequently selected " -"books will not be deleted or changed.

    Please confirm you want to " -"proceed." -msgstr "" -"Alle Buchformate und Metadaten des gewählten Buches werden zum zuerst " -"gewählten Buch hinzugefügt.

    Das zweite und danach gewählte " -"Bücher werden nicht gelöscht oder verändert.

    Zum Fortfahren bitte " -"bestätigen." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1738 -msgid "" -"All book formats and metadata from the selected books will be merged into " -"the first selected book.

    After merger the second and " -"subsequently selected books will be deleted.

    All book formats " -"of the first selected book will be kept and any duplicate formats in the " -"second and subsequently selected books will be permanently deleted " -"from your computer.

    Are you sure you want to proceed?" -msgstr "" -"Alle Buchformate und Metadaten des gewählten Buches werden zum zuerst " -"gewählten Buch hinzugefügt.

    Nach dem Zusammenfügen werden das " -"zweite und danach gewählte Bücher gelöscht.

    Alle Buchformate " -"des zuerst gewählten Buches bleiben bestehen und alle doppelten Formate im " -"zweiten und den danach gewählten Bücher werden unwiderruflich von Ihrem " -"Rechner gelöscht.

    Wollen Sie wirklich fortfahren?" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1750 -msgid "" -"You are about to merge more than 5 books. Are you sure you want to " -"proceed?" -msgstr "" -"Sie versuchen mehr als 5 Bücher zusammenzufügen. Wollen Sie damit " -"wirklich fortfahren?" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1849 -msgid "Cannot save to disk" -msgstr "Speichern auf Festplatte nicht möglich" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1852 -msgid "Choose destination directory" -msgstr "Zielverzeichnis auswählen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1885 -msgid "Error while saving" -msgstr "Fehler während des Speicherns" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1886 -msgid "There was an error while saving." -msgstr "Es gab einen Fehler während des Speicherns." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1893 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1894 -msgid "Could not save some books" -msgstr "Konnte einige Bücher nicht speichern" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1895 -msgid "Click the show details button to see which ones." -msgstr "" -"Klicken Sie auf die Schaltfläche Details zeigen, um zu sehen, welche es gibt." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1916 -msgid "No books selected to generate catalog for" -msgstr "Keine Bücher ausgewählt, für die ein Katalog erstellt werden soll" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1933 -msgid "Generating %s catalog..." -msgstr "Erstelle %s Katalog..." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1939 -msgid "" -"No books to catalog\n" -"Check exclude tags" -msgstr "Keine Bücher im Katalog. Bitte ausgeschlossene Etiketten prüfen." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1949 -msgid "Catalog generated." -msgstr "Katalog erstellt." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1952 -msgid "Export Catalog Directory" -msgstr "Katalog-Verzeichnis exportieren" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1953 -msgid "Select destination for %s.%s" -msgstr "Wählen Sie das Ziel für %s.%s" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1967 -msgid "Fetching news from " -msgstr "Rufe Nachrichten ab von " - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1981 -msgid " fetched." -msgstr " abgerufen." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2032 -msgid "Cannot convert" -msgstr "Konvertierung nicht möglich" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2061 -msgid "Starting conversion of %d book(s)" -msgstr "Starte Konvertierung von %d Büchern" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2177 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2235 -msgid "Cannot view" -msgstr "Ansehen nicht möglich" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2191 -msgid "Multiple Books Selected" -msgstr "Mehrere Bücher ausgewählt" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2192 -msgid "" -"You are attempting to open %d books. Opening too many books at once can be " -"slow and have a negative effect on the responsiveness of your computer. Once " -"started the process cannot be stopped until complete. Do you wish to " -"continue?" -msgstr "" -"Sie versuchen %d Bücher zu öffnen. Das gleichzeitige Öffnen zu vieler Bücher " -"kann lange dauern und einen negative Wirkung auf die Reaktionszeit Ihres " -"Rechners haben. Einmal gestartet kann der Prozess nicht beendet werden, " -"bevor er abgeschlossen ist. Möchten Sie fortfahren?" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2201 -msgid "Cannot open folder" -msgstr "Konnte Verzeichnis nicht öffnen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2236 -msgid "%s has no available formats." -msgstr "%s hat keine verfügbaren Formate." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2277 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2282 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:389 msgid "Cannot configure" msgstr "Konfiguration nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2278 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:385 msgid "Cannot configure while there are running jobs." msgstr "Konfiguration nicht möglich während Aufträge abgearbeitet werden." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2283 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:390 msgid "Cannot configure before calibre is restarted." -msgstr "" +msgstr "Konfiguration erst nach einem Neustart von Calibre möglich." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2334 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:433 msgid "No detailed info available" msgstr "Es sind keine genaueren Informationen verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2335 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:434 msgid "No detailed information is available for books on the device." msgstr "" "Es sind keine weitere Informationen über Bücher auf dem Gerät verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2385 -msgid "Failed" -msgstr "Fehlgeschlagen" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2391 -msgid "Error talking to device" -msgstr "Fehler in der Kommunikation zum Gerät" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2392 -msgid "" -"There was a temporary error talking to the device. Please unplug and " -"reconnect the device and or reboot." -msgstr "" -"Es trat ein Fehler in der Kommunikation mit dem Gerät auf. Bitte entfernen " -"und schließen Sie das Gerät wieder an und - oder starten Sie neu." - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2415 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2443 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:514 msgid "Conversion Error" msgstr "Konvertierungsfehler" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2416 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:487 msgid "" "

    Could not convert: %s

    It is a DRMed book. You must " "first remove the DRM using third party tools." @@ -8312,15 +8544,15 @@ msgstr "" "href=\"%s\">DRM geschütztes Buch. Sie müssen zuerst das DRM mit Hilfe " "anderer Programme entfernen." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2429 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:500 msgid "Recipe Disabled" msgstr "Downloadschema ausgeschalten" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2444 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 msgid "Failed" msgstr "Misslungen" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2491 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:555 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." @@ -8329,12 +8561,12 @@ msgstr "" "Falls Sie es nützlich finden, sollten Sie eine Spende zur Unterstützung " "seiner Entwicklung in Betracht ziehen." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2516 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:580 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" "Es bestehen aktive Aufträge. Sind Sie sicher, dass sie es beenden wollen?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2519 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583 msgid "" " is communicating with the device!
    \n" " Quitting may cause corruption on the device.
    \n" @@ -8345,11 +8577,11 @@ msgstr "" "verursachen.
    \n" " Sind Sie sicher, dass sie beenden möchten?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2523 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:587 msgid "WARNING: Active jobs" msgstr "WARNUNG: Aktive Aufträge" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2575 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:640 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -8357,7 +8589,7 @@ msgstr "" "wird im System Tray weiter laufen. Zum Schließen wählen Sie Beenden " "im Kontextmenü des System Tray." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2594 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:52 msgid "" "Latest version: %s" @@ -8365,11 +8597,11 @@ msgstr "" "Letzte Version: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2602 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:60 msgid "Update available" msgstr "Neue Version verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2603 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:61 msgid "" "%s has been updated to version %s. See the new features. Visit the download page?" @@ -8852,15 +9084,15 @@ msgstr "Shift+F3" msgid "Print eBook" msgstr "eBook drucken" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:239 msgid "Copy Image" msgstr "Bild kopieren" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:240 msgid "Paste Image" msgstr "Bild einfügen" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:270 msgid "" "Library\n" "%d\n" @@ -8870,7 +9102,7 @@ msgstr "" "%d\n" "Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:271 msgid "" "Reader\n" "%s\n" @@ -8880,7 +9112,7 @@ msgstr "" "%s\n" "verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:272 msgid "" "Card A\n" "%s\n" @@ -8890,7 +9122,7 @@ msgstr "" "%s\n" "verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:273 msgid "" "Card B\n" "%s\n" @@ -8900,49 +9132,61 @@ msgstr "" "%s\n" "verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:277 msgid "Click to see the books available on your computer" msgstr "Liste der auf dem Computer vorhandenen Bücher anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:280 msgid "Click to see the books in the main memory of your reader" msgstr "" "Liste der auf dem Hauptspeicher des Gerätes vorhandenen Bücher anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:281 msgid "Click to see the books on storage card A in your reader" msgstr "" "Liste der auf der Speicherkarte A des Gerätes vorhandenen Bücher anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:282 msgid "Click to see the books on storage card B in your reader" msgstr "" "Liste der auf der Speicherkarte B des Gerätes vorhandenen Bücher anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:290 msgid "Books located at" -msgstr "" +msgstr "Bücher finden sich in" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:548 msgid "Change Case" msgstr "Groß-/Kleinschreibung ändern" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:549 msgid "Upper Case" msgstr "Großschreibung" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:550 msgid "Lower Case" msgstr "Kleinschreibung" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:551 msgid "Swap Case" msgstr "Groß-/Kleinschreibung vertauschen" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:552 msgid "Title Case" msgstr "Wortanfänge groß schreiben" +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:974 +msgid "Drag to resize" +msgstr "Zur Größenänderung ziehen" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1006 +msgid "Show" +msgstr "Anzeigen" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:1012 +msgid "Hide" +msgstr "Ausblenden" + #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:367 msgid "" "If you use the WordPlayer e-book app on your Android phone, you can access " @@ -9251,48 +9495,48 @@ msgstr "" msgid "Turn on the &content server" msgstr "&Inhalt-Server einschalten" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:270 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:230 msgid "today" msgstr "heute" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:273 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:233 msgid "yesterday" msgstr "gestern" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:276 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:236 msgid "thismonth" msgstr "in diesem Monat" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:279 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:280 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:239 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:240 msgid "daysago" msgstr "vor Tagen" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:430 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:440 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 msgid "no" msgstr "nein" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:430 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:440 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:398 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 msgid "unchecked" msgstr "nicht ausgewählt" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:433 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:443 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 msgid "checked" msgstr "ausgewählt" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:433 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:443 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:401 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 msgid "yes" msgstr "ja" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 msgid "blank" msgstr "leer" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:405 msgid "empty" msgstr "leer" @@ -9824,7 +10068,7 @@ msgstr "" "Default: no filtering" #: /home/kovid/work/calibre/src/calibre/library/cli.py:655 -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:503 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:505 msgid "Show detailed output information. Useful for debugging" msgstr "Detaillierte Ausgabeinformation anzeigen. Hilfreich zur Fehlersuche." @@ -9832,7 +10076,7 @@ msgstr "Detaillierte Ausgabeinformation anzeigen. Hilfreich zur Fehlersuche." msgid "Error: You must specify a catalog output file" msgstr "Fehler: Sie müssen eine Katalog-Ausgabedatei angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:688 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:710 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -9854,7 +10098,7 @@ msgstr "" " Befehls.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:699 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:721 msgid "" "If the column stores multiple values, append the specified values to the " "existing ones, instead of replacing them." @@ -9862,11 +10106,11 @@ msgstr "" "Wenn die Spalte mehrere Werte speichert, sollen die angegebenen Werte zu den " "bestehenden hinzugefügt werden, anstatt sie zu ersetzen." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:710 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:732 msgid "Error: You must specify a field name, id and value" msgstr "Fehler: Sie müssen einen Feldnamen, eine ID und einen Wert angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:729 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:751 msgid "" "\n" " %prog custom_columns [options]\n" @@ -9881,20 +10125,20 @@ msgstr "" "Spaltenbeschriftung und IDs.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:758 msgid "Show details for each column." msgstr "Details jeder Spalte anzeigen." -#: /home/kovid/work/calibre/src/calibre/library/cli.py:748 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:770 msgid "You will lose all data in the column: %r. Are you sure (y/n)? " msgstr "" "Es werden alle Daten gelöscht in der Spalte: %r. Sind Sie sicher (j/n)? " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:750 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:772 msgid "y" msgstr "j" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:756 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:778 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -9911,15 +10155,15 @@ msgstr "" " Spalten mit dem custom_columns Befehl anzeigen lassen.\n" " " -#: /home/kovid/work/calibre/src/calibre/library/cli.py:764 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:786 msgid "Do not ask for confirmation" msgstr "Nicht nach einer Bestätigung fragen" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:774 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:796 msgid "Error: You must specify a column label" msgstr "Fehler: Sie müssen eine Spaltenbeschriftung angeben" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:809 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -9939,43 +10183,47 @@ msgstr "" "\n" "Sie erhalten Hilfe zu einem bestimmten Befehl mit: %%prog command --help\n" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:487 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:70 +msgid "%sAverage rating is %3.1f" +msgstr "%sdie durchschnittliche Bewertung ist %3.1f" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:545 msgid "Main" msgstr "Haupt" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:489 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:547 msgid "Card A" msgstr "Karte A" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:491 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:549 msgid "Card B" msgstr "Karte B" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1542 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1770 msgid "

    Migrating old database to ebook library in %s

    " msgstr "

    Migriere alte Datenbank zu eBook Bibliothek in %s

    " -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1571 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1799 msgid "Copying %s" msgstr "Kopiere %s" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1588 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1816 msgid "Compacting database" msgstr "Komprimiere Datenbank" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1681 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1909 msgid "Checking SQL integrity..." msgstr "Überprüfe SQL Vollständigkeit..." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1720 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1950 msgid "Checking for missing files." msgstr "Überprüfe fehlende Dateien." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1742 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972 msgid "Checked id" msgstr "Überprüfte ID" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:111 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 msgid "Ratings" msgstr "Bewertungen" @@ -10175,6 +10423,10 @@ msgid "" "more than this number of items. Default: %default. Set to a large number to " "disable grouping." msgstr "" +"Elemente in Kategorien wie Autoren / Etiketten nach dem ersten Buchstaben " +"gruppieren, wenn es mehr als diese Anzahl von Elementen gibt. " +"Voreinstellung: %default. Zum Ausschalten der Gruppierung auf eine große " +"Zahl einstellen." #: /home/kovid/work/calibre/src/calibre/library/server/base.py:93 msgid "Password to access your calibre library. Username is " @@ -10200,43 +10452,43 @@ msgstr "" msgid "Write process PID to the specified file" msgstr "Prozess PID in die angegebene Datei schreiben" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:108 msgid "%d books" msgstr "%d Bücher" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:124 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:127 msgid "%d items" msgstr "%d Einträge" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:141 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144 msgid "RATING: %s
    " msgstr "BEWERTUNG: %s
    " -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:147 msgid "TAGS: %s
    " msgstr "ETIKETTEN: %s
    " -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:148 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:151 msgid "SERIES: %s [%s]
    " msgstr "REIHEN: %s [%s]
    " -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:189 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:192 msgid "Library" msgstr "Bibliothek" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:228 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:231 msgid "Books in your library" msgstr "Bücher in Ihrer Bibliothek" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:234 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:237 msgid "By " msgstr "Von " -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:235 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:238 msgid "Books sorted by " msgstr "Bücher sortiert nach " -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:535 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Newest" msgstr "Neuestes" @@ -10312,6 +10564,10 @@ msgstr "Liste der benannten gespeicherten Suchen" #: /home/kovid/work/calibre/src/calibre/utils/config.py:700 msgid "User-created tag browser categories" +msgstr "Benutzererstellte Etiketten-Browser Kategorieen" + +#: /home/kovid/work/calibre/src/calibre/utils/config.py:702 +msgid "Preserve all collections even if not in library metadata." msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43 @@ -10383,34 +10639,38 @@ msgid "English (Pakistan)" msgstr "Englisch (Pakistan)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:106 +msgid "English (Israel)" +msgstr "Englisch (Israel)" + +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:107 msgid "English (Singapore)" msgstr "Englisch (Singapur)" -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:107 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:108 msgid "English (Yemen)" msgstr "Englisch (Jemen)" -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:108 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:109 msgid "English (Ireland)" msgstr "Englisch" -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:109 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:110 msgid "English (China)" msgstr "Englisch (China)" -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:110 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 msgid "Spanish (Paraguay)" msgstr "Spanisch (Paraguay)" -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:112 msgid "German (AT)" msgstr "Deutsch (AT)" -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:112 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:113 msgid "Dutch (NL)" msgstr "Holländisch (NL)" -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:113 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:114 msgid "Dutch (BE)" msgstr "Holländisch (BE)" @@ -10473,93 +10733,93 @@ msgstr "" "Letzte Version der vorgegebenen Downloadschemata nicht vom Calibre Server " "laden" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:43 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:44 msgid "Unknown News Source" msgstr "Nachrichtenquelle unbekannt" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:595 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:608 msgid "The \"%s\" recipe needs a username and password." msgstr "" "Das \"%s\" Downloadschema benötigt einen Benutzernamen und ein Passwort." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:692 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:706 msgid "Download finished" msgstr "Download beendet" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:694 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:708 msgid "Failed to download the following articles:" msgstr "Der Download der folgenden Artikel schlug fehl:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:700 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:714 msgid "Failed to download parts of the following articles:" msgstr "Der Download von Teilen der folgenden Artikel schlug fehl:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:716 msgid " from " msgstr " von " -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:704 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 msgid "\tFailed links:" msgstr "\tFehlgeschlagene Verknüpfungen:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:821 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:807 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" "Konnte Artikel nicht abrufen. Mit -vv starten, um den Grund dafür zu sehen" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:842 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:828 msgid "Fetching feeds..." msgstr "Rufe Feeds ab..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:847 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:833 msgid "Got feeds from index page" msgstr "Feeds der Index-Seite erhalten" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:853 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:839 msgid "Trying to download cover..." msgstr "Umschlagbild versuchen heruterzuladen ..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:855 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:841 msgid "Generating masthead..." msgstr "Erstelle Impressum..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:936 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:922 msgid "Starting download [%d thread(s)]..." msgstr "Download von [%d Thread(s)] starten ..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:952 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:938 msgid "Feeds downloaded to %s" msgstr "Feeds wurden nach %s heruntergeladen" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:962 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:948 msgid "Could not download cover: %s" msgstr "Umschlagbild konnte nicht heruntergeladen werden: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:974 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:960 msgid "Downloading cover from %s" msgstr "Umschlagbild von %s herunterladen" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1009 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1000 msgid "Masthead image downloaded" msgstr "Impressumskopie geladen" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1205 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1190 msgid "Untitled Article" msgstr "Artikel ohne Titel" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1276 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1261 msgid "Article downloaded: %s" msgstr "Artikel heruntergeladen: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1287 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1272 msgid "Article download failed: %s" msgstr "Herunterladen der Artikel schlug fehl: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1304 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1289 msgid "Fetching feed" msgstr "Feed abrufen" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1451 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1436 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." @@ -10567,7 +10827,7 @@ msgstr "" "Login fehlgeschlagen, überprüfen Sie ihren Benutzername und Passwort für den " "calibre Magazin Service." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1467 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1452 msgid "" "You do not have permission to download this issue. Either your subscription " "has expired or you have exceeded the maximum allowed downloads for today." @@ -10582,16 +10842,16 @@ msgstr "Sie" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:73 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:82 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:181 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:183 msgid "Scheduled" msgstr "Geplant" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:182 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:184 msgid "Custom" msgstr "Angepasst" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:480 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 msgid "" "%prog URL\n" "\n" @@ -10601,13 +10861,13 @@ msgstr "" "\n" "URL ist z.B. http://google.com" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:483 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:485 msgid "Base directory into which URL is saved. Default is %default" msgstr "" "Grundverzeichnis, in das die URL gespeichert wird. Voreinstellung ist " "%default" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:486 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:488 msgid "" "Timeout in seconds to wait for a response from the server. Default: %default " "s" @@ -10615,7 +10875,7 @@ msgstr "" "Timeout in Sekunden beim Warten auf eine Antwort vom Server. Voreinstellung: " "%default s" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:489 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:491 msgid "" "Maximum number of levels to recurse i.e. depth of links to follow. Default " "%default" @@ -10623,7 +10883,7 @@ msgstr "" "Maximale Zahl von einbezogenen Ebenen, z.B. Tiefe der Links, die verfolgt " "werden. Voreinstellung %default" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:492 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 msgid "" "The maximum number of files to download. This only applies to files from tags. Default is %default" @@ -10631,7 +10891,7 @@ msgstr "" "Höchstzahl der Dateien, die geladen werden. Dies trifft nur auf Dateien aus " " Tags zu. Voreinstellung ist %default" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 msgid "" "Minimum interval in seconds between consecutive fetches. Default is %default " "s" @@ -10639,7 +10899,7 @@ msgstr "" "Kleinstes Intervall in Sekunden zwischen aufeinander folgenden Abrufen. " "Voreinstellung ist %default s" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 msgid "" "The character encoding for the websites you are trying to download. The " "default is to try and guess the encoding." @@ -10647,7 +10907,7 @@ msgstr "" "Zeichenkodierung für Webseiten, die zu laden versucht werden. In der " "Voreinstellung wird versucht, die Kodierung zu erraten." -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:500 msgid "" "Only links that match this regular expression will be followed. This option " "can be specified multiple times, in which case as long as a link matches any " @@ -10658,7 +10918,7 @@ msgstr "" "sie einem regulären Ausdruck entsprechen. In der Voreinstellung werden alle " "Links verfolgt." -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:500 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:502 msgid "" "Any link that matches this regular expression will be ignored. This option " "can be specified multiple times, in which case as long as any regexp matches " @@ -10672,7 +10932,7 @@ msgstr "" "Links ignoriert. Falls beide --filter-regexp und --match-regexp angegeben " "sind, wird --filter-regexp zuerst angewendet." -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:502 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:504 msgid "Do not download CSS stylesheets." msgstr "CSS-Stylesheets nicht herunterladen." @@ -10976,6 +11236,18 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ msgid "Usage:" #~ msgstr "Benutzung:" +#~ msgid "" +#~ "\n" +#~ "%prog [options] ISBN\n" +#~ "\n" +#~ "Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" +#~ msgstr "" +#~ "\n" +#~ "%prog [options] ISBN\n" +#~ "\n" +#~ "Umschlagbild des Buches mit der angegebenen ISBN von LibraryThing.com " +#~ "abrufen\n" + #~ msgid "Usage: %s file.lit" #~ msgstr "Benutzung: %s dateiname.lit" @@ -11169,6 +11441,39 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ msgid "Send to storage card" #~ msgstr "An Speicherkarte senden" +#~ msgid "Device database corrupted" +#~ msgstr "Gerätedatenbank ist beschädigt" + +#~ msgid "" +#~ "\n" +#~ "

    The database of books on the reader is corrupted. Try the " +#~ "following:\n" +#~ "

      \n" +#~ "
    1. Unplug the reader. Wait for it to finish regenerating " +#~ "the database (i.e. wait till it is ready to be used). Plug it back in. Now " +#~ "it should work with %(app)s. If not try the next step.
    2. \n" +#~ "
    3. Quit %(app)s. Find the file media.xml in the reader's " +#~ "main memory. Delete it. Unplug the reader. Wait for it to regenerate the " +#~ "file. Re-connect it and start %(app)s.
    4. \n" +#~ "
    \n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ "

    Die Bücherdatenbank des Gerätes ist beschädigt. Versuchen " +#~ "Sie folgendes:\n" +#~ "

      \n" +#~ "
    1. Entfernen Sie das Gerät. Warten Sie, bis das Gerät die " +#~ "Datenbank wiederhergestellt hat (d.h. warten Sie, bis das Gerät wieder " +#~ "benutzt werden kann). Stecken Sie das Gerät wieder an. Nun sollte es mit " +#~ "%(app)s funktionieren. Falls nicht, versuchen Sie den nächsten " +#~ "Schritt.
    2. \n" +#~ "
    3. Schließen Sie %(app)s. Suchen Sie die Datei media.xml im " +#~ "Hauptspeicher des Gerätes. Löschen Sie sie. Entfernen Sie das Gerät. Warten " +#~ "Sie, bis das Gerät die Datei wiederhergestellt hat. Stecken Sie das Gerät " +#~ "wieder an und starten Sie %(app)s.
    4. \n" +#~ "
    \n" +#~ " " + #~ msgid "" #~ "

    Books with the same title as the following already exist in the database. " #~ "Add them anyway?