diff --git a/Changelog.yaml b/Changelog.yaml index 4997cca255..2e12b8bfbc 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -4,6 +4,142 @@ # for important features/bug fixes. # Also, each release can have new and improved recipes. +- 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/icons/library.icns b/icons/library.icns index 39813eb8e6..1b796e2fe0 100644 Binary files a/icons/library.icns and b/icons/library.icns differ diff --git a/icons/library.ico b/icons/library.ico index 433b4f2d51..32ce8b5d0d 100644 Binary files a/icons/library.ico and b/icons/library.ico differ diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index bda839b28f..aaeb992151 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -71,3 +71,5 @@ gui_pubdate_display_format = 'MMM yyyy' # order until the title is edited. Double-clicking on a title and hitting return # without changing anything is sufficient to change the sort. title_series_sorting = 'library_order' + + diff --git a/resources/images/bookmarks.svg b/resources/images/bookmarks.svg index 2fcd844283..6964853702 100644 --- a/resources/images/bookmarks.svg +++ b/resources/images/bookmarks.svg @@ -1,7 +1,6 @@ + sodipodi:docbase="/home/dobey/Projects/gnome-icon-theme/scalable/apps" + sodipodi:docname="accessories-dictionary.svg" + inkscape:export-filename="/home/ulisse/Desktop/accessories-dictionary.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> - - - - - - - - - - - - - - - - + id="linearGradient2309"> + id="stop2311" /> + id="stop2313" /> + id="linearGradient2301"> + id="stop2303" /> + id="stop2305" /> + inkscape:collect="always" + id="linearGradient2286"> + id="stop2288" /> - - + id="stop2290" /> + inkscape:collect="always" + id="linearGradient2276"> + id="stop2278" /> + id="stop2280" /> + inkscape:collect="always" + id="linearGradient2258"> + id="stop2260" /> + id="stop2262" /> + + + + + + + + + style="stop-color:#babdb6" /> + style="stop-color:#d3d7cf;stop-opacity:0;" /> + inkscape:collect="always" + id="linearGradient2184"> + id="stop2186" /> + id="stop2188" /> + gradientTransform="matrix(-1,0,0,1,48,0)" /> + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + inkscape:grid-points="true" + gridspacingx="0.5px" + gridspacingy="0.5px" + gridempspacing="2" + inkscape:window-width="872" + inkscape:window-height="694" + inkscape:window-x="0" + inkscape:window-y="25" + fill="#75507b" /> @@ -458,133 +249,108 @@ image/svg+xml + + + Ulisse Perusin + + + Dictionary + + + dictionary + translation + + + + + + + + + + + - - - + style="opacity:0.50196078;color:#000000;fill:url(#radialGradient2292);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:17.85;stroke-opacity:1;visibility:visible;display:block;overflow:visible" + id="path2284" + sodipodi:cx="24" + sodipodi:cy="36.75" + sodipodi:rx="22.5" + sodipodi:ry="6.75" + d="M 46.5 36.75 A 22.5 6.75 0 1 1 1.5,36.75 A 22.5 6.75 0 1 1 46.5 36.75 z" + transform="matrix(1.066667,0,0,0.962963,-1.600001,1.111111)" /> + style="color:#000000;fill:#523856;fill-opacity:1;fill-rule:nonzero;stroke:#3e263b;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:17.85;stroke-opacity:1;visibility:visible;display:block;overflow:visible" + d="M 4.5,11.5 L 43.5,11.5 L 47.5,38.5 L 29,38.5 L 28,37.5 C 26,39 22,39 20,37.5 L 19,38.5 L 0.5,38.5 L 4.5,11.5 z " + id="rect1304" + sodipodi:nodetypes="ccccccccc" /> + sodipodi:type="inkscape:offset" + inkscape:radius="-0.91809106" + inkscape:original="M 4.5 11.5 L 0.5 38.5 L 19 38.5 L 20 37.5 C 22 39 26 39 28 37.5 L 29 38.5 L 47.5 38.5 L 43.5 11.5 L 4.5 11.5 z " + xlink:href="#rect1304" + style="opacity:0.13333333;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:17.85;stroke-opacity:1;visibility:visible;display:block;overflow:visible" + id="path2274" + inkscape:href="#rect1304" + d="M 5.28125,12.40625 L 1.5625,37.59375 L 18.59375,37.59375 L 19.34375,36.84375 C 19.667151,36.507336 20.191452,36.467006 20.5625,36.75 C 21.327469,37.323727 22.653015,37.71875 24,37.71875 C 25.346985,37.71875 26.672531,37.323727 27.4375,36.75 C 27.808548,36.467006 28.332849,36.507336 28.65625,36.84375 L 29.40625,37.59375 L 46.4375,37.59375 L 42.71875,12.40625 L 5.28125,12.40625 z " /> + style="fill:url(#linearGradient2282);fill-opacity:1.0;fill-rule:evenodd;stroke:#888a85;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 2,36.5 C 7.6666667,36.5 16,35 19,36.5 C 22,34 26,34 29,36.5 C 32,35 41,36.5 46,36.5 L 45.5,34 C 38.5,31.5 29,28.5 24,33 C 19,28.5 9.5,31.5 2.5,34 L 2,36.5 z " + id="path2180" + sodipodi:nodetypes="cccccccc" /> + sodipodi:type="inkscape:offset" + inkscape:radius="-1.0582203" + inkscape:original="M 14 30.875 C 10.125 31.375 6 32.75 2.5 34 L 2 36.5 C 7.6666667 36.5 16 35 19 36.5 C 22 34 26 34 29 36.5 C 32 35 41 36.5 46 36.5 L 45.5 34 C 38.5 31.5 29 28.5 24 33 C 21.5 30.75 17.875 30.375 14 30.875 z " + xlink:href="#path2180" + style="opacity:0.30196078;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2315);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path2266" + inkscape:href="#path2180" + d="M 14.375,31.9375 C 10.963293,32.392394 7.260823,33.622273 3.90625,34.8125 L 3.8125,35.34375 C 6.2979599,35.262594 9.0476285,35.037732 11.6875,34.875 C 14.462294,34.703951 16.881256,34.711661 18.78125,35.40625 C 20.133116,34.409774 21.661646,33.894157 23.21875,33.75 C 21.042747,31.830616 17.941674,31.461944 14.375,31.9375 z M 28.625,31.9375 C 27.145571,32.213473 25.86037,32.798142 24.78125,33.75 C 26.338354,33.894157 27.866884,34.409774 29.21875,35.40625 C 31.163554,34.697135 33.704549,34.703523 36.5625,34.875 C 39.261382,35.036933 41.920385,35.260963 44.1875,35.34375 L 44.09375,34.8125 C 40.739177,33.622273 37.036707,32.392394 33.625,31.9375 C 31.827105,31.697781 30.128781,31.656984 28.625,31.9375 z " /> + style="fill:url(#linearGradient2245);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2247);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 2.5,34 C 9,31.5 20,29 24,33 C 28,29 39,31.5 45.5,34 L 42.5,10.5 C 37,8 27.5,6 24,9 C 20,6 12,8 5.5,10.5 L 2.5,34 z " + id="path2182" + sodipodi:nodetypes="ccccccc" /> - - - - - - - + style="color:#000000;fill:url(#linearGradient2211);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:17.85;stroke-opacity:1;visibility:visible;display:block;overflow:visible" + d="M 24,9.5 C 25.221264,8.803878 26.327771,7.9069322 28,8 L 29,30.5 C 27.5,30 25.5,31.5 24,32.5 L 24,9.5 z " + id="path2195" + sodipodi:nodetypes="ccccc" /> + + diff --git a/resources/images/devices/folder.svg b/resources/images/devices/folder.svg index 74c1d628e4..e0d6f6b8be 100644 --- a/resources/images/devices/folder.svg +++ b/resources/images/devices/folder.svg @@ -9,544 +9,700 @@ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.0" - x="0.0000000" - y="0.0000000" - width="48.000000px" - height="48.000000px" - id="svg1" + width="128" + height="128" + id="svg2811" sodipodi:version="0.32" - inkscape:version="0.44" - sodipodi:docname="folder.svg" - sodipodi:docbase="/home/lapo/Icone/Crux/crux-icon-theme/scalable/places" - inkscape:export-filename="/home/lapo/Icone/Crux/folderx-daritaliare.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> + inkscape:version="0.45.1" + version="1.0" + sodipodi:docname="folder-downloads.svgz" + inkscape:output_extension="org.inkscape.output.svgz.inkscape" + inkscape:export-filename="folder-downloads.png" + inkscape:export-xdpi="11.25" + inkscape:export-ydpi="11.25" + sodipodi:docbase="/home/david/oxygen/trunk/scalable/places"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="metadata2816"> image/svg+xml - Folder - - - Lapo Calamandrei - - - 2006-06-26 - - - - - folder - directory - storage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="layer1"> + - + id="g17" + style="opacity:0.6;filter:url(#filter2807)" + transform="matrix(1.0033404,0,0,1,-8.2374684,8)"> - + d="M 132,96 C 132,98.2 128.4,100 124,100 L 20,100 C 15.6,100 12,98.2 12,96 C 12,93.8 15.6,92 20,92 L 124,92 C 128.4,92 132,93.8 132,96 z" + id="path19" /> + + + + + + id="g2450" + inkscape:label="Livello 1" + transform="translate(-2.4797995e-7,16)"> - - - - - - - - - + d="M 88,103.99999 C 88,106.20914 77.254827,108 63.999997,108 C 50.745166,108 40,106.20914 40,103.99999 C 40,101.79086 50.745166,100 63.999997,100 C 77.254827,100 88,101.79086 88,103.99999 L 88,103.99999 z " + style="opacity:0.3;fill:url(#radialGradient4545);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1" + id="path4543" /> + transform="matrix(1,0,0,0.9756098,-72.426501,80.585366)" + id="g9589"> + style="fill:url(#linearGradient9614)" + d="M 122.40803,-58 C 121.11995,-58 120.07225,-56.801009 120.07225,-55.327765 C 120.07225,-55.327765 120.07225,-20.243475 120.07225,-17.752469 C 118.07565,-17.752469 105.76289,-17.752469 105.76289,-17.752469 C 104.82364,-17.752469 103.98018,-17.113701 103.61327,-16.125567 C 103.61266,-16.122801 103.4265,-15.080231 103.4265,-15.080231 C 103.4265,-14.384954 103.65845,-13.726198 104.08019,-13.22662 L 134.74308,23.18138 C 135.18048,23.70094 135.7944,24 136.42579,24 C 137.05778,24 137.6705,23.70094 138.1085,23.18138 L 168.772,-13.22662 C 169.42327,-14.000449 169.60703,-15.136741 169.23953,-16.125567 C 168.87081,-17.115074 168.02735,-17.751777 167.08929,-17.751777 C 167.08929,-17.751777 154.77654,-17.751777 152.77994,-17.751777 C 152.77994,-20.243475 152.77994,-55.327076 152.77994,-55.327076 C 152.77933,-56.801009 151.73164,-58 150.44355,-58 L 122.40803,-58 z " + id="path49" /> + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + style="opacity:0.5;fill:#ffffff" + enable-background="new " + d="M 152.77933,-15.331057 C 154.77534,-15.331057 167.08869,-15.331057 167.08869,-15.331057 C 168.02794,-15.331057 168.87021,-14.692971 169.23832,-13.704155 C 169.2594,-13.646273 169.27387,-13.585625 169.29193,-13.527062 C 169.48051,-14.144468 169.47147,-14.830788 169.23832,-15.457162 C 168.87021,-16.445977 168.02614,-17.084064 167.08869,-17.084064 C 167.08869,-17.084064 154.77534,-17.084064 152.77933,-17.084064 C 152.77933,-16.201364 152.77933,-15.589458 152.77933,-15.331057 z " + id="path74" /> + + + + + + + + diff --git a/resources/images/library.png b/resources/images/library.png index bd3b90bfb1..cd2c9075b6 100644 Binary files a/resources/images/library.png and b/resources/images/library.png differ diff --git a/resources/images/news/akter.png b/resources/images/news/akter.png new file mode 100644 index 0000000000..60c352849e Binary files /dev/null and b/resources/images/news/akter.png differ diff --git a/resources/images/series.svg b/resources/images/series.svg index c26d1ef7a2..f2eb87b709 100644 --- a/resources/images/series.svg +++ b/resources/images/series.svg @@ -1,1096 +1,1071 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + id="linearGradient6642"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + 2007-06-23 + + + Lapo Calamandrei + + + + + address + book + contact + + + + + + + Andreas Nilsson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/user_profile.svg b/resources/images/user_profile.svg index 5a51783d7c..0aecc0c1f7 100644 --- a/resources/images/user_profile.svg +++ b/resources/images/user_profile.svg @@ -1,9 +1,8 @@ + inkscape:export-filename="/home/pinheiro/pics/oxygen/scalable/actions/im-user.png" + inkscape:export-xdpi="180" + inkscape:export-ydpi="180"> + inkscape:window-x="20" + inkscape:window-y="356"> + empspacing="2" + visible="true" + enabled="true" /> - - - - + id="linearGradient4336"> + style="stop-color:#183069;stop-opacity:1" /> + + + + + id="stop4328" /> + + + style="stop-color:#b5e5ec;stop-opacity:1;" /> - - - - - - - + + id="linearGradient3784"> + id="stop3786" /> - - - - - - - - - - - - - + id="stop3788" /> - - - - - + id="linearGradient3680"> + id="stop3682" /> + id="stop3684" /> - - - - - - - + id="linearGradient3993"> + id="stop3995" /> + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="stop3639" /> + style="stop-color:#f2efef;stop-opacity:0;" /> + + - - - - + id="stop3641" /> + id="linearGradient3353"> + id="stop3355" /> + id="stop3357" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="linearGradient3790" + xlink:href="#linearGradient3691" + inkscape:collect="always" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + y2="103.5" + x2="58" + y1="38.876087" + x1="58" + id="linearGradient3697" + xlink:href="#linearGradient3691" + inkscape:collect="always" /> + + + + id="filter3648" + inkscape:collect="always"> + id="feGaussianBlur3650" + stdDeviation="1.2346784" + inkscape:collect="always" /> + gradientUnits="userSpaceOnUse" + y2="5.5514274" + x2="72.138878" + y1="118.03125" + x1="42" + id="linearGradient3638" + xlink:href="#linearGradient3632" + inkscape:collect="always" /> + id="linearGradient3517"> + style="stop-color:#403a3a;stop-opacity:1;" /> + style="stop-color:#6a5252;stop-opacity:1;" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="stop-color:#084775;stop-opacity:1;" /> + style="stop-color:#084775;stop-opacity:0" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + inkscape:collect="always" /> - - - - - - - - - - - - - - + id="radialGradient3213" + xlink:href="#linearGradient6666" + inkscape:collect="always" /> + + + + @@ -3633,897 +4158,74 @@ + style="stop-color:#63e9ff;stop-opacity:1;" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="stop-color:#000000;stop-opacity:1;" /> + id="linearGradient3022"> + id="stop3024" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + id="stop3026" + offset="1" + style="stop-color:#ffffff;stop-opacity:0" /> - - - - - - - - - + - + gradientTransform="matrix(1.0732128,0,0,1.0016658,-3.0892676,-0.94553)" + cx="55.369141" + cy="36.077316" + fx="54.83873" + fy="18.270697" + r="29.958668" /> - - - - - - - - + gradientTransform="matrix(0.8355412,0,0,0.8355412,9.54541,6.1308791)" + cx="63.491623" + cy="32.737198" + fx="71.005272" + fy="16.636555" + r="29.958668" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + cx="76.61216" + cy="25.895178" + fx="76.61216" + fy="25.895178" + r="3.8909853" /> @@ -4540,211 +4242,125 @@ inkscape:groupmode="layer" id="layer1" inkscape:label="Livello 1"> - - + sodipodi:type="arc" + style="fill:#493a3a;fill-opacity:1;stroke:none;stroke-width:3.1559999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter3766)" + id="path3716" + sodipodi:cx="63.865829" + sodipodi:cy="108.4109" + sodipodi:rx="41.861637" + sodipodi:ry="13.953878" + d="M 105.72747,108.4109 A 41.861637,13.953878 0 1 1 22.004192,108.4109 A 41.861637,13.953878 0 1 1 105.72747,108.4109 z" + transform="matrix(0.8610583,0,0,1.1808092,8.9931858,-19.441249)" /> + + + id="g3667" + clip-path="url(#clipPath3672)" + transform="matrix(1.0318769,0,0,0.9592734,-193.23402,4.9968612)"> + sodipodi:nodetypes="ccssccccscc" + transform="matrix(0.9684996,0,0,0.9684996,57.597648,1.2865934)" + id="path2516" + d="M 197.93476,41.25676 C 178.83618,41.25676 163.58935,77.148733 160.36001,104.4375 C 160.36001,123.62773 190.15496,125.61824 197.72825,125.61824 C 197.7356,125.61824 197.75231,125.61824 197.7595,125.61824 C 205.31824,125.61824 234.84924,123.62773 234.84924,104.4375 C 231.4185,72.204942 216.87204,41.25676 197.93476,41.25676 z M 200.02851,43.41301 C 214.889,43.980691 227.54879,69.326918 230.69299,96.0625 C 230.69299,112.08025 206.13116,113.68074 199.822,113.68074 C 193.50071,113.68074 168.70376,115.02319 168.70376,99.005437 C 171.39923,76.227974 184.08728,43.41301 200.02851,43.41301 z" + style="opacity:0.25742569999999998;fill:#eafafe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99886125000000003px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3495)" /> + sodipodi:nodetypes="ccssccccscc" + transform="matrix(0.9684996,0,0,0.9684996,57.597648,1.2865934)" + id="path2537" + d="M 198.96728,41.360012 C 179.8687,41.360012 164.10561,77.148733 160.87627,104.4375 C 160.87627,123.62773 190.05171,124.99873 197.625,124.99873 C 197.63235,124.99873 197.64906,124.99873 197.65625,124.99873 C 205.21499,124.99873 235.46875,123.62773 235.46875,104.4375 C 232.03801,72.204942 217.90456,41.360012 198.96728,41.360012 z M 199.90351,42.322002 C 215.65743,43.322839 229.83784,70.140297 233.0625,98.46875 C 233.0625,115.44731 206.28135,118.97911 199.59375,118.97911 C 192.89328,118.97911 166.15626,115.44731 166.15625,98.46875 C 169.01341,74.325009 183.00605,42.322001 199.90351,42.322002 z" + style="opacity:0.40099009000000002;fill:#bdf2f8;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99886125000000003px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3663)" /> - - - - - - - - - - - - - - - - - - - - - - - - - - + sodipodi:nodetypes="ccsscczccc" + transform="matrix(0.9684996,0,0,0.9684996,57.597648,1.2865934)" + id="path2532" + d="M 197.625,41.360012 C 178.52642,41.360012 163.4861,77.148733 160.25676,104.4375 C 160.25676,123.62773 190.05171,125.72149 197.625,125.72149 C 197.63235,125.72149 197.64906,125.72149 197.65625,125.72149 C 205.21499,125.72149 234.95249,123.62773 234.95249,104.4375 C 234.90604,104.00109 234.84709,103.56102 234.79624,103.125 C 232.58293,119.25119 206.73566,122.57174 199.71875,122.6519 C 192.70184,122.73207 162.75758,120.63074 163.38049,100.9375 C 166.37412,75.640551 181.11468,42.692918 198.6875,41.422512 C 198.33685,41.400903 197.97811,41.360012 197.625,41.360012 z" + style="fill:#e4feff;fill-opacity:0.79679143;fill-rule:evenodd;stroke:none;stroke-width:0.99886125000000003px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3774)" /> + transform="matrix(0.946764,0,0,0.8801491,3.3259234,11.287281)" + style="fill:url(#linearGradient4009);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.1559999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter3814)" + d="M 64,45.28125 C 58.61557,45.611764 54.332479,48.157908 50.78125,51.6875 C 47.230021,55.217092 44.424248,59.731411 42,64.03125 C 36.347803,74.634652 32.430243,87.973463 31.0625,99.53125 C 31.065061,99.541509 31.065061,99.552241 31.0625,99.5625 L 31.03125,99.625 L 31.03125,99.65625 L 31.03125,99.71875 C 31.03125,104.10805 32.814214,107.68163 35.5,110.34375 C 38.18635,113.00642 41.763778,114.82712 45.4375,116.125 C 52.785067,118.72079 60.686983,119.21875 64,119.21875 C 64.006105,119.21875 64.025043,119.21875 64.03125,119.21875 C 67.338519,119.21875 75.26711,118.7205 82.625,116.125 C 86.303839,114.82729 89.871488,113.00627 92.5625,110.34375 C 95.252813,107.68192 97.03125,104.10891 97.03125,99.71875 L 97.03125,99.65625 L 97.03125,99.625 L 97,99.5625 C 96.997439,99.552241 96.997439,99.541509 97,99.53125 C 95.552488,85.931548 91.586992,72.552193 85.90625,62.4375 C 80.225511,52.322811 72.716586,45.28125 64,45.28125 z M 63.25,52.446408 C 63.501174,52.435473 63.750895,52.446408 64,52.446408 C 71.954105,52.446406 80.547688,57.191422 85.96875,66.84375 C 91.37694,76.473151 92.587537,86.615125 94,99.8125 C 94.003667,99.84677 93.99928,99.868237 94,99.875 C 93.934354,103.7566 92.419812,106.2708 90.125,108.0625 C 87.830188,109.8542 84.773804,110.93126 81.625,111.9375 C 74.807181,114.34249 67.007501,114.28125 64.03125,114.28125 C 64.025479,114.28125 64.006117,114.28125 64,114.28125 C 61.021495,114.28125 53.237511,114.33208 46.4375,111.9375 C 46.427523,111.93517 46.416219,111.93983 46.40625,111.9375 C 43.026683,111.14643 40.094884,109.98788 37.9375,108.09375 C 35.773752,106.19403 34.381987,103.54125 34.0625,99.84375 C 35.388215,88.709434 37.237655,78.165168 42.65625,68 C 46.764486,60.611645 55.463591,52.785402 63.25,52.446408 z" + id="path3991" + sodipodi:nodetypes="csccccccsssssscccccsccssssscsssssccc" /> + sodipodi:type="arc" + style="fill:url(#radialGradient4322);fill-opacity:1;stroke:none;stroke-width:3.40000010000000019;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path2563" + sodipodi:cx="58.041332" + sodipodi:cy="37.27911" + sodipodi:rx="29.958668" + sodipodi:ry="29.958668" + d="M 88,37.27911 A 29.958668,29.958668 0 1 1 28.082664,37.27911 A 29.958668,29.958668 0 1 1 88,37.27911 z" + transform="matrix(0.844028,0,0,0.844028,14.927656,-4.6758122)" /> + + + + + + - diff --git a/resources/recipes/akter.recipe b/resources/recipes/akter.recipe new file mode 100644 index 0000000000..3959fff717 --- /dev/null +++ b/resources/recipes/akter.recipe @@ -0,0 +1,78 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +akter.co.rs +''' + +import re +from calibre.web.feeds.news import BasicNewsRecipe + +class Akter(BasicNewsRecipe): + title = 'AKTER' + __author__ = 'Darko Miletic' + description = 'AKTER - nedeljni politicki magazin savremene Srbije' + publisher = 'Akter Media Group d.o.o.' + 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 + use_embedded_content = False + encoding = 'utf-8' + masthead_url = 'http://www.akter.co.rs/templates/gk_thenews2/images/style2/logo.png' + language = 'sr' + 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)} + @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} + .color-2{display:block; margin-bottom: 10px; padding: 5px, 10px; + border-left: 1px solid #D00000; color: #D00000} + img{margin-bottom: 0.8em} """ + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + , 'linearize_tables' : True + } + + preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')] + + feeds = [ + (u'Politika' , u'http://www.akter.co.rs/index.php/politikaprint.html' ) + ,(u'Ekonomija' , u'http://www.akter.co.rs/index.php/ekonomijaprint.html') + ,(u'Life&Style' , u'http://www.akter.co.rs/index.php/lsprint.html' ) + ,(u'Sport' , u'http://www.akter.co.rs/index.php/sportprint.html' ) + ] + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + return self.adeify_images(soup) + + def print_version(self, url): + return url + '?tmpl=component&print=1&page=' + + 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':['sectiontableentry1','sectiontableentry2']}): + link = item.find('a') + url = self.PREFIX + link['href'] + title = self.tag_to_string(link) + articles.append({ + 'title' :title + ,'date' :'' + ,'url' :url + ,'description':'' + }) + totalfeeds.append((feedtitle, articles)) + return totalfeeds + diff --git a/resources/recipes/auto.recipe b/resources/recipes/auto.recipe new file mode 100644 index 0000000000..959b9997a8 --- /dev/null +++ b/resources/recipes/auto.recipe @@ -0,0 +1,63 @@ +#!/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__ = '14062010' +__description__ = 'Italian daily newspaper' + +''' +http://www.corrieredellosport.it/ +''' +from calibre.web.feeds.news import BasicNewsRecipe + +class Auto(BasicNewsRecipe): + __author__ = 'Gabriele Marini' + description = 'Auto and Formula 1' + + cover_url = 'http://www.auto.it/res/imgs/logo_Auto.png' + + + title = u'Auto' + publisher = 'CONTE Editore' + category = 'Sport' + + language = 'it' + timefmt = '[%a, %d %b, %Y]' + + oldest_article = 60 + max_articles_per_feed = 30 + use_embedded_content = False + recursion = 10 + + 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')] + + + feeds = [ + (u'Tutte le News' , u'http://www.auto.it/rss/articoli.xml' ), + (u'Prove su Strada' , u'http://www.auto.it/rss/prove+6.xml'), + (u'Novit\xe0' , u'http://www.auto.it/rss/novita+3.xml') + ] + + + + 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/corriere_dello_sport.recipe b/resources/recipes/corriere_dello_sport.recipe new file mode 100644 index 0000000000..ac93c702e3 --- /dev/null +++ b/resources/recipes/corriere_dello_sport.recipe @@ -0,0 +1,60 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__author__ = 'GabrieleMarini, based on Darko Miletic' +__copyright__ = '2009, Darko Miletic , Gabriele Marini' +__version__ = ' ' +__date__ = '14-06-2010' +__description__ = 'Italian daily newspaper' + +''' +http://www.corrieredellosport.it/ +''' +from calibre.web.feeds.news import BasicNewsRecipe + +class ilCorrieredelloSport(BasicNewsRecipe): + __author__ = 'Gabriele Marini' + description = 'Italian daily newspaper' + + cover_url = 'http://edicola.corrieredellosport.it/newsmem/corsport/prima/nazionale_prima.jpg' + + + title = u'Il Corriere dello Sport' + publisher = 'CORRIERE DELLO SPORT s.r.l. ' + category = 'Sport' + + language = 'it' + timefmt = '[%a, %d %b, %Y]' + + oldest_article = 10 + max_articles_per_feed = 100 + use_embedded_content = False + recursion = 10 + + 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='h1', attrs={'class':['tit_Article']}), + dict(name='h1', attrs={'class':['tit_Article_mondiali']}), + dict(name='div', attrs={'class':['box_Img']}), + dict(name='p', attrs={'class':['summary','text']})] + + + + + feeds = [ + (u'Primo Piano' , u'http://www.corrieredellosport.it/rss/primo_piano.xml' ), + (u'Calcio' , u'http://www.corrieredellosport.it/rss/Calcio-3.xml'), + (u'Formula 1' , u'http://www.corrieredellosport.it/rss/Formula-1-7.xml'), + (u'Moto' , u'http://www.corrieredellosport.it/rss/Moto-8.xml'), + (u'Piu visti' , u'http://www.corrieredellosport.it/rss/piu_visti.xml') + ] diff --git a/resources/recipes/danas.recipe b/resources/recipes/danas.recipe index d82928e323..159553370a 100644 --- a/resources/recipes/danas.recipe +++ b/resources/recipes/danas.recipe @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- __license__ = 'GPL v3' __copyright__ = '2008-2010, Darko Miletic ' ''' @@ -23,7 +22,14 @@ class Danas(BasicNewsRecipe): language = 'sr' publication_type = 'newspaper' remove_empty_feeds = True - extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} .article_description,body,.lokacija{font-family: Tahoma,Arial,Helvetica,sans1,sans-serif} .nadNaslov,h1,.preamble{font-family: Georgia,"Times New Roman",Times,serif1,serif} .antrfileText{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; margin-bottom: 0; margin-top: 0} h2,.datum,.lokacija,.autor{font-size: small} .antrfileNaslov{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; font-weight:bold; margin-bottom: 0; margin-top: 0} img{margin-bottom: 0.8em} ' + extra_css = """ @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} + @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} + .article_description,body,.lokacija{font-family: Tahoma,Arial,Helvetica,sans1,sans-serif} + .nadNaslov,h1,.preamble{font-family: Georgia,"Times New Roman",Times,serif1,serif} + .antrfileText{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; + margin-bottom: 0; margin-top: 0} h2,.datum,.lokacija,.autor{font-size: small} + .antrfileNaslov{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; + font-weight:bold; margin-bottom: 0; margin-top: 0} img{margin-bottom: 0.8em} """ conversion_options = { 'comment' : description @@ -42,19 +48,32 @@ class Danas(BasicNewsRecipe): ] feeds = [ - (u'Politika' , u'http://www.danas.rs/rss/rss.asp?column_id=27') - ,(u'Hronika' , u'http://www.danas.rs/rss/rss.asp?column_id=2' ) - ,(u'Dru\xc5\xa1tvo', u'http://www.danas.rs/rss/rss.asp?column_id=24') - ,(u'Dijalog' , u'http://www.danas.rs/rss/rss.asp?column_id=1' ) - ,(u'Ekonomija', u'http://www.danas.rs/rss/rss.asp?column_id=6' ) - ,(u'Svet' , u'http://www.danas.rs/rss/rss.asp?column_id=25') - ,(u'Srbija' , u'http://www.danas.rs/rss/rss.asp?column_id=28') - ,(u'Kultura' , u'http://www.danas.rs/rss/rss.asp?column_id=5' ) - ,(u'Sport' , u'http://www.danas.rs/rss/rss.asp?column_id=13') - ,(u'Scena' , u'http://www.danas.rs/rss/rss.asp?column_id=42') - ,(u'Feljton' , u'http://www.danas.rs/rss/rss.asp?column_id=19') - ,(u'Periskop' , u'http://www.danas.rs/rss/rss.asp?column_id=4' ) - ,(u'Famozno' , u'http://www.danas.rs/rss/rss.asp?column_id=47') + (u'Politika' , u'http://www.danas.rs/rss/rss.asp?column_id=27') + ,(u'Hronika' , u'http://www.danas.rs/rss/rss.asp?column_id=2' ) + ,(u'Drustvo' , u'http://www.danas.rs/rss/rss.asp?column_id=24') + ,(u'Dijalog' , u'http://www.danas.rs/rss/rss.asp?column_id=1' ) + ,(u'Ekonomija' , u'http://www.danas.rs/rss/rss.asp?column_id=6' ) + ,(u'Svet' , u'http://www.danas.rs/rss/rss.asp?column_id=25') + ,(u'Srbija' , u'http://www.danas.rs/rss/rss.asp?column_id=28') + ,(u'Kultura' , u'http://www.danas.rs/rss/rss.asp?column_id=5' ) + ,(u'Sport' , u'http://www.danas.rs/rss/rss.asp?column_id=13') + ,(u'Scena' , u'http://www.danas.rs/rss/rss.asp?column_id=42') + ,(u'Feljton' , u'http://www.danas.rs/rss/rss.asp?column_id=19') + ,(u'Periskop' , u'http://www.danas.rs/rss/rss.asp?column_id=4' ) + ,(u'Famozno' , u'http://www.danas.rs/rss/rss.asp?column_id=47') + ,(u'Sluzbena beleska' , u'http://www.danas.rs/rss/rss.asp?column_id=48') + ,(u'Suocavanja' , u'http://www.danas.rs/rss/rss.asp?column_id=49') + ,(u'Moj Izbor' , u'http://www.danas.rs/rss/rss.asp?column_id=50') + ,(u'Direktno' , u'http://www.danas.rs/rss/rss.asp?column_id=51') + ,(u'I tome slicno' , u'http://www.danas.rs/rss/rss.asp?column_id=52') + ,(u'No longer and not yet', u'http://www.danas.rs/rss/rss.asp?column_id=53') + ,(u'Resetovanje' , u'http://www.danas.rs/rss/rss.asp?column_id=54') + ,(u'Iza scene' , u'http://www.danas.rs/rss/rss.asp?column_id=60') + ,(u'Drustvoslovlje' , u'http://www.danas.rs/rss/rss.asp?column_id=55') + ,(u'Zvaka u pepeljari' , u'http://www.danas.rs/rss/rss.asp?column_id=56') + ,(u'Vostani Serbie' , u'http://www.danas.rs/rss/rss.asp?column_id=57') + ,(u'Med&Jad-a' , u'http://www.danas.rs/rss/rss.asp?column_id=58') + ,(u'Svetlosti pozornice' , u'http://www.danas.rs/rss/rss.asp?column_id=59') ] def preprocess_html(self, soup): @@ -65,3 +84,10 @@ class Danas(BasicNewsRecipe): def print_version(self, url): return url + '&action=print' + def get_cover_url(self): + cover_url = None + soup = self.index_to_soup('http://www.danas.rs/') + for citem in soup.findAll('img'): + if citem['src'].endswith('naslovna.jpg'): + return 'http://www.danas.rs' + citem['src'] + return cover_url 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/libero.recipe b/resources/recipes/libero.recipe index 4354940746..f2208d01a3 100644 --- a/resources/recipes/libero.recipe +++ b/resources/recipes/libero.recipe @@ -11,11 +11,11 @@ http://www.libero-news.it/ from calibre.web.feeds.news import BasicNewsRecipe class LiberoNews(BasicNewsRecipe): - __author__ = 'Marini Gabriele' - description = 'Italian daily newspaper' + __author__ = 'Marini Gabriele' + description = 'Italian daily newspaper' - cover_url = 'http://www.ilgiornale.it/img_v1/logo.gif' - title = u'Libero' + cover_url = 'http://www.libero-news.it/images/logo.png' + title = u'Libero ' publisher = 'EDITORIALE LIBERO s.r.l 2006' category = 'News, politics, culture, economy, general interest' 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/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/nytimes.recipe b/resources/recipes/nytimes.recipe index ec546569e5..9fbcf6d3d1 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, 3) 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') @@ -183,6 +185,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 +403,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): diff --git a/resources/recipes/nytimes_sub.recipe b/resources/recipes/nytimes_sub.recipe index c08b06572d..bcec51ce97 100644 --- a/resources/recipes/nytimes_sub.recipe +++ b/resources/recipes/nytimes_sub.recipe @@ -20,6 +20,7 @@ class NYTimes(BasicNewsRecipe): title = 'The New York Times' __author__ = 'GRiker' language = 'en' + requires_version = (0, 7, 3) description = 'Daily news from the New York Times (subscription version)' allSectionKeywords = ['The Front Page', 'International','National','Obituaries','Editorials', @@ -103,6 +104,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 +160,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 +281,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): 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/publico.recipe b/resources/recipes/publico.recipe index c5fbcde53b..7d913cbbe0 100644 --- a/resources/recipes/publico.recipe +++ b/resources/recipes/publico.recipe @@ -1,41 +1,43 @@ -""" -publico.py - v1.0 +#!/usr/bin/env python +__author__ = u'Jordi Balcells' +__license__ = 'GPL v3' +description = u'Jornal portugu\xeas - v1.03 (16 June 2010)' +__docformat__ = 'restructuredtext en' -Copyright (c) 2009, David Rodrigues - http://sixhat.net -All rights reserved. -""" - -__license__ = 'GPL 3' +''' +publico.pt +''' from calibre.web.feeds.news import BasicNewsRecipe -import re -class Publico(BasicNewsRecipe): - title = u'P\xfablico' - __author__ = 'David Rodrigues' - oldest_article = 1 - max_articles_per_feed = 30 - encoding='utf-8' - no_stylesheets = True - language = 'pt' +class PublicoPT(BasicNewsRecipe): + description = u'Jornal portugu\xeas' + cover_url = 'http://static.publico.pt/files/header/img/publico.gif' + title = u'Publico.PT' + category = 'News, politics, culture, economy, general interest' + oldest_article = 2 + no_stylesheets = True + encoding = 'utf8' + use_embedded_content = False + language = 'pt' + remove_empty_feeds = True + extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} ' - preprocess_regexps = [(re.compile(u"\uFFFD", re.DOTALL|re.IGNORECASE), lambda match: ''),] + keep_only_tags = [dict(attrs={'class':['content-noticia-title','artigoHeader','ECOSFERA_MANCHETE','noticia','textoPrincipal','ECOSFERA_texto_01']})] + remove_tags = [dict(attrs={'class':['options','subcoluna']})] - feeds = [ - (u'Geral', u'http://feeds.feedburner.com/PublicoUltimaHora'), - (u'Internacional', u'http://www.publico.clix.pt/rss.ashx?idCanal=11'), - (u'Pol\xedtica', u'http://www.publico.clix.pt/rss.ashx?idCanal=12'), - (u'Ci\xcencias', u'http://www.publico.clix.pt/rss.ashx?idCanal=13'), - (u'Desporto', u'http://desporto.publico.pt/rss.ashx'), - (u'Economia', u'http://www.publico.clix.pt/rss.ashx?idCanal=57'), - (u'Educa\xe7\xe3o', u'http://www.publico.clix.pt/rss.ashx?idCanal=58'), - (u'Local', u'http://www.publico.clix.pt/rss.ashx?idCanal=59'), - (u'Media e Tecnologia', u'http://www.publico.clix.pt/rss.ashx?idCanal=61'), - (u'Sociedade', u'http://www.publico.clix.pt/rss.ashx?idCanal=62') - ] - remove_tags = [dict(name='script'), dict(id='linhaTitulosHeader')] - keep_only_tags = [dict(name='div')] + feeds = [ + (u'Geral', u'http://feeds.feedburner.com/publicoRSS'), + (u'Mundo', u'http://feeds.feedburner.com/PublicoMundo'), + (u'Pol\xedtica', u'http://feeds.feedburner.com/PublicoPolitica'), + (u'Economia', u'http://feeds.feedburner.com/PublicoEconomia'), + (u'Desporto', u'http://feeds.feedburner.com/PublicoDesporto'), + (u'Sociedade', u'http://feeds.feedburner.com/PublicoSociedade'), + (u'Educa\xe7\xe3o', u'http://feeds.feedburner.com/PublicoEducacao'), + (u'Ci\xeancias', u'http://feeds.feedburner.com/PublicoCiencias'), + (u'Ecosfera', u'http://feeds.feedburner.com/PublicoEcosfera'), + (u'Cultura', u'http://feeds.feedburner.com/PublicoCultura'), + (u'Local', u'http://feeds.feedburner.com/PublicoLocal'), + (u'Tecnologia', u'http://feeds.feedburner.com/PublicoTecnologia') + ] - def print_version(self,url): - s=re.findall("id=[0-9]+",url); - return "http://ww2.publico.clix.pt/print.aspx?"+s[0] diff --git a/resources/recipes/slashdot.recipe b/resources/recipes/slashdot.recipe index dc0067f3ed..c7c68c3f1a 100644 --- a/resources/recipes/slashdot.recipe +++ b/resources/recipes/slashdot.recipe @@ -10,8 +10,10 @@ from calibre.web.feeds.news import BasicNewsRecipe class Slashdot(BasicNewsRecipe): title = u'Slashdot.org' description = '''Tech news. WARNING: This recipe downloads a lot - of content and can result in your IP being banned from slashdot.org''' + of content and may result in your IP being banned from slashdot.org''' oldest_article = 7 + simultaneous_downloads = 1 + delay = 3 max_articles_per_feed = 100 language = 'en' diff --git a/resources/recipes/thairath.recipe b/resources/recipes/thairath.recipe new file mode 100644 index 0000000000..6ebb84f3a5 --- /dev/null +++ b/resources/recipes/thairath.recipe @@ -0,0 +1,58 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1271637235(BasicNewsRecipe): + + title = u'Thairath' + __author__ = 'Anat R.' + language = 'th' + + oldest_article = 7 + + max_articles_per_feed = 100 + no_stylesheets = True + + remove_javascript = True + + use_embedded_content = False + feeds = [(u'News', +u'http://www.thairath.co.th/rss/news.xml'), (u'Politics', +u'http://www.thairath.co.th/rss/pol.xml'), (u'Economy', +u'http://www.thairath.co.th/rss/eco.xml'), (u'International', +u'http://www.thairath.co.th/rss/oversea.xml'), (u'Sports', +u'http://www.thairath.co.th/rss/sport.xml'), (u'Life', +u'http://www.thairath.co.th/rss/life.xml'), (u'Education', +u'http://www.thairath.co.th/rss/edu.xml'), (u'Tech', +u'http://www.thairath.co..th/rss/tech.xml'), (u'Entertainment', +u'http://www.thairath.co.th/rss/ent.xml')] + keep_only_tags = [] + + keep_only_tags.append(dict(name = 'h1', attrs = {'id' : 'title'})) + + keep_only_tags.append(dict(name = 'ul', attrs = {'class' : +'detail-info'})) + + keep_only_tags.append(dict(name = 'img', attrs = {'class' : +'detail-image'})) + + keep_only_tags.append(dict(name = 'div', attrs = {'class' : +'entry'})) + remove_tags = [] + remove_tags.append(dict(name = 'div', attrs = {'id': +'menu-holder'})) + + remove_tags.append(dict(name = 'div', attrs = {'class': +'addthis_toolbox addthis_default_style'})) + + remove_tags.append(dict(name = 'div', attrs = {'class': 'box top-item'})) + + remove_tags.append(dict(name = 'div', attrs = {'class': 'column-200 column-margin-430'})) + + remove_tags.append(dict(name = 'div', attrs = {'id': +'detail-related'})) + + remove_tags.append(dict(name = 'div', attrs = {'id': 'related'})) + + remove_tags.append(dict(name = 'id', attrs = {'class': 'footer'})) + + remove_tags.append(dict(name = "ul",attrs = +{'id':'banner-highlights-images'})) diff --git a/resources/recipes/the_nation_thai.recipe b/resources/recipes/the_nation_thai.recipe new file mode 100644 index 0000000000..a33a16e0a5 --- /dev/null +++ b/resources/recipes/the_nation_thai.recipe @@ -0,0 +1,44 @@ + +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1271596863(BasicNewsRecipe): + + title = u'The Nation' + __author__ = 'Anat R.' + language = 'en_TH' + + oldest_article = 7 + + max_articles_per_feed = 100 + no_stylesheets = True + + remove_javascript = True + + use_embedded_content = False + feeds = [(u'Topstory', +u'http://www.nationmultimedia.com/home/rss/topstories.rss'), +(u'National', u'http://www.nationmultimedia.com/home/rss/national.rss'), + (u'Politics', +u'http://www.nationmultimedia.com/home/rss/politics.rss'), (u'Business', + u'http://www.nationmultimedia.com/home/rss/business.rss'), +(u'Regional', u'http://www.nationmultimedia.com/home/rss/regional.rss'), + (u'Sports', u'http://www.nationmultimedia.com/home/rss/sport.rss'), +(u'Travel', u'http://www.nationmultimedia.com/home/rss/travel.rss'), +(u'Life', u'http://www.nationmultimedia.com/home/rss/life.rss')] + keep_only_tags = [] + + keep_only_tags.append(dict(name = 'div', attrs = {'class' : +'pd10'})) + remove_tags = [] + + remove_tags.append(dict(name = 'div', attrs = {'class': +'WrapperHeaderCol2-2'})) + + remove_tags.append(dict(name = 'div', attrs = {'class': +'LayoutMenu2'})) + + remove_tags.append(dict(name = 'div', attrs = {'class': +'TextHeaderRight'})) + + remove_tags.append(dict(name = "ul",attrs = {'id':'toolZoom'})) + diff --git a/resources/recipes/the_oz.recipe b/resources/recipes/the_oz.recipe index a55f31e63e..ccdce0acb6 100644 --- a/resources/recipes/the_oz.recipe +++ b/resources/recipes/the_oz.recipe @@ -16,7 +16,7 @@ class DailyTelegraph(BasicNewsRecipe): language = 'en_AU' oldest_article = 2 - max_articles_per_feed = 10 + max_articles_per_feed = 20 remove_javascript = True no_stylesheets = True encoding = 'utf8' 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/wsj.recipe b/resources/recipes/wsj.recipe index 25f175f78b..fd5e977d10 100644 --- a/resources/recipes/wsj.recipe +++ b/resources/recipes/wsj.recipe @@ -3,126 +3,172 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' - from calibre.web.feeds.news import BasicNewsRecipe -from calibre import strftime +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' - description = 'News and current affairs' - needs_subscription = True - language = 'en' + title = 'The Wall Street Journal' + __author__ = 'Kovid Goyal, Sujata Raman, and Joshua Oster-Morris' + description = 'News and current affairs' + needs_subscription = True + language = 'en' - max_articles_per_feed = 1000 - timefmt = ' [%a, %b %d, %Y]' - no_stylesheets = True + max_articles_per_feed = 1000 + timefmt = ' [%a, %b %d, %Y]' + no_stylesheets = True - extra_css = '''h1{color:#093D72 ; font-size:large ; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; } - h2{color:#474537; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small; font-style:italic;} - .subhead{color:gray; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small; font-style:italic;} - .insettipUnit {color:#666666; font-family:Arial,Sans-serif;font-size:xx-small } - .targetCaption{ font-size:x-small; color:#333333; font-family:Arial,Helvetica,sans-serif} - .article{font-family :Arial,Helvetica,sans-serif; font-size:x-small} - .tagline {color:#333333; font-size:xx-small} - .dateStamp {color:#666666; font-family:Arial,Helvetica,sans-serif} - h3{color:blue ;font-family:Arial,Helvetica,sans-serif; font-size:xx-small} - .byline{color:blue;font-family:Arial,Helvetica,sans-serif; font-size:xx-small} - h6{color:#333333; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small;font-style:italic; } - .paperLocation{color:#666666; font-size:xx-small}''' + extra_css = '''h1{color:#093D72 ; font-size:large ; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; } + h2{color:#474537; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small; font-style:italic;} + .subhead{color:gray; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small; font-style:italic;} + .insettipUnit {color:#666666; font-family:Arial,Sans-serif;font-size:xx-small } + .targetCaption{ font-size:x-small; color:#333333; font-family:Arial,Helvetica,sans-serif} + .article{font-family :Arial,Helvetica,sans-serif; font-size:x-small} + .tagline {color:#333333; font-size:xx-small} + .dateStamp {color:#666666; font-family:Arial,Helvetica,sans-serif} + h3{color:blue ;font-family:Arial,Helvetica,sans-serif; font-size:xx-small} + .byline{color:blue;font-family:Arial,Helvetica,sans-serif; font-size:xx-small} + h6{color:#333333; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small;font-style:italic; } + .paperLocation{color:#666666; font-size:xx-small}''' - remove_tags_before = dict(name='h1') - remove_tags = [ - dict(id=["articleTabs_tab_article", "articleTabs_tab_comments", "articleTabs_tab_interactive","articleTabs_tab_video","articleTabs_tab_map","articleTabs_tab_slideshow"]), - {'class':['footer_columns','network','insetCol3wide','interactive','video','slideshow','map','insettip','insetClose','more_in', "insetContent", 'articleTools_bottom', 'aTools', "tooltip", "adSummary", "nav-inline"]}, - dict(rel='shortcut icon'), - ] - remove_tags_after = [dict(id="article_story_body"), {'class':"article story"},] + remove_tags_before = dict(name='h1') + remove_tags = [ + dict(id=["articleTabs_tab_article", "articleTabs_tab_comments", "articleTabs_tab_interactive","articleTabs_tab_video","articleTabs_tab_map","articleTabs_tab_slideshow"]), + {'class':['footer_columns','network','insetCol3wide','interactive','video','slideshow','map','insettip','insetClose','more_in', "insetContent", 'articleTools_bottom', 'aTools', "tooltip", "adSummary", "nav-inline"]}, + dict(rel='shortcut icon'), + ] + remove_tags_after = [dict(id="article_story_body"), {'class':"article story"},] - def get_browser(self): - br = BasicNewsRecipe.get_browser() - if self.username is not None and self.password is not None: - br.open('http://commerce.wsj.com/auth/login') - br.select_form(nr=0) - br['user'] = self.username - br['password'] = self.password - res = br.submit() - raw = res.read() - if 'Welcome,' not in raw: - raise ValueError('Failed to log in to wsj.com, check your ' - 'username and password') - return br + def get_browser(self): + br = BasicNewsRecipe.get_browser() + if self.username is not None and self.password is not None: + br.open('http://commerce.wsj.com/auth/login') + br.select_form(nr=0) + br['user'] = self.username + br['password'] = self.password + res = br.submit() + raw = res.read() + if 'Welcome,' not in raw: + raise ValueError('Failed to log in to wsj.com, check your ' + 'username and password') + return br - def postprocess_html(self, soup, first): - for tag in soup.findAll(name=['table', 'tr', 'td']): - tag.name = 'div' + def postprocess_html(self, soup, first): + for tag in soup.findAll(name=['table', 'tr', 'td']): + tag.name = 'div' - for tag in soup.findAll('div', dict(id=["articleThumbnail_1", "articleThumbnail_2", "articleThumbnail_3", "articleThumbnail_4", "articleThumbnail_5", "articleThumbnail_6", "articleThumbnail_7"])): - tag.extract() + for tag in soup.findAll('div', dict(id=["articleThumbnail_1", "articleThumbnail_2", "articleThumbnail_3", "articleThumbnail_4", "articleThumbnail_5", "articleThumbnail_6", "articleThumbnail_7"])): + tag.extract() - return soup + return soup - def wsj_get_index(self): - return self.index_to_soup('http://online.wsj.com/page/us_in_todays_paper.html') + def wsj_get_index(self): + return self.index_to_soup('http://online.wsj.com/itp') - def parse_index(self): - soup = self.wsj_get_index() + 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 - year = strftime('%Y') - for x in soup.findAll('td', height='25', attrs={'class':'b14'}): - txt = self.tag_to_string(x).strip() - txt = txt.replace(u'\xa0', ' ') - txt = txt.encode('ascii', 'ignore') - if year in txt: - self.timefmt = ' [%s]'%txt - break + def parse_index(self): + soup = self.wsj_get_index() - left_column = soup.find( - text=lambda t: 'begin ITP Left Column' in str(t)) + date = soup.find('span', attrs={'class':'date-date'}) + if date is not None: + self.timefmt = ' [%s]'%self.tag_to_string(date) - table = left_column.findNext('table') + cov = soup.find('a', attrs={'class':'icon pdf'}, href=True) + if cov is not None: + self.cover_url = cov['href'] - current_section = None - current_articles = [] - feeds = [] - for x in table.findAllNext(True): - if x.name == 'td' and x.get('class', None) == 'b13': - if current_articles and current_section: - feeds.append((current_section, current_articles)) - current_section = self.tag_to_string(x.a).strip() - current_articles = [] - self.log('\tProcessing section:', current_section) - if current_section is not None and x.name == 'a' and \ - x.get('class', None) == 'bold80': - title = self.tag_to_string(x) - url = x.get('href', False) - if not url or not title: - continue - url = url.partition('#')[0] - desc = '' - d = x.findNextSibling(True) - if d is not None and d.get('class', None) == 'arialResize': - desc = self.tag_to_string(d) - desc = desc.partition(u'\u2022')[0] - self.log('\t\tFound article:', title) - self.log('\t\t\t', url) - if url.startswith('/'): - url = 'http://online.wsj.com'+url - if desc: - self.log('\t\t\t', desc) - current_articles.append({'title': title, 'url':url, - 'description':desc, 'date':''}) + feeds = [] + div = soup.find('div', attrs={'class':'itpHeader'}) + div = div.find('ul', attrs={'class':'tab'}) + for a in div.findAll('a', href=lambda x: x and '/itp/' in x): + pageone = a['href'].endswith('pageone') + if pageone: + title = 'Front Section' + url = 'http://online.wsj.com' + a['href'] + feeds = self.wsj_add_feed(feeds,title,url) + title = 'What''s News' + url = url.replace('pageone','whatsnews') + feeds = self.wsj_add_feed(feeds,title,url) + else: + title = self.tag_to_string(a) + url = 'http://online.wsj.com' + a['href'] + feeds = self.wsj_add_feed(feeds,title,url) + return feeds - if current_articles and current_section: - feeds.append((current_section, current_articles)) + def wsj_find_wn_articles(self, url): + soup = self.index_to_soup(url) + articles = [] - return feeds + 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) - def cleanup(self): - self.browser.open('http://online.wsj.com/logout?url=http://online.wsj.com') + articles.append({'title':title, 'url':url, + 'description':desc, 'date':''}) + + self.log('\tFound WN article:', title) + + return articles + + def wsj_find_articles(self, url): + soup = self.index_to_soup(url) + + whats_news = soup.find('div', attrs={'class':lambda x: x and 'whatsNews-simple' in x}) + if whats_news is not None: + whats_news.extract() + + articles = [] + + flavorarea = soup.find('div', attrs={'class':lambda x: x and 'ahed' in x}) + if flavorarea is not None: + flavorstory = flavorarea.find('a', href=lambda x: x and x.startswith('/article')) + if flavorstory is not None: + flavorstory['class'] = 'mjLinkItem' + metapage = soup.find('span', attrs={'class':lambda x: x and 'meta_sectionName' in x}) + if metapage is not None: + flavorstory.append( copy.copy(metapage) ) #metapage should always be A1 because that should be first on the page + + for a in soup.findAll('a', attrs={'class':'mjLinkItem'}, href=True): + container = a.findParent(['li', 'div']) + meta = a.find(attrs={'class':'meta_sectionName'}) + if meta is not None: + meta.extract() + title = self.tag_to_string(a).strip() + ' [%s]'%self.tag_to_string(meta) + url = 'http://online.wsj.com'+a['href'] + desc = '' + p = container.find('p') + if p is not None: + desc = self.tag_to_string(p) + + articles.append({'title':title, 'url':url, + 'description':desc, 'date':''}) + + self.log('\tFound article:', title) + + return articles + def cleanup(self): + self.browser.open('http://online.wsj.com/logout?url=http://online.wsj.com') + diff --git a/resources/tracer.epub b/resources/tracer.epub new file mode 100644 index 0000000000..28f40c07d0 Binary files /dev/null and b/resources/tracer.epub differ diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 4f9e1f3904..0cc188503f 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.4' __author__ = "Kovid Goyal " import re diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index ca93990420..93344f4616 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -436,7 +436,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 + BOOQ, ELONEX, POCKETBOOK301 from calibre.devices.iliad.driver import ILIAD from calibre.devices.irexdr.driver import IREXDR1000, IREXDR800 from calibre.devices.jetbook.driver import JETBOOK @@ -457,9 +457,12 @@ from calibre.devices.misc import PALMPRE, AVANT from calibre.devices.folder_device.driver import FOLDER_DEVICE_FOR_CONFIG from calibre.devices.kobo.driver import KOBO -from calibre.ebooks.metadata.fetch import GoogleBooks, ISBNDB, Amazon +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 -plugins = [HTML2ZIP, PML2PMLZ, ArchiveExtract, GoogleBooks, ISBNDB, Amazon, CSV_XML, EPUB_MOBI] +plugins = [HTML2ZIP, PML2PMLZ, ArchiveExtract, GoogleBooks, ISBNDB, Amazon, + LibraryThing, DoubanBooks, CSV_XML, EPUB_MOBI] plugins += [ ComicInput, EPUBInput, @@ -507,6 +510,7 @@ plugins += [ JETBOOK, SHINEBOOK, POCKETBOOK360, + POCKETBOOK301, KINDLE, KINDLE2, KINDLE_DX, diff --git a/src/calibre/customize/profiles.py b/src/calibre/customize/profiles.py index 222f6128e0..c872c9df38 100644 --- a/src/calibre/customize/profiles.py +++ b/src/calibre/customize/profiles.py @@ -279,6 +279,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 a2521b0023..8397827fbb 100644 --- a/src/calibre/customize/ui.py +++ b/src/calibre/customize/ui.py @@ -21,7 +21,7 @@ from calibre.utils.config import make_config_dir, Config, ConfigProxy, \ platform = 'linux' if iswindows: platform = 'windows' -if isosx: +elif isosx: platform = 'osx' from zipfile import ZipFile @@ -32,19 +32,25 @@ def _config(): c.add_opt('filetype_mapping', default={}, help=_('Mapping for filetype plugins')) c.add_opt('plugin_customization', default={}, help=_('Local plugin customization')) c.add_opt('disabled_plugins', default=set([]), help=_('Disabled plugins')) + c.add_opt('enabled_plugins', default=set([]), help=_('Enabled plugins')) return ConfigProxy(c) config = _config() - class InvalidPlugin(ValueError): pass class PluginNotFound(ValueError): pass -def load_plugin(path_to_zip_file): +def find_plugin(name): + for plugin in _initialized_plugins: + if plugin.name == name: + return plugin + + +def load_plugin(path_to_zip_file): # {{{ ''' Load plugin from zip file or raise InvalidPlugin error @@ -76,11 +82,120 @@ def load_plugin(path_to_zip_file): raise InvalidPlugin(_('No valid plugin found in ')+path_to_zip_file) -_initialized_plugins = [] +# }}} + +# Enable/disable plugins {{{ + +def disable_plugin(plugin_or_name): + x = getattr(plugin_or_name, 'name', plugin_or_name) + plugin = find_plugin(x) + if not plugin.can_be_disabled: + raise ValueError('Plugin %s cannot be disabled'%x) + dp = config['disabled_plugins'] + dp.add(x) + config['disabled_plugins'] = dp + ep = config['enabled_plugins'] + if x in ep: + ep.remove(x) + config['enabled_plugins'] = ep + +def enable_plugin(plugin_or_name): + x = getattr(plugin_or_name, 'name', plugin_or_name) + dp = config['disabled_plugins'] + if x in dp: + dp.remove(x) + config['disabled_plugins'] = dp + ep = config['enabled_plugins'] + ep.add(x) + config['enabled_plugins'] = ep + +default_disabled_plugins = set([ + 'Douban Books', +]) + +def is_disabled(plugin): + if plugin.name in config['enabled_plugins']: return False + return plugin.name in config['disabled_plugins'] or \ + plugin.name in default_disabled_plugins +# }}} + +# File type plugins {{{ + _on_import = {} _on_preprocess = {} _on_postprocess = {} +def reread_filetype_plugins(): + global _on_import + global _on_preprocess + global _on_postprocess + _on_import = {} + _on_preprocess = {} + _on_postprocess = {} + + for plugin in _initialized_plugins: + if isinstance(plugin, FileTypePlugin): + for ft in plugin.file_types: + if plugin.on_import: + if not _on_import.has_key(ft): + _on_import[ft] = [] + _on_import[ft].append(plugin) + if plugin.on_preprocess: + if not _on_preprocess.has_key(ft): + _on_preprocess[ft] = [] + _on_preprocess[ft].append(plugin) + if plugin.on_postprocess: + if not _on_postprocess.has_key(ft): + _on_postprocess[ft] = [] + _on_postprocess[ft].append(plugin) + + +def _run_filetype_plugins(path_to_file, ft=None, occasion='preprocess'): + occasion = {'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, []): + if is_disabled(plugin): + continue + plugin.site_customization = customization.get(plugin.name, '') + with plugin: + try: + nfp = plugin.run(path_to_file) + if not nfp: + nfp = path_to_file + except: + print 'Running file type plugin %s failed with traceback:'%plugin.name + traceback.print_exc() + x = lambda j : os.path.normpath(os.path.normcase(j)) + if occasion == 'postprocess' and x(nfp) != x(path_to_file): + shutil.copyfile(nfp, path_to_file) + nfp = path_to_file + return nfp + +run_plugins_on_import = functools.partial(_run_filetype_plugins, + occasion='import') +run_plugins_on_preprocess = functools.partial(_run_filetype_plugins, + occasion='preprocess') +run_plugins_on_postprocess = functools.partial(_run_filetype_plugins, + occasion='postprocess') +# }}} + +# Plugin customization {{{ +def customize_plugin(plugin, custom): + d = config['plugin_customization'] + d[plugin.name] = custom.strip() + config['plugin_customization'] = d + +def plugin_customization(plugin): + return config['plugin_customization'].get(plugin.name, '') + +# }}} + + +# Input/Output profiles {{{ def input_profiles(): for plugin in _initialized_plugins: if isinstance(plugin, InputProfile): @@ -90,7 +205,9 @@ def output_profiles(): for plugin in _initialized_plugins: if isinstance(plugin, OutputProfile): yield plugin +# }}} +# Metadata sources {{{ def metadata_sources(metadata_type='basic', customize=True, isbndb_key=None): for plugin in _initialized_plugins: if isinstance(plugin, MetadataSource) and \ @@ -117,31 +234,9 @@ def migrate_isbndb_key(): if key: prefs.set('isbndb_com_key', '') set_isbndb_key(key) +# }}} -def reread_filetype_plugins(): - global _on_import - global _on_preprocess - global _on_postprocess - _on_import = {} - _on_preprocess = {} - _on_postprocess = {} - - for plugin in _initialized_plugins: - if isinstance(plugin, FileTypePlugin): - for ft in plugin.file_types: - if plugin.on_import: - if not _on_import.has_key(ft): - _on_import[ft] = [] - _on_import[ft].append(plugin) - if plugin.on_preprocess: - if not _on_preprocess.has_key(ft): - _on_preprocess[ft] = [] - _on_preprocess[ft].append(plugin) - if plugin.on_postprocess: - if not _on_postprocess.has_key(ft): - _on_postprocess[ft] = [] - _on_postprocess[ft].append(plugin) - +# Metadata read/write {{{ _metadata_readers = {} _metadata_writers = {} def reread_metadata_plugins(): @@ -233,51 +328,9 @@ def set_file_type_metadata(stream, mi, ftype): print 'Failed to set metadata for', repr(getattr(mi, 'title', '')) traceback.print_exc() +# }}} -def _run_filetype_plugins(path_to_file, ft=None, occasion='preprocess'): - occasion = {'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, []): - if is_disabled(plugin): - continue - plugin.site_customization = customization.get(plugin.name, '') - with plugin: - try: - nfp = plugin.run(path_to_file) - if not nfp: - nfp = path_to_file - except: - print 'Running file type plugin %s failed with traceback:'%plugin.name - traceback.print_exc() - x = lambda j : os.path.normpath(os.path.normcase(j)) - if occasion == 'postprocess' and x(nfp) != x(path_to_file): - shutil.copyfile(nfp, path_to_file) - nfp = path_to_file - return nfp - -run_plugins_on_import = functools.partial(_run_filetype_plugins, - occasion='import') -run_plugins_on_preprocess = functools.partial(_run_filetype_plugins, - occasion='preprocess') -run_plugins_on_postprocess = functools.partial(_run_filetype_plugins, - occasion='postprocess') - - -def initialize_plugin(plugin, path_to_zip_file): - try: - p = plugin(path_to_zip_file) - p.initialize() - return p - except Exception: - print 'Failed to initialize plugin:', plugin.name, plugin.version - tb = traceback.format_exc() - raise InvalidPlugin((_('Initialization of plugin %s failed with traceback:') - %tb) + '\n'+tb) - +# Add/remove plugins {{{ def add_plugin(path_to_zip_file): make_config_dir() @@ -307,14 +360,9 @@ def remove_plugin(plugin_or_name): initialize_plugins() return removed -def is_disabled(plugin): - return plugin.name in config['disabled_plugins'] - -def find_plugin(name): - for plugin in _initialized_plugins: - if plugin.name == name: - return plugin +# }}} +# Input/Output format plugins {{{ def input_format_plugins(): for plugin in _initialized_plugins: @@ -364,6 +412,9 @@ def available_output_formats(): formats.add(plugin.file_type) return formats +# }}} + +# Catalog plugins {{{ def catalog_plugins(): for plugin in _initialized_plugins: @@ -383,27 +434,32 @@ def plugin_for_catalog_format(fmt): if fmt.lower() in plugin.file_types: return plugin -def device_plugins(): +# }}} + +def device_plugins(): # {{{ for plugin in _initialized_plugins: if isinstance(plugin, DevicePlugin): if not is_disabled(plugin): - yield plugin + if platform in plugin.supported_platforms: + yield plugin +# }}} -def disable_plugin(plugin_or_name): - x = getattr(plugin_or_name, 'name', plugin_or_name) - plugin = find_plugin(x) - if not plugin.can_be_disabled: - raise ValueError('Plugin %s cannot be disabled'%x) - dp = config['disabled_plugins'] - dp.add(x) - config['disabled_plugins'] = dp -def enable_plugin(plugin_or_name): - x = getattr(plugin_or_name, 'name', plugin_or_name) - dp = config['disabled_plugins'] - if x in dp: - dp.remove(x) - config['disabled_plugins'] = dp +# Initialize plugins {{{ + +_initialized_plugins = [] + +def initialize_plugin(plugin, path_to_zip_file): + try: + p = plugin(path_to_zip_file) + p.initialize() + return p + except Exception: + print 'Failed to initialize plugin:', plugin.name, plugin.version + tb = traceback.format_exc() + raise InvalidPlugin((_('Initialization of plugin %s failed with traceback:') + %tb) + '\n'+tb) + def initialize_plugins(): global _initialized_plugins @@ -425,10 +481,14 @@ def initialize_plugins(): initialize_plugins() -def intialized_plugins(): +def initialized_plugins(): for plugin in _initialized_plugins: yield plugin +# }}} + +# CLI {{{ + def option_parser(): parser = OptionParser(usage=_('''\ %prog options @@ -449,17 +509,6 @@ def option_parser(): help=_('Disable the named plugin')) return parser -def initialized_plugins(): - return _initialized_plugins - -def customize_plugin(plugin, custom): - d = config['plugin_customization'] - d[plugin.name] = custom.strip() - config['plugin_customization'] = d - -def plugin_customization(plugin): - return config['plugin_customization'].get(plugin.name, '') - def main(args=sys.argv): parser = option_parser() if len(args) < 2: @@ -504,3 +553,5 @@ def main(args=sys.argv): if __name__ == '__main__': sys.exit(main()) +# }}} + diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index 54bd745879..0bbdf0f22c 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -30,7 +30,7 @@ class ANDROID(USBMS): 0x18d1 : { 0x4e11 : [0x0100, 0x226], 0x4e12: [0x0100, 0x226]}, # Samsung - 0x04e8 : { 0x681d : [0x0222], 0x681c : [0x0222, 0x0224]}, + 0x04e8 : { 0x681d : [0x0222, 0x0400], 0x681c : [0x0222, 0x0224]}, # Acer 0x502 : { 0x3203 : [0x0100]}, @@ -41,10 +41,12 @@ class ANDROID(USBMS): 'be used') EXTRA_CUSTOMIZATION_DEFAULT = ', '.join(EBOOK_DIR_MAIN) - VENDOR_NAME = ['HTC', 'MOTOROLA', 'GOOGLE_', 'ANDROID', 'ACER', 'GT-I5700'] + VENDOR_NAME = ['HTC', 'MOTOROLA', 'GOOGLE_', 'ANDROID', 'ACER', + 'GT-I5700', 'SAMSUNG'] WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE', - '__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD'] - WINDOWS_CARD_A_MEM = ['ANDROID_PHONE'] + '__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD', + 'PROD_GT-I9000'] + WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'PROD_GT-I9000_CARD'] OSX_MAIN_MEM = 'HTC Android Phone Media' diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index 3e16eccbbc..a994efb0f6 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -5,19 +5,20 @@ __copyright__ = '2010, Gregory Riker' __docformat__ = 'restructuredtext en' -import cStringIO, ctypes, os, re, shutil, subprocess, sys, tempfile, time, zipfile - -from calibre.constants import DEBUG +import cStringIO, ctypes, datetime, os, re, shutil, subprocess, sys, tempfile, time +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.interface import DevicePlugin from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre.ebooks.metadata import MetaInformation +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.date import parse_date +from calibre.utils.date import isoformat, now, parse_date from calibre.utils.logging import Log -from calibre.devices.errors import UserFeedback +from calibre.utils.zipfile import ZipFile from PIL import Image as PILImage @@ -32,6 +33,7 @@ if isosx: if iswindows: import pythoncom, win32com.client + class ITUNES(DevicePlugin): ''' Calling sequences: @@ -76,7 +78,7 @@ class ITUNES(DevicePlugin): supported_platforms = ['osx','windows'] author = 'GRiker' #: The version of this plugin as a 3-tuple (major, minor, revision) - version = (0, 5, 0) + version = (0,7,0) OPEN_FEEDBACK_MESSAGE = _( 'Apple device detected, launching iTunes, please wait ...') @@ -157,6 +159,7 @@ class ITUNES(DevicePlugin): sources = None update_msg = None update_needed = False + use_series_data = True # Public methods def add_books_to_metadata(self, locations, metadata, booklists): @@ -175,54 +178,67 @@ class ITUNES(DevicePlugin): # Delete any obsolete copies of the book from the booklist if self.update_list: - if isosx: - if DEBUG: - self.log.info( "ITUNES.add_books_to_metadata()") - self._dump_update_list('add_books_to_metadata()') - for (j,p_book) in enumerate(self.update_list): - self.log.info("ITUNES.add_books_to_metadata():\n looking for %s" % - str(p_book['lib_book'])[-9:]) - for i,bl_book in enumerate(booklists[0]): - if bl_book.library_id == p_book['lib_book']: - booklists[0].pop(i) - self.log.info("ITUNES.add_books_to_metadata():\n removing %s %s" % - (p_book['title'], str(p_book['lib_book'])[-9:])) + 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) + + for (j,p_book) in enumerate(self.update_list): + if False: + if isosx: + self.log.info(" looking for %s" % + str(p_book['lib_book'])[-9:]) + elif iswindows: + self.log.info(" looking for '%s' by %s (%s)" % + (p_book['title'],p_book['author'], p_book['uuid'])) + + # Purge the booklist, self.cached_books + for i,bl_book in enumerate(booklists[0]): + if bl_book.uuid == p_book['uuid']: + # Remove from booklists[0] + booklists[0].pop(i) + if False: + if isosx: + self.log.info(" removing old %s %s from booklists[0]" % + (p_book['title'], str(p_book['lib_book'])[-9:])) + elif iswindows: + self.log.info(" removing old '%s' from booklists[0]" % + (p_book['title'])) + + # If >1 matching uuid, remove old title + matching_uuids = 0 + for cb in self.cached_books: + if self.cached_books[cb]['uuid'] == p_book['uuid']: + matching_uuids += 1 + + if matching_uuids > 1: + for cb in self.cached_books: + if self.cached_books[cb]['uuid'] == p_book['uuid']: + if self.cached_books[cb]['title'] == p_book['title'] and \ + self.cached_books[cb]['author'] == p_book['author']: + if DEBUG: + self._dump_cached_book(self.cached_books[cb],header="removing from self.cached_books:", indent=2) + self.cached_books.pop(cb) + break break - else: - self.log.error(" update_list item '%s' by %s %s not found in booklists[0]" % - (p_book['title'], p_book['author'],str(p_book['lib_book'])[-9:])) - - if self.report_progress is not None: - self.report_progress(j+1/task_count, _('Updating device metadata listing...')) - - elif iswindows: - if DEBUG: - self.log.info("ITUNES.add_books_to_metadata()") - for (j,p_book) in enumerate(self.update_list): - #self.log.info(" looking for '%s' by %s" % (p_book['title'],p_book['author'])) - for i,bl_book in enumerate(booklists[0]): - #self.log.info(" evaluating '%s' by %s" % (bl_book.title,bl_book.author[0])) - if bl_book.title == p_book['title'] and \ - bl_book.author[0] == p_book['author']: - booklists[0].pop(i) - self.log.info(" removing outdated version of '%s'" % p_book['title']) - break - else: - self.log.error(" update_list item '%s' not found in booklists[0]" % p_book['title']) - - if self.report_progress is not None: - self.report_progress(j+1/task_count, _('Updating device metadata listing...')) + if self.report_progress is not None: + self.report_progress(j+1/task_count, _('Updating device metadata listing...')) if self.report_progress is not None: self.report_progress(1.0, _('Updating device metadata listing...')) # Add new books to booklists[0] for new_book in locations[0]: - if DEBUG: - self.log.info(" adding '%s' by '%s' to booklists[0]" % + if False: + self.log.info(" adding '%s' by '%s' to booklists[0]" % (new_book.title, new_book.author)) booklists[0].append(new_book) + if False: + self._dump_booklist(booklists[0],header='after',indent=2) + self._dump_cached_books(header='after',indent=2) + def books(self, oncard=None, end_session=True): """ Return a list of ebooks on the device. @@ -264,6 +280,7 @@ class ITUNES(DevicePlugin): this_book.device_collections = [] this_book.library_id = library_books[this_book.path] if this_book.path in library_books else None this_book.size = book.size() + this_book.uuid = 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, book) @@ -275,12 +292,13 @@ 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, - 'dev_book':book + 'dev_book':book, + 'uuid': book.composer() } if self.report_progress is not None: self.report_progress(i+1/book_count, _('%d of %d') % (i+1, book_count)) - self._purge_orphans(cached_books) + self._purge_orphans(library_books, cached_books) elif iswindows: try: @@ -310,13 +328,14 @@ class ITUNES(DevicePlugin): cached_books[this_book.path] = { 'title':book.Name, 'author':book.Artist, - 'lib_book':library_books[this_book.path] if this_book.path in library_books else None + 'lib_book':library_books[this_book.path] if this_book.path in library_books else None, + 'uuid': book.Composer } if self.report_progress is not None: self.report_progress(i+1/book_count, _('%d of %d') % (i+1, book_count)) - self._purge_orphans(cached_books) + self._purge_orphans(library_books, cached_books) finally: pythoncom.CoUninitialize() @@ -324,9 +343,9 @@ 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():') +# self._dump_cached_books('returning from books():') return booklist else: return [] @@ -379,7 +398,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') @@ -391,7 +410,7 @@ class ITUNES(DevicePlugin): self.ejected = True return False - self._discover_manual_sync_mode() + self._discover_manual_sync_mode(wait = 2 if self.initial_status == 'launched' else 0) return True def can_handle_windows(self, device_id, debug=False): @@ -455,7 +474,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') @@ -463,7 +482,7 @@ class ITUNES(DevicePlugin): else: # iTunes running, but not connected iPad if DEBUG: - self.log.info(' self.ejected = True') + self.log.info(' iDevice has been ejected') self.ejected = True return False @@ -525,8 +544,24 @@ class ITUNES(DevicePlugin): else: self.log.info(" skipping sync phase, manual_sync_mode: True") else: - self.problem_titles.append("'%s' by %s" % - (self.cached_books[path]['title'],self.cached_books[path]['author'])) + if self.manual_sync_mode: + metadata = MetaInformation(self.cached_books[path]['title'], + [self.cached_books[path]['author']]) + metadata.uuid = self.cached_books[path]['uuid'] + + if isosx: + self._remove_existing_copy(self.cached_books[path],metadata) + elif iswindows: + try: + pythoncom.CoInitialize() + self.iTunes = win32com.client.Dispatch("iTunes.Application") + self._remove_existing_copy(self.cached_books[path],metadata) + finally: + pythoncom.CoUninitialize() + + else: + self.problem_titles.append("'%s' by %s" % + (self.cached_books[path]['title'],self.cached_books[path]['author'])) def eject(self): ''' @@ -622,6 +657,8 @@ class ITUNES(DevicePlugin): Note that most of the initialization is necessarily performed in can_handle(), as we need to talk to iTunes to discover if there's a connected iPod ''' + if DEBUG: + self.log.info("ITUNES.open()") # Confirm/create thumbs archive archive_path = os.path.join(self.cache_dir, "thumbs.zip") @@ -633,7 +670,7 @@ class ITUNES(DevicePlugin): if not os.path.exists(archive_path): self.log.info(" creating zip archive") - zfw = zipfile.ZipFile(archive_path, mode='w') + zfw = ZipFile(archive_path, mode='w') zfw.writestr("iTunes Thumbs Archive",'') zfw.close() else: @@ -652,24 +689,25 @@ class ITUNES(DevicePlugin): if DEBUG: self.log.info("ITUNES.remove_books_from_metadata()") for path in paths: - self._dump_cached_book(self.cached_books[path]) - if self.cached_books[path]['lib_book']: - # Remove from the booklist - for i,book in enumerate(booklists[0]): - if book.path == path: - self.log.info(" removing '%s' from calibre booklist, index: %d" % (path, i)) - booklists[0].pop(i) - break - else: - self.log.error(" '%s' not found in self.cached_book" % path) + self._dump_cached_book(self.cached_books[path], indent=2) - # Remove from cached_books - self.cached_books.pop(path) - if DEBUG: - self.log.info(" removing '%s' from self.cached_books" % path) -# self._dump_cached_books('remove_books_from_metadata()') - else: - self.log.warning(" skipping purchased book, can't remove via automation interface") + # Purge the booklist, self.cached_books + for i,bl_book in enumerate(booklists[0]): + if False: + self.log.info(" evaluating '%s'" % bl_book.uuid) + if bl_book.uuid == self.cached_books[path]['uuid']: + # Remove from booklists[0] + booklists[0].pop(i) + + for cb in self.cached_books: + if self.cached_books[cb]['uuid'] == self.cached_books[path]['uuid']: + self.cached_books.pop(cb) + break + break + + 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) : @@ -712,13 +750,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') self._update_device(msg=self.update_msg, wait=False) - self.update_list = [] self.update_needed = False # Inform user of any problem books @@ -727,6 +762,7 @@ class ITUNES(DevicePlugin): details='\n'.join(self.problem_titles), level=UserFeedback.WARN) self.problem_titles = [] self.problem_msg = None + self.update_list = [] def total_space(self, end_session=True): """ @@ -776,145 +812,29 @@ class ITUNES(DevicePlugin): self.problem_msg = _("Some cover art could not be converted.\n" "Click 'Show Details' for a list.") - if DEBUG: + if False: self.log.info("ITUNES.upload_books()") - self._dump_files(files, header='upload_books()') -# self._dump_cached_books('upload_books()') - self._dump_update_list('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]) - - if self.manual_sync_mode: - # Delete existing from Device|Books, add to self.update_list - # for deletion from booklist[0] during add_books_to_metadata - if path in self.cached_books: - self.update_list.append(self.cached_books[path]) - if DEBUG: - self.log.info(" adding '%s' by %s to self.update_list" % - (self.cached_books[path]['title'],self.cached_books[path]['author'])) - - if DEBUG: - self.log.info( " deleting existing '%s'" % (path)) - self._remove_from_iTunes(self.cached_books[path]) - if self.manual_sync_mode: - dev_book_added = self._remove_from_device(self.cached_books[path]) - - - # Add to iTunes Library|Books - fpath = file - if getattr(file, 'orig_file_path', None) is not None: - fpath = file.orig_file_path - elif getattr(file, 'name', None) is not None: - fpath = file.name - - if isinstance(file,PersistentTemporaryFile) and self.manual_sync_mode: - if DEBUG: - self.log.info(" PTF not added to Library|Books") - else: - added = self.iTunes.add(appscript.mactypes.File(fpath)) - if DEBUG: - self.log.info(" file added to Library|Books") - - dev_book_added = None - if self.manual_sync_mode: - dev_book_added = self._add_device_book(fpath) - - thumb = None - if metadata[i].cover: - try: - # Use cover data as artwork - cover_data = open(metadata[i].cover,'rb') - added.artworks[1].data_.set(cover_data.read()) - - # Resize for thumb - width = metadata[i].thumbnail[0] - height = metadata[i].thumbnail[1] - im = PILImage.open(metadata[i].cover) - im = im.resize((width, height), PILImage.ANTIALIAS) - of = cStringIO.StringIO() - im.convert('RGB').save(of, 'JPEG') - thumb = of.getvalue() - - # Refresh the thumbnail cache - if DEBUG: - self.log.info( " refreshing cached thumb for '%s'" % metadata[i].title) - archive_path = os.path.join(self.cache_dir, "thumbs.zip") - zfw = zipfile.ZipFile(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[i].title, metadata[i].author[0])) - self.log.error("ITUNES.upload_books(): error converting '%s' to thumb for '%s'" % (metadata[i].cover,metadata[i].title)) - - # Create a new Book - this_book = Book(metadata[i].title, metadata[i].author[0]) - try: - this_book.datetime = parse_date(str(added.date_added())).timetuple() - except: - pass - this_book.db_id = None - this_book.device_collections = [] - this_book.library_id = added - this_book.path = path - this_book.size = self._get_device_book_size(fpath, added.size()) - this_book.thumbnail = thumb - this_book.iTunes_id = added - - new_booklist.append(this_book) - - # Populate the iTunes metadata - if metadata[i].comments: - added.comment.set(strip_tags.sub('',metadata[i].comments)) - added.description.set("added by calibre %s" % strftime('%Y-%m-%d %H:%M:%S')) - added.enabled.set(True) - if metadata[i].rating: - added.rating.set(metadata[i].rating*10) - added.sort_artist.set(metadata[i].author_sort.title()) - added.sort_name.set(this_book.title_sorter) - - # Set genre from metadata - # iTunes grabs the first dc:subject from the opf metadata, - # But we can manually override with first tag starting with alpha - for tag in metadata[i].tags: - if self._is_alpha(tag[0]): - added.genre.set(tag) - break - - # Add new_book to self.cached_paths - self.cached_books[this_book.path] = { - 'title': this_book.title, - 'author': this_book.author, - 'lib_book': added, - 'dev_book': dev_book_added - } - - # Report progress - if self.report_progress is not None: - self.report_progress(i+1/file_count, _('%d of %d') % (i+1, file_count)) - ''' if isosx: for (i,file) in enumerate(files): path = self.path_template % (metadata[i].title, metadata[i].author[0]) - self._remove_existing_copies(path,file,metadata[i]) - fpath = self._get_fpath(file) + self._remove_existing_copy(path, metadata[i]) + fpath = self._get_fpath(file, metadata[i], update_md=True) db_added, lb_added = self._add_new_copy(fpath, metadata[i]) - thumb = self._cover_to_thumb(path, metadata[i], lb_added, db_added) + 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) 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], + 'title': metadata[i].title, + 'author': metadata[i].author, 'lib_book': lb_added, - 'dev_book': db_added } - self._dump_cached_books(header="after upload_books()") + 'dev_book': db_added, + 'uuid': metadata[i].uuid} # Report progress if self.report_progress is not None: @@ -927,9 +847,16 @@ class ITUNES(DevicePlugin): for (i,file) in enumerate(files): path = self.path_template % (metadata[i].title, metadata[i].author[0]) - self._remove_existing_copies(path,file,metadata[i]) - fpath = self._get_fpath(file) + self._remove_existing_copy(path, metadata[i]) + fpath = self._get_fpath(file, metadata[i], update_md=True) db_added, lb_added = self._add_new_copy(fpath, metadata[i]) + + if self.manual_sync_mode and not db_added: + # Problem finding added book, probably title/author change needing to be written to metadata + self.problem_msg = ("Title and/or author metadata mismatch with uploaded books.\n" + "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) new_booklist.append(this_book) @@ -937,10 +864,11 @@ class ITUNES(DevicePlugin): # Add new_book to self.cached_paths self.cached_books[this_book.path] = { - 'title': metadata[i].title, - 'author': metadata[i].author[0], + 'title': metadata[i].title, + 'author': metadata[i].author[0], 'lib_book': lb_added, - 'dev_book': db_added } + 'dev_book': db_added, + 'uuid': metadata[i].uuid} # Report progress if self.report_progress is not None: @@ -956,11 +884,16 @@ class ITUNES(DevicePlugin): self.update_needed = True self.update_msg = "Added books to device" + if False: + self._dump_booklist(new_booklist,header="after upload_books()",indent=2) + self._dump_cached_books(header="after upload_books()",indent=2) return (new_booklist, [], []) + # Private methods def _add_device_book(self,fpath, metadata): ''' + assumes pythoncom wrapper for windows ''' self.log.info(" ITUNES._add_device_book()") if isosx: @@ -972,79 +905,72 @@ class ITUNES(DevicePlugin): break else: if DEBUG: - self.log.error(" Device|Books playlist not found") + self.log.error(" Device|Books playlist not found") # Add the passed book to the Device|Books playlist added = pl.add(appscript.mactypes.File(fpath),to=pl) - if DEBUG: - self.log.info(" adding '%s' to device" % fpath) + if False: + self.log.info(" '%s' added to Device|Books" % metadata.title) return added elif iswindows: if 'iPod' in self.sources: - try: - pythoncom.CoInitialize() - connected_device = self.sources['iPod'] - device = self.iTunes.sources.ItemByName(connected_device) + connected_device = self.sources['iPod'] + device = self.iTunes.sources.ItemByName(connected_device) - added = None - for pl in device.Playlists: - if pl.Kind == self.PlaylistKind.index('User') and \ - pl.SpecialKind == self.PlaylistSpecialKind.index('Books'): - break - else: - if DEBUG: - self.log.info(" no Books playlist found") + db_added = None + for pl in device.Playlists: + if pl.Kind == self.PlaylistKind.index('User') and \ + pl.SpecialKind == self.PlaylistSpecialKind.index('Books'): + break + else: + if DEBUG: + self.log.info(" no Books playlist found") - # Add the passed book to the Device|Books playlist - if pl: - ''' - added = pl.AddFile(fpath) - if DEBUG: - self.log.info(" adding '%s' to device" % fpath) - ''' - file_s = ctypes.c_char_p(fpath) - FileArray = ctypes.c_char_p * 1 - fa = FileArray(file_s) - op_status = pl.AddFiles(fa) + # Add the passed book to the Device|Books playlist + if pl: + file_s = ctypes.c_char_p(fpath) + FileArray = ctypes.c_char_p * 1 + fa = FileArray(file_s) + op_status = pl.AddFiles(fa) + if DEBUG: + sys.stdout.write(" uploading '%s' to Device|Books ..." % metadata.title) + sys.stdout.flush() + + while op_status.InProgress: + time.sleep(0.5) if DEBUG: - sys.stdout.write(" uploading '%s' to device ..." % metadata.title) + sys.stdout.write('.') sys.stdout.flush() + if DEBUG: + sys.stdout.write("\n") + sys.stdout.flush() - while op_status.InProgress: + # This doesn't seem to work with Device, just Library + if False: + if DEBUG: + sys.stdout.write(" waiting for handle to added '%s' ..." % metadata.title) + sys.stdout.flush() + while not op_status.Tracks: time.sleep(0.5) if DEBUG: sys.stdout.write('.') sys.stdout.flush() + if DEBUG: - sys.stdout.write("\n") - sys.stdout.flush() + print + added = op_status.Tracks[0] + else: + # This approach simply scans Library|Books for the book we just added - # This doesn't seem to work with device, just Library - if False: - if DEBUG: - sys.stdout.write(" waiting for handle to added '%s' ..." % metadata.title) - sys.stdout.flush() - while op_status.Tracks is None: - time.sleep(0.5) - if DEBUG: - sys.stdout.write('.') - sys.stdout.flush() - if DEBUG: - print - added = op_status.Tracks[0] - else: - # This approach simply scans Library|Books for the book we just added - added = self._find_device_book( - {'title': metadata.title, - 'author': metadata.author[0]}) - return added + # Try the calibre metadata first + db_added = self._find_device_book( + {'title': metadata.title, + 'author': metadata.authors[0], + 'uuid': metadata.uuid}) - finally: - pythoncom.CoUninitialize() - - return added + return db_added def _add_library_book(self,file, metadata): ''' @@ -1078,7 +1004,7 @@ class ITUNES(DevicePlugin): sys.stdout.write("\n") sys.stdout.flush() - if True: + if False: if DEBUG: sys.stdout.write(" waiting for handle to added '%s' ..." % metadata.title) sys.stdout.flush() @@ -1093,8 +1019,9 @@ class ITUNES(DevicePlugin): else: # This approach simply scans Library|Books for the book we just added added = self._find_library_book( - {'title': metadata.title, - 'author': metadata.author[0]}) + { 'title': metadata.title, + 'author': metadata.author[0], + 'uuid': metadata.uuid}) return added def _add_new_copy(self, fpath, metadata): @@ -1108,12 +1035,11 @@ class ITUNES(DevicePlugin): if self.manual_sync_mode: db_added = self._add_device_book(fpath, metadata) - if DEBUG: - self.log.info(" file uploaded to Device|Books") if not getattr(fpath, 'deleted_after_upload', False): lb_added = self._add_library_book(fpath, metadata) - if DEBUG: - self.log.info(" file added to Library|Books for iTunes:iBooks tracking") + if lb_added: + if DEBUG: + self.log.info(" file added to Library|Books for iTunes<->iBooks tracking") else: lb_added = self._add_library_book(fpath, metadata) if DEBUG: @@ -1121,7 +1047,7 @@ class ITUNES(DevicePlugin): return db_added, lb_added - def _cover_to_thumb(self, path, metadata, lb_added, db_added): + def _cover_to_thumb(self, path, metadata, db_added, lb_added): ''' assumes pythoncom wrapper for db_added ''' @@ -1140,8 +1066,8 @@ class ITUNES(DevicePlugin): db_added.artworks[1].data_.set(cover_data.read()) except: if DEBUG: - self.log.warning(" iTunes automation interface generated an error" - " when adding artwork to '%s'" % metadata.title) + 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 @@ -1176,7 +1102,7 @@ class ITUNES(DevicePlugin): if DEBUG: self.log.info( " refreshing cached thumb for '%s'" % metadata.title) archive_path = os.path.join(self.cache_dir, "thumbs.zip") - zfw = zipfile.ZipFile(archive_path, mode='a') + zfw = ZipFile(archive_path, mode='a') thumb_path = path.rpartition('.')[0] + '.jpg' zfw.writestr(thumb_path, thumb) zfw.close() @@ -1200,6 +1126,7 @@ class ITUNES(DevicePlugin): this_book.path = path this_book.thumbnail = thumb this_book.iTunes_id = lb_added + this_book.uuid = metadata.uuid if isosx: if lb_added: @@ -1231,14 +1158,32 @@ class ITUNES(DevicePlugin): return this_book + def _delete_iTunesMetadata_plist(self,fpath): + ''' + Delete the plist file from the file to force recache + ''' + zf = ZipFile(fpath,'a') + fnames = zf.namelist() + pl_name = 'iTunesMetadata.plist' + try: + plist = [x for x in fnames if pl_name in x][0] + except: + plist = None + if plist: + if DEBUG: + self.log.info(" deleting %s from %s" % (pl_name,fpath)) + zf.delete(pl_name) + zf.close() + def _discover_manual_sync_mode(self, wait=0): ''' Assumes pythoncom for windows wait is passed when launching iTunes, as it seems to need a moment to come to its senses - ''' if DEBUG: self.log.info(" ITUNES._discover_manual_sync_mode()") + if wait: + time.sleep(wait) if isosx: connected_device = self.sources['iPod'] dev_books = None @@ -1248,22 +1193,29 @@ class ITUNES(DevicePlugin): dev_books = pl.file_tracks() break else: - self.log.error(" book_playlist not found") + self.log.error(" book_playlist not found") if len(dev_books): first_book = dev_books[0] - #if DEBUG: - #self.log.info(" determing manual mode by modifying '%s' by %s" % (first_book.name(), first_book.artist())) + if False: + self.log.info(" determing manual mode by modifying '%s' by %s" % (first_book.name(), first_book.artist())) try: first_book.bpm.set(0) self.manual_sync_mode = True except: self.manual_sync_mode = False - self.log.info(" iTunes.manual_sync_mode: %s" % self.manual_sync_mode) + else: + if DEBUG: + self.log.info(" adding tracer to empty Books|Playlist") + try: + added = pl.add(appscript.mactypes.File(P('tracer.epub')),to=pl) + time.sleep(0.5) + added.delete() + self.manual_sync_mode = True + except: + self.manual_sync_mode = False elif iswindows: - if wait: - time.sleep(wait) connected_device = self.sources['iPod'] device = self.iTunes.sources.ItemByName(connected_device) @@ -1283,74 +1235,138 @@ class ITUNES(DevicePlugin): self.manual_sync_mode = True except: self.manual_sync_mode = False - self.log.info(" iTunes.manual_sync_mode: %s" % self.manual_sync_mode) + else: + if DEBUG: + self.log.info(" sending tracer to empty Books|Playlist") + fpath = P('tracer.epub') + mi = MetaInformation('Tracer',['calibre']) + try: + added = self._add_device_book(fpath,mi) + time.sleep(0.5) + added.Delete() + self.manual_sync_mode = True + except: + self.manual_sync_mode = False - def _dump_booklist(self, booklist, header=None): + self.log.info(" iTunes.manual_sync_mode: %s" % self.manual_sync_mode) + + def _dump_booklist(self, booklist, header=None,indent=0): ''' ''' if header: - msg = '\nbooklist, %s' % header + msg = '\n%sbooklist %s:' % (' '*indent,header) self.log.info(msg) - self.log.info('%s' % ('-' * len(msg))) + self.log.info('%s%s' % (' '*indent,'-' * len(msg))) for book in booklist: if isosx: - self.log.info("%-40.40s %-30.30s %-10.10s" % - (book.title, book.author, str(book.library_id)[-9:])) + self.log.info("%s%-40.40s %-30.30s %-10.10s" % + (' '*indent,book.title, book.author, str(book.library_id)[-9:])) elif iswindows: - self.log.info("%-40.40s %-30.30s" % - (book.title, book.author)) + self.log.info("%s%-40.40s %-30.30s" % + (' '*indent,book.title, book.author)) + self.log.info() - def _dump_cached_book(self, cached_book, header=None): + def _dump_cached_book(self, cached_book, header=None,indent=0): + ''' + ''' + if isosx: + 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'], + cached_book['author'], + str(cached_book['lib_book'])[-9:], + 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'])) + + def _dump_cached_books(self, header=None, indent=0): ''' ''' if header: - msg = '%s' % header + msg = '\n%sself.cached_books %s:' % (' '*indent,header) self.log.info(msg) - self.log.info( "%s" % ('-' * len(msg))) + self.log.info( "%s%s" % (' '*indent,'-' * len(msg))) if isosx: - self.log.info("%-40.40s %-30.30s %-10.10s %-10.10s" % - ('title', - 'author', - 'lib_book', - 'dev_book')) - self.log.info("%-40.40s %-30.30s %-10.10s %-10.10s" % - (cached_book['title'], - cached_book['author'], - str(cached_book['lib_book'])[-9:], - str(cached_book['dev_book'])[-9:])) + for cb in self.cached_books.keys(): + self.log.info("%s%-40.40s %-30.30s %-10.10s %-10.10s %s" % + (' '*indent, + self.cached_books[cb]['title'], + self.cached_books[cb]['author'], + str(self.cached_books[cb]['lib_book'])[-9:], + str(self.cached_books[cb]['dev_book'])[-9:], + self.cached_books[cb]['uuid'])) elif iswindows: - self.log.info("%-40.40s %-30.30s" % - (cached_book['title'], - cached_book['author'])) + for cb in self.cached_books.keys(): + self.log.info("%s%-40.40s %-30.30s %s" % + (' '*indent, + self.cached_books[cb]['title'], + self.cached_books[cb]['author'], + self.cached_books[cb]['uuid'])) self.log.info() - def _dump_cached_books(self, header=None): + def _dump_epub_metadata(self, fpath): ''' ''' - if header: - msg = '\nself.cached_books, %s' % header - self.log.info(msg) - self.log.info( "%s" % ('-' * len(msg))) - if isosx: - self.log.info("%-40.40s %-30.30s %-10.10s %-10.10s" % - ('title', - 'author', - 'lib_book', - 'dev_book')) - for cb in self.cached_books.keys(): - self.log.info("%-40.40s %-30.30s %-10.10s %-10.10s" % - (self.cached_books[cb]['title'], - self.cached_books[cb]['author'], - str(self.cached_books[cb]['lib_book'])[-9:], - str(self.cached_books[cb]['dev_book'])[-9:])) - elif iswindows: - for cb in self.cached_books.keys(): - self.log.info("%-40.40s %-30.30s" % - (self.cached_books[cb]['title'], - self.cached_books[cb]['author'])) + self.log.info(" ITUNES.__get_epub_metadata()") + title = None + author = None + timestamp = None + zf = ZipFile(fpath,'r') + 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) + title = soup.find('dc:title').renderContents() + author = soup.find('dc:creator').renderContents() + ts = soup.find('meta',attrs={'name':'calibre:timestamp'}) + if ts: + # Touch existing calibre timestamp + timestamp = ts['content'] + if not title or not author: + if DEBUG: + self.log.error(" couldn't extract title/author from %s in %s" % (opf,fpath)) + self.log.error(" title: %s author: %s timestamp: %s" % (title, author, timestamp)) + else: + if DEBUG: + self.log.error(" can't find .opf in %s" % fpath) + zf.close() + return (title, author, timestamp) + + def _dump_files(self, files, header=None,indent=0): + if header: + msg = '\n%sfiles passed to %s:' % (' '*indent,header) + self.log.info(msg) + self.log.info( "%s%s" % (' '*indent,'-' * len(msg))) + for file in files: + if getattr(file, 'orig_file_path', None) is not None: + self.log.info(" %s%s" % (' '*indent,file.orig_file_path)) + elif getattr(file, 'name', None) is not None: + self.log.info(" %s%s" % (' '*indent,file.name)) self.log.info() def _dump_hex(self, src, length=16): @@ -1366,74 +1382,86 @@ class ITUNES(DevicePlugin): N+=length print result - def _dump_files(self, files, header=None): - if header: - msg = '\nfiles passed to %s:' % header - self.log.info(msg) - self.log.info( "%s" % ('-' * len(msg))) - for file in files: - if getattr(file, 'orig_file_path', None) is not None: - self.log.info(" %s" % file.orig_file_path) - elif getattr(file, 'name', None) is not None: - self.log.info(" %s" % file.name) + def _dump_library_books(self, library_books): + ''' + ''' + if DEBUG: + self.log.info("\n library_books:") + for book in library_books: + self.log.info(" %s" % book) self.log.info() - def _dump_update_list(self,header=None): + def _dump_update_list(self,header=None,indent=0): if header: - msg = '\nself.update_list called from %s' % header + msg = '\n%sself.update_list %s' % (' '*indent,header) self.log.info(msg) - self.log.info( "%s" % ('-' * len(msg))) + self.log.info( "%s%s" % (' '*indent,'-' * len(msg))) if isosx: for ub in self.update_list: - self.log.info("%-40.40s %-30.30s %-10.10s" % - (ub['title'], + self.log.info("%s%-40.40s %-30.30s %-10.10s" % + (' '*indent, + ub['title'], ub['author'], str(ub['lib_book'])[-9:])) elif iswindows: for ub in self.update_list: - self.log.info("%-40.40s %-30.30s" % - (ub['title'], + self.log.info("%s%-40.40s %-30.30s" % + (' '*indent, + ub['title'], ub['author'])) self.log.info() - def _find_device_book(self, cached_book): + def _find_device_book(self, search): ''' Windows-only method to get a handle to device book in the current pythoncom session ''' if iswindows: - if DEBUG: - self.log.info(" ITUNES._find_device_book()") - self.log.info(" looking for '%s' by %s" % (cached_book['title'], cached_book['author'])) - 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'])) attempts = 9 while attempts: - # Find book whose Artist field = cached_book['author'] - hits = dev_books.Search(cached_book['author'],self.SearchField.index('Artists')) + # Try by uuid - only one hit + 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 - there could be multiple hits + hits = dev_books.Search(search['author'],self.SearchField.index('Artists')) if hits: for hit in hits: - self.log.info(" evaluating '%s' by %s" % (hit.Name, hit.Artist)) - if hit.Name == cached_book['title']: - self.log.info(" matched '%s' by %s" % (hit.Name, hit.Artist)) + if hit.Name == search['title']: + if DEBUG: + self.log.info(" found '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Composer)) return hit + attempts -= 1 time.sleep(0.5) if DEBUG: self.log.warning(" attempt #%d" % (10 - attempts)) if DEBUG: - self.log.error(" search for '%s' yielded no hits" % cached_book['title']) + 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()") - self.log.info(" looking for '%s' by %s" % (cached_book['title'], cached_book['author'])) + if 'uuid' in search: + self.log.info(" looking for '%s' by %s (%s)" % + (search['title'], search['author'], search['uuid'])) + else: + self.log.info(" looking for '%s' by %s" % + (search['title'], search['author'])) for source in self.iTunes.sources: if source.Kind == self.Sources.index('Library'): @@ -1460,21 +1488,34 @@ class ITUNES(DevicePlugin): attempts = 9 while attempts: - # Find book whose Artist field = cached_book['author'] - hits = lib_books.Search(cached_book['author'],self.SearchField.index('Artists')) + # Find book whose Album field = search['uuid'] + if 'uuid' in search: + 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.Composer)) + return hit + + 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: - self.log.info(" evaluating '%s' by %s" % (hit.Name, hit.Artist)) - if hit.Name == cached_book['title']: - self.log.info(" matched '%s' by %s" % (hit.Name, hit.Artist)) + if hit.Name == search['title']: + if DEBUG: + self.log.info(" found '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Composer)) return hit + attempts -= 1 time.sleep(0.5) if DEBUG: - self.log.warning(" attempt #%d" % (10 - attempts)) + 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): @@ -1488,11 +1529,11 @@ class ITUNES(DevicePlugin): thumb_path = book_path.rpartition('.')[0] + '.jpg' try: - zfr = zipfile.ZipFile(archive_path) + zfr = ZipFile(archive_path) thumb_data = zfr.read(thumb_path) zfr.close() except: - zfw = zipfile.ZipFile(archive_path, mode='a') + zfw = ZipFile(archive_path, mode='a') else: return thumb_data @@ -1516,6 +1557,10 @@ class ITUNES(DevicePlugin): return thumb.getvalue() except: self.log.error(" error generating thumb for '%s'" % book.name()) + try: + zfw.close() + except: + pass return None elif iswindows: @@ -1526,9 +1571,9 @@ class ITUNES(DevicePlugin): return None # Save the cover from iTunes - tmp_thumb = os.path.join(tempfile.gettempdir(), "thumb.%s" % self.ArtworkFormat[book.Artwork.Item(1).Format]) - book.Artwork.Item(1).SaveArtworkToFile(tmp_thumb) try: + tmp_thumb = os.path.join(tempfile.gettempdir(), "thumb.%s" % self.ArtworkFormat[book.Artwork.Item(1).Format]) + book.Artwork.Item(1).SaveArtworkToFile(tmp_thumb) # Resize the cover im = PILImage.open(tmp_thumb) scaled, width, height = fit_image(im.size[0],im.size[1], 60, 80) @@ -1545,21 +1590,26 @@ class ITUNES(DevicePlugin): return thumb.getvalue() except: self.log.error(" error generating thumb for '%s'" % book.Name) + try: + zfw.close() + except: + pass return None def _get_device_book_size(self, file, compressed_size): ''' Calculate the exploded size of file ''' - myZip = zipfile.ZipFile(file,'r') + myZip = ZipFile(file,'r') myZipList = myZip.infolist() exploded_file_size = 0 for file in myZipList: exploded_file_size += file.file_size - if DEBUG: + 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): @@ -1590,8 +1640,11 @@ class ITUNES(DevicePlugin): self.log.info(" ignoring '%s' of type '%s'" % (book.name(), book.kind())) else: if DEBUG: - self.log.info(" adding %-30.30s [%s]" % (book.name(), book.kind())) + self.log.info(" %-30.30s %-30.30s %-40.40s [%s]" % + (book.name(), book.artist(), book.album(), book.kind())) device_books.append(book) + if DEBUG: + self.log.info() elif iswindows: if 'iPod' in self.sources: @@ -1619,8 +1672,10 @@ class ITUNES(DevicePlugin): self.log.info(" ignoring '%s' of type '%s'" % (book.Name, book.KindAsString)) else: if DEBUG: - self.log.info(" adding %-30.30s [%s]" % (book.Name, 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() finally: pythoncom.CoUninitialize() @@ -1631,8 +1686,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 @@ -1648,11 +1701,12 @@ class ITUNES(DevicePlugin): self.log.error(" no iPad|Books playlist found") return pl - def _get_fpath(self,file): + def _get_fpath(self,file, metadata, update_md=False): ''' If the database copy will be deleted after upload, we have to use file (the PersistentTemporaryFile), which will be around until calibre exits. + If we're using the database copy, delete the plist ''' if DEBUG: self.log.info(" ITUNES._get_fpath()") @@ -1660,12 +1714,20 @@ class ITUNES(DevicePlugin): fpath = file if not getattr(fpath, 'deleted_after_upload', False): if getattr(file, 'orig_file_path', None) is not None: + # Database copy fpath = file.orig_file_path + self._delete_iTunesMetadata_plist(fpath) elif getattr(file, 'name', None) is not None: + # PTF fpath = file.name else: + # Recipe - PTF if DEBUG: self.log.info(" file will be deleted after upload") + + if update_md: + self._update_epub_metadata(fpath, metadata) + return fpath def _get_library_books(self): @@ -1715,12 +1777,12 @@ class ITUNES(DevicePlugin): if str(book.description()).startswith(self.description_prefix): if book.location() == appscript.k.missing_value: library_orphans[path] = book - if DEBUG: - self.log.info(" found calibre orphan '%s' in Library|Books" % book.name()) + if False: + self.log.info(" found iTunes PTF '%s' in Library|Books" % book.name()) library_books[path] = book if DEBUG: - self.log.info(" adding %-30.30s [%s]" % (book.name(), 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') @@ -1730,16 +1792,13 @@ class ITUNES(DevicePlugin): elif iswindows: lib = None -# try: -# pythoncom.CoInitialize() -# self.iTunes = win32com.client.Dispatch("iTunes.Application") for source in self.iTunes.sources: if source.Kind == self.Sources.index('Library'): lib = source - self.log.info(" Library source: '%s' kind: %s" % (lib.Name, self.Sources[lib.Kind])) + self.log.info(" Library source: '%s' kind: %s" % (lib.Name, self.Sources[lib.Kind])) break else: - self.log.error(" Library source not found") + self.log.error(" Library source not found") if lib is not None: lib_books = None @@ -1748,22 +1807,22 @@ class ITUNES(DevicePlugin): if pl.Kind == self.PlaylistKind.index('User') and \ pl.SpecialKind == self.PlaylistSpecialKind.index('Books'): if DEBUG: - self.log.info(" Books playlist: '%s'" % (pl.Name)) + self.log.info(" Books playlist: '%s'" % (pl.Name)) lib_books = pl.Tracks break else: if DEBUG: - self.log.error(" no Library|Books playlist found") + self.log.error(" no Library|Books playlist found") else: if DEBUG: - self.log.error(" no Library playlists found") + self.log.error(" no Library playlists found") try: for book in lib_books: # This may need additional entries for international iTunes users if book.KindAsString in ['MPEG audio file']: if DEBUG: - self.log.info(" ignoring %-30.30s of type '%s'" % (book.Name, book.KindAsString)) + self.log.info(" ignoring %-30.30s of type '%s'" % (book.Name, book.KindAsString)) else: path = self.path_template % (book.Name, book.Artist) @@ -1771,17 +1830,15 @@ class ITUNES(DevicePlugin): if book.Description.startswith(self.description_prefix): if not book.Location: library_orphans[path] = book - if DEBUG: - self.log.info(" found calibre orphan '%s' in Library|Books" % book.Name) + if False: + self.log.info(" found iTunes PTF '%s' in Library|Books" % book.Name) library_books[path] = book if DEBUG: - self.log.info(" adding %-30.30s [%s]" % (book.Name, 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") -# finally: -# pythoncom.CoUninitialize() self.library_orphans = library_orphans return library_books @@ -1811,8 +1868,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'] @@ -1855,24 +1916,25 @@ class ITUNES(DevicePlugin): self.log.info( "ITUNES:open(): Launching iTunes" ) self.iTunes = iTunes= appscript.app('iTunes', hide=True) iTunes.run() - initial_status = 'launched' + self.initial_status = 'launched' else: self.iTunes = appscript.app('iTunes') - initial_status = 'already running' + self.initial_status = 'already running' # Read the current storage path for iTunes media cmd = "defaults read com.apple.itunes NSNavLastRootDirectory" proc = subprocess.Popen( cmd, shell=True, cwd=os.curdir, stdout=subprocess.PIPE) proc.wait() - media_dir = os.path.abspath(proc.communicate()[0].strip()) + media_dir = os.path.expanduser(proc.communicate()[0].strip()) if os.path.exists(media_dir): self.iTunes_media = media_dir else: 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 (%s), driver version %d.%d.%d]" % - (self.iTunes.name(), self.iTunes.version(), initial_status, + 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: @@ -1884,7 +1946,7 @@ class ITUNES(DevicePlugin): self.iTunes = win32com.client.Dispatch("iTunes.Application") if not DEBUG: self.iTunes.Windows[0].Minimized = True - initial_status = 'launched' + self.initial_status = 'launched' # Read the current storage path for iTunes media from the XML file with open(self.iTunes.LibraryXMLPath, 'r') as xml: @@ -1900,82 +1962,81 @@ class ITUNES(DevicePlugin): self.log.error(" '%s' not found" % media_dir) if DEBUG: - self.log.info(" [%s - %s (%s), driver version %d.%d.%d]" % - (self.iTunes.Windows[0].name, self.iTunes.Version, initial_status, + 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])) self.log.info(" iTunes_media: %s" % self.iTunes_media) - def _purge_orphans(self,cached_books): + def _purge_orphans(self,library_books, cached_books): ''' - Scan self.library_orphans for any paths not on device - Remove any true orphans from iTunes - This occurs when recipes are uploaded in a previous session - and the book has since been deleted on the device + Scan library_books for any paths not on device + Remove any iTunes orphans originally added by calibre + This occurs when the user deletes a book in iBooks while disconnected ''' if DEBUG: - self.log.info(" ITUNES._purge_orphans") + self.log.info(" ITUNES._purge_orphans()") + #self._dump_library_books(library_books) #self.log.info(" cached_books:\n %s" % "\n ".join(cached_books.keys())) - orphan_paths = {} - - if isosx: - for orphan in self.library_orphans: - path = self.path_template % (self.library_orphans[orphan].name(), - self.library_orphans[orphan].artist()) - orphan_paths[path] = self.library_orphans[orphan] - - # Scan orphan_paths for paths not found in cached_books - for orphan in orphan_paths.keys(): - if orphan not in cached_books: + for book in library_books: + if isosx: + if book not in cached_books and \ + str(library_books[book].description()).startswith(self.description_prefix): if DEBUG: - self.log.info(" '%s' not found on device, removing from iTunes" % orphan) - self.iTunes.delete(orphan_paths[orphan]) - - elif iswindows: - for orphan in self.library_orphans: - path = self.path_template % (self.library_orphans[orphan].Name, - self.library_orphans[orphan].Artist) - orphan_paths[path] = self.library_orphans[orphan] - - # Scan orphan_paths for paths not found in cached_books - for orphan in orphan_paths.keys(): - if orphan not in cached_books: + self.log.info(" '%s' not found on iDevice, removing from iTunes" % book) + btr = { 'title':library_books[book].name(), + 'author':library_books[book].artist(), + 'lib_book':library_books[book]} + self._remove_from_iTunes(btr) + elif iswindows: + if book not in cached_books and \ + library_books[book].Description.startswith(self.description_prefix): if DEBUG: - self.log.info(" '%s' not found on device, removing from iTunes" % orphan) - orphan_paths[orphan].Delete() + self.log.info(" '%s' not found on iDevice, removing from iTunes" % book) + btr = { 'title':library_books[book].Name, + 'author':library_books[book].Artist, + 'lib_book':library_books[book]} + self._remove_from_iTunes(btr) + if DEBUG: + self.log.info() - def _remove_existing_copies(self,path,file,metadata): + def _remove_existing_copy(self, path, metadata): ''' ''' if DEBUG: - self.log.info(" ITUNES._remove_existing_copies()") + self.log.info(" ITUNES._remove_existing_copy()") if self.manual_sync_mode: # Delete existing from Device|Books, add to self.update_list # for deletion from booklist[0] during add_books_to_metadata - if path in self.cached_books: - self.update_list.append(self.cached_books[path]) - self._remove_from_device(self.cached_books[path]) - if DEBUG: - self.log.info( " deleting device book '%s'" % (path)) - if not getattr(file, 'deleted_after_upload', False): - self._remove_from_iTunes(self.cached_books[path]) + for book in self.cached_books: + if self.cached_books[book]['uuid'] == metadata.uuid: + self.update_list.append(self.cached_books[book]) + self._remove_from_device(self.cached_books[book]) if DEBUG: - self.log.info(" deleting library book '%s'" % path) + self.log.info( " deleting device book '%s'" % (metadata.title)) + if not getattr(file, 'deleted_after_upload', False): + 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: # Delete existing from Library|Books, add to self.update_list # for deletion from booklist[0] during add_books_to_metadata - if path in self.cached_books: - self.update_list.append(self.cached_books[path]) - self._remove_from_iTunes(self.cached_books[path]) - if DEBUG: - self.log.info( " deleting library book '%s'" % path) - else: - if DEBUG: - self.log.info(" '%s' not in cached_books" % metadata.title) + for book in self.cached_books: + if self.cached_books[book]['uuid'] == metadata.uuid: + 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) def _remove_from_device(self, cached_book): ''' @@ -1983,22 +2044,18 @@ class ITUNES(DevicePlugin): ''' self.log.info(" ITUNES._remove_from_device()") if isosx: - if DEBUG: + if False: self.log.info(" deleting %s" % cached_book['dev_book']) cached_book['dev_book'].delete() elif iswindows: dev_pl = self._get_device_books_playlist() - hits = dev_pl.Search(cached_book['author'],self.SearchField.index('Artists')) + hits = dev_pl.Search(cached_book['uuid'],self.SearchField.index('All')) if hits: - for hit in hits: - if DEBUG: - self.log.info(" evaluating '%s' by %s" % (hit.Name, hit.Artist)) - if hit.Name == cached_book['title']: - if DEBUG: - self.log.info(" deleting '%s' by %s" % (hit.Name, hit.Artist)) - hit.Delete() - break + hit = hits[0] + if False: + self.log.info(" deleting '%s' by %s (%s)" % (hit.Name, hit.Artist, hit.Album)) + hit.Delete() def _remove_from_iTunes(self, cached_book): ''' @@ -2036,46 +2093,106 @@ class ITUNES(DevicePlugin): self.log.info(" author_storage_path not empty (%d objects):" % len(author_files)) self.log.info(" %s" % '\n'.join(author_files)) else: - self.log.info(" '%s' stored external to iTunes, no files deleted" % cached_book['title']) + self.log.info(" '%s' (stored external to iTunes, no files deleted)" % cached_book['title']) except: # We get here if there was an error with .location().path - self.log.info(" removing orphan '%s' from iTunes" % cached_book['title']) + if DEBUG: + self.log.info(" '%s' not found in iTunes" % cached_book['title']) - self.iTunes.delete(cached_book['lib_book']) + try: + self.iTunes.delete(cached_book['lib_book']) + except: + if DEBUG: + self.log.info(" unable to remove '%s' from iTunes" % cached_book['title']) elif iswindows: ''' Assume we're wrapped in a pythoncom Windows stores the book under a common author directory, so we just delete the .epub ''' - - book = self._find_library_book(cached_book) - if book: + try: + book = cached_book['lib_book'] path = book.Location - storage_path = os.path.split(book.Location) - if book.Location.startswith(self.iTunes_media): + except: + book = self._find_library_book(cached_book) + path = book.Location + + if book: + storage_path = os.path.split(path) + if path.startswith(self.iTunes_media): if DEBUG: - self.log.info(" removing '%s' at %s" % + self.log.info(" removing '%s' at %s" % (cached_book['title'], path)) try: os.remove(path) except: - self.log.warning(" could not find '%s' in iTunes storage" % path) + self.log.warning(" could not find '%s' in iTunes storage" % path) try: os.rmdir(storage_path[0]) - self.log.info(" removed folder '%s'" % storage_path[0]) + self.log.info(" removed folder '%s'" % storage_path[0]) except: - self.log.info(" folder '%s' not found or not empty" % storage_path[0]) + self.log.info(" folder '%s' not found or not empty" % storage_path[0]) # Delete from iTunes database else: - self.log.info(" '%s' stored external to iTunes, no files deleted" % cached_book['title']) - - book.Delete() - + self.log.info(" '%s' (stored external to iTunes, no files deleted)" % cached_book['title']) else: - self.log.warning(" could not find '%s' in iTunes database" % cached_book['title']) + if DEBUG: + self.log.info(" '%s' not found in iTunes" % cached_book['title']) + try: + book.Delete() + except: + if DEBUG: + self.log.info(" unable to remove '%s' from iTunes" % cached_book['title']) + + def _update_epub_metadata(self, fpath, metadata): + ''' + ''' + self.log.info(" ITUNES._update_epub_metadata()") + + # Refresh epub metadata + with open(fpath,'r+b') as zfo: + # 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) + 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) + else: + metadata.timestamp = isoformat(now()) + if DEBUG: + self.log.info(" add timestamp: %s" % metadata.timestamp) + zf_opf.close() + + # If 'News' in tags, tweak the title/author for friendlier display in iBooks + if _('News') in metadata.tags: + if metadata.title.find('[') > 0: + metadata.title = metadata.title[:metadata.title.find('[')-1] + date_as_author = '%s, %s %s, %s' % (strftime('%A'), strftime('%B'), strftime('%d').lstrip('0'), strftime('%Y')) + metadata.author = metadata.authors = [date_as_author] + sort_author = re.sub('^\s*A\s+|^\s*The\s+|^\s*An\s+', '', metadata.title).rstrip() + metadata.author_sort = '%s %s' % (sort_author, strftime('%Y-%m-%d')) + + # Remove any non-alpha category tags + for tag in metadata.tags: + if not self._is_alpha(tag[0]): + metadata.tags.remove(tag) + + # If windows & series, nuke tags so series used as Category during _update_iTunes_metadata() + if iswindows and metadata.series: + metadata.tags = None + + set_metadata(zfo, metadata, update_timestamp=True) def _update_device(self, msg='', wait=True): ''' @@ -2133,6 +2250,22 @@ class ITUNES(DevicePlugin): strip_tags = re.compile(r'<[^<]*?/?>') if isosx: + if lb_added: + lb_added.album.set(metadata.title) + 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 db_added: + db_added.album.set(metadata.title) + 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 metadata.comments: if lb_added: lb_added.comment.set(strip_tags.sub('',metadata.comments)) @@ -2149,31 +2282,47 @@ class ITUNES(DevicePlugin): except: pass - if lb_added: - 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) + # Set genre from series if available, else first alpha tag + # Otherwise iTunes grabs the first dc:subject from the opf metadata + if self.use_series_data and metadata.series: + if lb_added: + lb_added.sort_name.set("%s %03d" % (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.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) - - # Set genre from metadata - # iTunes grabs the first dc:subject from the opf metadata, - # But we can manually override with first tag starting with alpha - for tag in metadata.tags: - if self._is_alpha(tag[0]): - if lb_added: - lb_added.genre.set(tag) - if db_added: - db_added.genre.set(tag) - break + if db_added: + db_added.sort_name.set("%s %03d" % (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: + for tag in metadata.tags: + if self._is_alpha(tag[0]): + if lb_added: + lb_added.genre.set(tag) + if db_added: + db_added.genre.set(tag) + break elif iswindows: + if lb_added: + lb_added.Album = metadata.title + 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 db_added: + db_added.Album = metadata.title + 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 metadata.comments: if lb_added: lb_added.Comment = (strip_tags.sub('',metadata.comments)) @@ -2188,29 +2337,42 @@ class ITUNES(DevicePlugin): if db_added: db_added.AlbumRating = (metadata.rating*10) except: - pass + if DEBUG: + self.log.warning(" iTunes automation interface reported an error" + " setting AlbumRating on iDevice") - if lb_added: - 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) + # 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 db_added: - db_added.Description = ("%s %s" % (self.description_prefix,strftime('%Y-%m-%d %H:%M:%S'))) - db_added.SortArtist = (metadata.author_sort.title()) - db_added.SortName = (this_book.title_sorter) + if self.use_series_data and metadata.series: + if lb_added: + lb_added.SortName = "%s %03d" % (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.SortName = "%s %03d" % (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 on iDevice") + elif metadata.tags: + for tag in metadata.tags: + if self._is_alpha(tag[0]): + if lb_added: + lb_added.Genre = tag + if db_added: + db_added.Genre = tag + break - # Set genre from metadata - # iTunes grabs the first dc:subject from the opf metadata, - # But we can manually override with first tag starting with alpha - for tag in metadata.tags: - if self._is_alpha(tag[0]): - if lb_added: - lb_added.Category = (tag) - if db_added: - db_added.Category = (tag) - break class BookList(list): ''' diff --git a/src/calibre/devices/eb600/driver.py b/src/calibre/devices/eb600/driver.py index 307531c357..9b7a21a3bb 100644 --- a/src/calibre/devices/eb600/driver.py +++ b/src/calibre/devices/eb600/driver.py @@ -201,4 +201,21 @@ class ELONEX(EB600): def can_handle(cls, dev, debug=False): return dev[3] == 'Elonex' and dev[4] == 'eBook' +class POCKETBOOK301(USBMS): + + name = 'PocketBook 301 Device Interface' + description = _('Communicate with the PocketBook 301 reader.') + author = 'Kovid Goyal' + supported_platforms = ['windows', 'osx', 'linux'] + FORMATS = ['epub', 'fb2', 'prc', 'mobi', 'pdf', 'djvu', 'rtf', 'chm', 'txt'] + + SUPPORTS_SUB_DIRS = True + + MAIN_MEMORY_VOLUME_LABEL = 'PocketBook 301 Main Memory' + STORAGE_CARD_VOLUME_LABEL = 'PocketBook 301 Storage Card' + + VENDOR_ID = [0x1] + PRODUCT_ID = [0x301] + BCD = [0x132] + diff --git a/src/calibre/devices/hanlin/driver.py b/src/calibre/devices/hanlin/driver.py index adb4b353f3..0d972afc76 100644 --- a/src/calibre/devices/hanlin/driver.py +++ b/src/calibre/devices/hanlin/driver.py @@ -81,9 +81,6 @@ class HANLINV3(USBMS): return drives - - - class HANLINV5(HANLINV3): name = 'Hanlin V5 driver' gui_name = 'Hanlin V5' @@ -120,8 +117,22 @@ class BOOX(HANLINV3): MAIN_MEMORY_VOLUME_LABEL = 'BOOX Internal Memory' STORAGE_CARD_VOLUME_LABEL = 'BOOX Storage Card' - EBOOK_DIR_MAIN = 'MyBooks' - EBOOK_DIR_CARD_A = 'MyBooks' + EBOOK_DIR_MAIN = ['MyBooks'] + EXTRA_CUSTOMIZATION_MESSAGE = _('Comma separated list of directories to ' + 'send e-books to on the device. The first one that exists will ' + 'be used.') + EXTRA_CUSTOMIZATION_DEFAULT = ', '.join(EBOOK_DIR_MAIN) + + # EBOOK_DIR_CARD_A = 'MyBooks' ## Am quite sure we need this. + + def post_open_callback(self): + opts = self.settings() + dirs = opts.extra_customization + if not dirs: + dirs = self.EBOOK_DIR_MAIN + else: + dirs = [x.strip() for x in dirs.split(',')] + self.EBOOK_DIR_MAIN = dirs def windows_sort_drives(self, drives): return drives diff --git a/src/calibre/devices/kindle/driver.py b/src/calibre/devices/kindle/driver.py index c88a443689..cd56d210e1 100644 --- a/src/calibre/devices/kindle/driver.py +++ b/src/calibre/devices/kindle/driver.py @@ -7,12 +7,33 @@ __docformat__ = 'restructuredtext en' ''' Device driver for Amazon's Kindle ''' -import datetime, os, re, sys +import datetime, os, re, sys, json, hashlib from cStringIO import StringIO from struct import unpack from calibre.devices.usbms.driver import USBMS +''' +Notes on collections: + +A collections cache is stored at system/collections.json +The cache is read only, changes made to it are overwritten (it is regenerated) +on device disconnect + +A log of collection creation/manipulation is available at +system/userannotationlog + +collections.json refers to books via a SHA1 hash of the absolute path to the +book (prefix is /mnt/us on my Kindle). The SHA1 hash may or may not be prefixed +by some characters, use the last 40 characters. + +Changing the metadata and resending the file doesn't seem to affect collections + +Adding a book to a collection on the Kindle does not change the book file at all +(i.e. it is binary identical). Therefore collection information is not stored in +file metadata. +''' + class KINDLE(USBMS): name = 'Kindle Device Interface' @@ -60,6 +81,7 @@ class KINDLE(USBMS): 'replace') return mi + def get_annotations(self, path_map): MBP_FORMATS = [u'azw', u'mobi', u'prc', u'txt'] mbp_formats = set(MBP_FORMATS) @@ -150,6 +172,37 @@ class KINDLE2(KINDLE): PRODUCT_ID = [0x0002] BCD = [0x0100] + def books(self, oncard=None, end_session=True): + bl = USBMS.books(self, oncard=oncard, end_session=end_session) + # Read collections information + collections = os.path.join(self._main_prefix, 'system', 'collections.json') + if os.access(collections, os.R_OK): + try: + self.kindle_update_booklist(bl, collections) + except: + import traceback + traceback.print_exc() + return bl + + def kindle_update_booklist(self, bl, collections): + with open(collections, 'rb') as f: + collections = f.read() + collections = json.loads(collections) + path_map = {} + for name, val in collections.items(): + col = name.split('@')[0] + items = val.get('items', []) + for x in items: + x = x[-40:] + if x not in path_map: + path_map[x] = set([]) + path_map[x].add(col) + if path_map: + for book in bl: + path = '/mnt/us/'+book.lpath + h = hashlib.sha1(path).hexdigest() + if h in path_map: + book.device_collections = list(sorted(path_map[h])) class KINDLE_DX(KINDLE2): diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index 38fac8b266..5860826778 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -55,6 +55,7 @@ class PRS505(USBMS): SUPPORTS_SUB_DIRS = True MUST_READ_METADATA = True + SUPPORTS_USE_AUTHOR_SORT = True EBOOK_DIR_MAIN = 'database/media/books' EXTRA_CUSTOMIZATION_MESSAGE = _('Comma separated list of metadata fields ' @@ -125,7 +126,7 @@ class PRS505(USBMS): d = os.path.dirname(paths[source_id]) if not os.path.exists(d): os.makedirs(d) - return XMLCache(paths, prefixes) + return XMLCache(paths, prefixes, self.settings().use_author_sort) def books(self, oncard=None, end_session=True): debug_print('PRS505: starting fetching books for card', oncard) diff --git a/src/calibre/devices/prs505/sony_cache.py b/src/calibre/devices/prs505/sony_cache.py index 727bdf68b2..e7d0e4686c 100644 --- a/src/calibre/devices/prs505/sony_cache.py +++ b/src/calibre/devices/prs505/sony_cache.py @@ -60,12 +60,13 @@ def uuid(): class XMLCache(object): - def __init__(self, paths, prefixes): + def __init__(self, paths, prefixes, use_author_sort): if DEBUG: debug_print('Building XMLCache...') pprint(paths) self.paths = paths self.prefixes = prefixes + self.use_author_sort = use_author_sort # Parse XML files {{{ parser = etree.XMLParser(recover=True) @@ -434,7 +435,10 @@ class XMLCache(object): if not ts: ts = title_sort(title) record.set('titleSorter', ts) - record.set('author', authors_to_string(book.authors)) + if self.use_author_sort and book.author_sort is not None: + record.set('author', book.author_sort) + else: + record.set('author', authors_to_string(book.authors)) ext = os.path.splitext(path)[1] if ext: ext = ext[1:].lower() diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index 2f01b8dd41..d899c8e995 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -80,6 +80,7 @@ class Device(DeviceConfig, DevicePlugin): 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 a8220261f3..5edefff743 100644 --- a/src/calibre/devices/usbms/deviceconfig.py +++ b/src/calibre/devices/usbms/deviceconfig.py @@ -32,6 +32,8 @@ class DeviceConfig(object): help=_('Place files in sub directories if the device supports them')) c.add_opt('read_metadata', default=True, help=_('Read metadata from files on device')) + c.add_opt('use_author_sort', default=False, + help=_('Use author sort instead of author')) c.add_opt('save_template', default=cls._default_save_template(), help=_('Template to control how books are saved')) c.add_opt('extra_customization', @@ -47,7 +49,8 @@ class DeviceConfig(object): def config_widget(cls): from calibre.gui2.device_drivers.configwidget import ConfigWidget cw = ConfigWidget(cls.settings(), cls.FORMATS, cls.SUPPORTS_SUB_DIRS, - cls.MUST_READ_METADATA, cls.EXTRA_CUSTOMIZATION_MESSAGE) + cls.MUST_READ_METADATA, cls.SUPPORTS_USE_AUTHOR_SORT, + cls.EXTRA_CUSTOMIZATION_MESSAGE) return cw @classmethod @@ -58,6 +61,8 @@ class DeviceConfig(object): proxy['use_subdirs'] = config_widget.use_subdirs() if not cls.MUST_READ_METADATA: proxy['read_metadata'] = config_widget.read_metadata() + if cls.SUPPORTS_USE_AUTHOR_SORT: + proxy['use_author_sort'] = config_widget.use_author_sort() if cls.EXTRA_CUSTOMIZATION_MESSAGE: ec = unicode(config_widget.opt_extra_customization.text()).strip() if not ec: diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index 6f558b9b34..2fc8b0d814 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -299,7 +299,7 @@ class USBMS(CLI, Device): def replfunc(match): if match.group(1) in ['title', 'series', 'series_index', 'isbn']: return '(?P<' + match.group(1) + '>.+?)' - elif match.group(1) == 'authors': + elif match.group(1) in ['authors', 'author_sort']: return '(?P.+?)' else: return '(.+?)' diff --git a/src/calibre/ebooks/chm/reader.py b/src/calibre/ebooks/chm/reader.py index bbb43af567..d0a81e8e7f 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.utils.chm.chm import CHMFile from calibre.utils.chm.chmlib import ( CHM_RESOLVE_SUCCESS, CHM_ENUMERATE_NORMAL, @@ -135,10 +135,16 @@ class CHMReader(CHMFile): if lpath.find(';') != -1: # fix file names with ";" at the end, see _reformat() lpath = lpath.split(';')[0] - with open(lpath, 'wb') as f: - if guess_mimetype(path)[0] == ('text/html'): - data = self._reformat(data) - f.write(data) + try: + with open(lpath, 'wb') as f: + if guess_mimetype(path)[0] == ('text/html'): + data = self._reformat(data) + f.write(data) + except: + if iswindows and len(lpath) > 250: + self.log.warn('%r filename too long, skipping'%path) + continue + raise self._extracted = True files = os.listdir(output_dir) if self.hhc_path not in files: diff --git a/src/calibre/ebooks/epub/output.py b/src/calibre/ebooks/epub/output.py index ee779aaefa..75739e6a69 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.') @@ -385,14 +385,6 @@ class EPUBOutput(OutputFormatPlugin): if val and not pval: rule.style.setProperty('padding-left', val) - if stylesheet is not None: - stylesheet.data.add('a { color: inherit; text-decoration: inherit; ' - 'cursor: default; }') - stylesheet.data.add('a[href] { color: blue; ' - 'text-decoration: underline; cursor:pointer; }') - else: - self.oeb.log.warn('No stylesheet found') - # }}} def workaround_sony_quirks(self): # {{{ diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index 6b573a0420..690cca511a 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -28,10 +28,14 @@ def authors_to_string(authors): else: return '' +_bracket_pat = re.compile(r'[\[({].*?[})\]]') def author_to_author_sort(author): + if not author: + return '' method = tweaks['author_sort_copy_method'] - if method == 'copy' or (method == 'comma' and author.count(',') > 0): + if method == 'copy' or (method == 'comma' and ',' in author): return author + author = _bracket_pat.sub('', author).strip() tokens = author.split() tokens = tokens[-1:] + tokens[:-1] if len(tokens) > 1: @@ -223,6 +227,7 @@ class MetaInformation(object): 'isbn', 'tags', 'cover_data', 'application_id', 'guide', 'manifest', 'spine', 'toc', 'cover', 'language', 'book_producer', 'timestamp', 'lccn', 'lcc', 'ddc', + 'author_sort_map', 'pubdate', 'rights', 'publication_type', 'uuid'): if hasattr(mi, attr): setattr(ans, attr, getattr(mi, attr)) @@ -244,6 +249,7 @@ class MetaInformation(object): self.tags = getattr(mi, 'tags', []) #: mi.cover_data = (ext, data) self.cover_data = getattr(mi, 'cover_data', (None, None)) + self.author_sort_map = getattr(mi, 'author_sort_map', {}) for x in ('author_sort', 'title_sort', 'comments', 'category', 'publisher', 'series', 'series_index', 'rating', 'isbn', 'language', @@ -254,11 +260,11 @@ class MetaInformation(object): setattr(self, x, getattr(mi, x, None)) def print_all_attributes(self): - for x in ('author', 'author_sort', 'title_sort', 'comments', 'category', 'publisher', + for x in ('title','author', 'author_sort', 'title_sort', 'comments', 'category', 'publisher', 'series', 'series_index', 'tags', 'rating', 'isbn', 'language', 'application_id', 'manifest', 'toc', 'spine', 'guide', 'cover', 'book_producer', 'timestamp', 'lccn', 'lcc', 'ddc', 'pubdate', - 'rights', 'publication_type', 'uuid' + 'rights', 'publication_type', 'uuid', 'author_sort_map' ): prints(x, getattr(self, x, 'None')) @@ -288,6 +294,9 @@ class MetaInformation(object): self.tags += mi.tags self.tags = list(set(self.tags)) + if mi.author_sort_map: + self.author_sort_map.update(mi.author_sort_map) + if getattr(mi, 'cover_data', False): other_cover = mi.cover_data[-1] self_cover = self.cover_data[-1] if self.cover_data else '' diff --git a/src/calibre/ebooks/metadata/archive.py b/src/calibre/ebooks/metadata/archive.py index 45d549b6ea..624c2ad5e5 100644 --- a/src/calibre/ebooks/metadata/archive.py +++ b/src/calibre/ebooks/metadata/archive.py @@ -10,12 +10,31 @@ import os from contextlib import closing from calibre.customize import FileTypePlugin +from calibre.utils.zipfile import ZipFile, stringFileHeader def is_comic(list_of_names): extensions = set([x.rpartition('.')[-1].lower() for x in list_of_names]) comic_extensions = set(['jpg', 'jpeg', 'png']) return len(extensions - comic_extensions) == 0 +def archive_type(stream): + try: + pos = stream.tell() + except: + pos = 0 + id_ = stream.read(4) + ans = None + if id_ == stringFileHeader: + ans = 'zip' + elif id_.startswith('Rar'): + ans = 'rar' + try: + stream.seek(pos) + except: + pass + return ans + + class ArchiveExtract(FileTypePlugin): name = 'Archive Extract' author = 'Kovid Goyal' @@ -31,7 +50,6 @@ class ArchiveExtract(FileTypePlugin): if is_rar: from calibre.libunrar import extract_member, names else: - from calibre.utils.zipfile import ZipFile zf = ZipFile(archive, 'r') if is_rar: diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index 8483c2bddb..c3b95f1188 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -35,6 +35,8 @@ PUBLICATION_METADATA_FIELDS = frozenset([ 'title_sort', # Ordered list of authors. Must never be None, can be [_('Unknown')] 'authors', + # Map of sort strings for each author + 'author_sort_map', # Pseudo field that can be set, but if not set is auto generated # from authors and languages 'author_sort', diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index ad5dd17ace..ba34f04f95 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -16,6 +16,7 @@ NULL_VALUES = { 'classifiers' : {}, 'languages' : [], 'device_collections': [], + 'author_sort_map': {}, 'authors' : [_('Unknown')], 'title' : _('Unknown'), } diff --git a/src/calibre/ebooks/metadata/douban.py b/src/calibre/ebooks/metadata/douban.py new file mode 100644 index 0000000000..c881721fcc --- /dev/null +++ b/src/calibre/ebooks/metadata/douban.py @@ -0,0 +1,258 @@ +from __future__ import with_statement +__license__ = 'GPL 3' +__copyright__ = '2009, Kovid Goyal ; 2010, Li Fanxi ' +__docformat__ = 'restructuredtext en' + +import sys, textwrap +import traceback +from urllib import urlencode +from functools import partial +from lxml import etree + +from calibre import browser, preferred_encoding +from calibre.ebooks.metadata import MetaInformation +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', + 'db': 'http://www.douban.com/xmlns/' + } +XPath = partial(etree.XPath, namespaces=NAMESPACES) +total_results = XPath('//openSearch:totalResults') +start_index = XPath('//openSearch:startIndex') +items_per_page = XPath('//openSearch:itemsPerPage') +entry = XPath('//atom:entry') +entry_id = XPath('descendant::atom:id') +title = XPath('descendant::atom:title') +description = XPath('descendant::atom:summary') +publisher = XPath("descendant::db:attribute[@name='publisher']") +isbn = XPath("descendant::db:attribute[@name='isbn13']") +date = XPath("descendant::db:attribute[@name='pubdate']") +creator = XPath("descendant::db:attribute[@name='author']") +tag = XPath("descendant::db:tag") + +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 + + def fetch(self): + try: + self.results = search(self.title, self.book_author, self.publisher, + self.isbn, max_results=10, + verbose=self.verbose) + except Exception, e: + self.exception = e + self.tb = traceback.format_exc() + +def report(verbose): + if verbose: + import traceback + traceback.print_exc() + +class Query(object): + + SEARCH_URL = 'http://api.douban.com/book/subjects?' + ISBN_URL = 'http://api.douban.com/book/subject/isbn/' + + type = "search" + + def __init__(self, title=None, author=None, publisher=None, isbn=None, + max_results=20, start_index=1): + assert not(title is None and author is None and publisher is None and \ + isbn is None) + assert (int(max_results) < 21) + q = '' + if isbn is not None: + q = isbn + self.type = 'isbn' + else: + def build_term(parts): + return ' '.join(x for x in parts) + if title is not None: + q += build_term(title.split()) + if author is not None: + q += (' ' if q else '') + build_term(author.split()) + if publisher is not None: + q += (' ' if q else '') + build_term(publisher.split()) + self.type = 'search' + + if isinstance(q, unicode): + q = q.encode('utf-8') + + 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 + 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 + + def __call__(self, browser, verbose): + if verbose: + print 'Query:', self.url + if self.type == "search": + feed = etree.fromstring(browser.open(self.url).read()) + total = int(total_results(feed)[0].text) + start = int(start_index(feed)[0].text) + entries = entry(feed) + new_start = start + len(entries) + if new_start > total: + new_start = 0 + return entries, new_start + elif self.type == "isbn": + feed = etree.fromstring(browser.open(self.url).read()) + entries = entry(feed) + return entries, 0 + +class ResultList(list): + + def get_description(self, entry, verbose): + try: + desc = description(entry) + if desc: + return 'SUMMARY:\n'+desc[0].text + except: + report(verbose) + + def get_title(self, entry): + candidates = [x.text for x in title(entry)] + return ': '.join(candidates) + + def get_authors(self, entry): + m = creator(entry) + if not m: + m = [] + m = [x.text for x in m] + return m + + def get_tags(self, entry, verbose): + try: + btags = [x.attrib["name"] for x in tag(entry)] + tags = [] + for t in btags: + tags.extend([y.strip() for y in t.split('/')]) + tags = list(sorted(list(set(tags)))) + except: + report(verbose) + tags = [] + return [x.replace(',', ';') for x in tags] + + def get_publisher(self, entry, verbose): + try: + pub = publisher(entry)[0].text + except: + pub = None + return pub + + def get_isbn(self, entry, verbose): + try: + isbn13 = isbn(entry)[0].text + except Exception: + isbn13 = None + return isbn13 + + def get_date(self, entry, verbose): + try: + d = date(entry) + if d: + default = utcnow().replace(day=15) + d = parse_date(d[0].text, assume_utc=True, default=default) + else: + d = None + except: + report(verbose) + d = None + return d + + def populate(self, entries, browser, verbose=False): + for x in entries: + try: + id_url = entry_id(x)[0].text + title = self.get_title(x) + except: + 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 + raw = browser.open(id_url).read() + feed = etree.fromstring(raw) + x = entry(feed)[0] + except Exception, e: + if verbose: + print 'Failed to get all details for an entry' + print e + mi.comments = self.get_description(x, verbose) + mi.tags = self.get_tags(x, verbose) + mi.isbn = self.get_isbn(x, verbose) + mi.publisher = self.get_publisher(x, verbose) + mi.pubdate = self.get_date(x, verbose) + self.append(mi) + +def search(title=None, author=None, publisher=None, isbn=None, + verbose=False, max_results=40): + br = browser() + start, entries = 1, [] + 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) + if not new: + break + entries.extend(new) + + entries = entries[:max_results] + + ans = ResultList() + ans.populate(entries, br, verbose) + return ans + +def option_parser(): + parser = OptionParser(textwrap.dedent( + '''\ + %prog [options] + + Fetch book metadata from Douban. You must specify one of title, author, + publisher or ISBN. If you specify ISBN the others are ignored. Will + fetch a maximum of 100 matches, so you should make your query as + specific as possible. + ''' + )) + parser.add_option('-t', '--title', help='Book title') + parser.add_option('-a', '--author', help='Book author(s)') + parser.add_option('-p', '--publisher', help='Book publisher') + parser.add_option('-i', '--isbn', help='Book ISBN') + parser.add_option('-m', '--max-results', default=10, + help='Maximum number of results to fetch') + parser.add_option('-v', '--verbose', default=0, action='count', + help='Be more verbose about errors') + return parser + +def main(args=sys.argv): + parser = option_parser() + opts, args = parser.parse_args(args) + try: + results = search(opts.title, opts.author, opts.publisher, opts.isbn, + verbose=opts.verbose, max_results=int(opts.max_results)) + except AssertionError: + report(True) + parser.print_help() + return 1 + for result in results: + print unicode(result).encode(preferred_encoding) + print + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/calibre/ebooks/metadata/epub.py b/src/calibre/ebooks/metadata/epub.py index d74ed37f66..b3980451bf 100644 --- a/src/calibre/ebooks/metadata/epub.py +++ b/src/calibre/ebooks/metadata/epub.py @@ -182,7 +182,7 @@ def get_metadata(stream, extract_cover=True): def get_quick_metadata(stream): return get_metadata(stream, False) -def set_metadata(stream, mi, apply_null=False): +def set_metadata(stream, mi, apply_null=False, update_timestamp=False): stream.seek(0) reader = OCFZipReader(stream, root=os.getcwdu()) mi = MetaInformation(mi) @@ -196,6 +196,8 @@ def set_metadata(stream, mi, apply_null=False): reader.opf.tags = [] if not getattr(mi, 'isbn', None): reader.opf.isbn = None + if update_timestamp and mi.timestamp is not None: + reader.opf.timestamp = mi.timestamp newopf = StringIO(reader.opf.render()) safe_replace(stream, reader.container[OPF.MIMETYPE], newopf) diff --git a/src/calibre/ebooks/metadata/fetch.py b/src/calibre/ebooks/metadata/fetch.py index a7fd76c661..d12c668e0d 100644 --- a/src/calibre/ebooks/metadata/fetch.py +++ b/src/calibre/ebooks/metadata/fetch.py @@ -198,6 +198,38 @@ class Amazon(MetadataSource): self.exception = e self.tb = traceback.format_exc() +class LibraryThing(MetadataSource): + + name = 'LibraryThing' + metadata_type = 'social' + description = _('Downloads series 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() + 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 + except Exception, e: + self.exception = e + self.tb = traceback.format_exc() + + def result_index(source, result): if not result.isbn: return -1 @@ -266,7 +298,7 @@ def get_social_metadata(mi, verbose=0): with MetadataSources(fetchers) as manager: manager(mi.title, mi.authors, mi.publisher, mi.isbn, verbose) manager.join() - ratings, tags, comments = [], set([]), set([]) + ratings, tags, comments, series, series_index = [], set([]), set([]), None, None for fetcher in fetchers: if fetcher.results: dmi = fetcher.results @@ -279,6 +311,10 @@ def get_social_metadata(mi, verbose=0): mi.pubdate = dmi.pubdate if dmi.comments: comments.add(dmi.comments) + if dmi.series is not None: + series = dmi.series + if dmi.series_index is not None: + series_index = dmi.series_index if ratings: rating = sum(ratings)/float(len(ratings)) if mi.rating is None or mi.rating < 0.1: @@ -295,6 +331,9 @@ def get_social_metadata(mi, verbose=0): mi.comments = '' for x in comments: mi.comments += x+'\n\n' + if series and series_index is not None: + mi.series = series + mi.series_index = series_index return [(x.name, x.exception, x.tb) for x in fetchers if x.exception is not None] diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index 1f321568f5..46924cad1f 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -736,12 +736,14 @@ class OPF(object): def fget(self): ans = [] for tag in self.tags_path(self.metadata): - ans.append(self.get_text(tag)) + text = self.get_text(tag) + if text and text.strip(): + ans.extend([x.strip() for x in text.split(',')]) return ans def fset(self, val): for tag in list(self.tags_path(self.metadata)): - self.metadata.remove(tag) + tag.getparent().remove(tag) for tag in val: elem = self.create_metadata_element('subject') self.set_text(elem, unicode(tag)) diff --git a/src/calibre/ebooks/mobi/mobiml.py b/src/calibre/ebooks/mobi/mobiml.py index 9361d52d31..bfa8758c85 100644 --- a/src/calibre/ebooks/mobi/mobiml.py +++ b/src/calibre/ebooks/mobi/mobiml.py @@ -61,6 +61,7 @@ class FormatState(object): self.italic = False self.bold = False self.strikethrough = False + self.underline = False self.preserve = False self.family = 'serif' self.bgcolor = 'transparent' @@ -79,7 +80,8 @@ class FormatState(object): and self.family == other.family \ and self.bgcolor == other.bgcolor \ and self.fgcolor == other.fgcolor \ - and self.strikethrough == other.strikethrough + and self.strikethrough == other.strikethrough \ + and self.underline == other.underline def __ne__(self, other): return not self.__eq__(other) @@ -251,6 +253,8 @@ class MobiMLizer(object): color=unicode(istate.fgcolor)) if istate.strikethrough: inline = etree.SubElement(inline, XHTML('s')) + if istate.underline: + inline = etree.SubElement(inline, XHTML('u')) bstate.inline = inline bstate.istate = istate inline = bstate.inline @@ -330,6 +334,7 @@ class MobiMLizer(object): istate.bgcolor = style['background-color'] istate.fgcolor = style['color'] istate.strikethrough = style['text-decoration'] == 'line-through' + istate.underline = style['text-decoration'] == 'underline' if 'monospace' in style['font-family']: istate.family = 'monospace' elif 'sans-serif' in style['font-family']: diff --git a/src/calibre/ebooks/oeb/transforms/cover.py b/src/calibre/ebooks/oeb/transforms/cover.py index 4d41ab14b4..83c5ec93e4 100644 --- a/src/calibre/ebooks/oeb/transforms/cover.py +++ b/src/calibre/ebooks/oeb/transforms/cover.py @@ -103,8 +103,8 @@ class CoverManager(object): 32)] img_data = create_cover_page(lines, I('library.png')) id, href = self.oeb.manifest.generate('cover_image', - 'cover_image.png') - item = self.oeb.manifest.add(id, href, guess_type('t.png')[0], + 'cover_image.jpg') + item = self.oeb.manifest.add(id, href, guess_type('t.jpg')[0], data=img_data) m.clear('cover') m.add('cover', item.id) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 3063ef252d..1056f6ced6 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -43,8 +43,8 @@ def _config(): help=_('Notify when a new version is available')) c.add_opt('use_roman_numerals_for_series_number', default=True, help=_('Use Roman numerals for series number')) - c.add_opt('sort_by_popularity', default=False, - help=_('Sort tags list by popularity')) + c.add_opt('sort_tags_by', default='name', + help=_('Sort tags list by name, popularity, or rating')) c.add_opt('cover_flow_queue_length', default=6, help=_('Number of covers to show in the cover browsing mode')) c.add_opt('LRF_conversion_defaults', default=[], @@ -100,7 +100,9 @@ def _config(): c.add_opt('tag_browser_hidden_categories', default=set(), help=_('tag browser categories not to display')) c.add_opt('gui_layout', choices=['wide', 'narrow'], - help=_('The layout of the user interface'), default='narrow') + 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')) return ConfigProxy(c) config = _config() diff --git a/src/calibre/gui2/actions.py b/src/calibre/gui2/actions.py new file mode 100644 index 0000000000..f838e9c1fe --- /dev/null +++ b/src/calibre/gui2/actions.py @@ -0,0 +1,1277 @@ +#!/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 shutil, os, datetime, sys, time +from functools import partial + +from PyQt4.Qt import QInputDialog, pyqtSignal, QModelIndex, QThread, Qt, \ + SIGNAL, QPixmap, QTimer, QDesktopServices, QUrl, 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 +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.tools import convert_single_ebook, convert_bulk_ebook, \ + fetch_scheduled_recipe, generate_catalog +from calibre.constants import preferred_encoding, filesystem_encoding, \ + isosx, isfrozen, islinux +from calibre.gui2.dialogs.choose_format import ChooseFormatDialog +from calibre.ebooks import BOOK_EXTENSIONS +from calibre.gui2.dialogs.confirm_delete import confirm +from calibre.gui2.dialogs.delete_matching_from_device import DeleteMatchingFromDeviceDialog + +class AnnotationsAction(object): # {{{ + + def fetch_annotations(self, *args): + # Generate a path_map from selected ids + def get_ids_from_selected_rows(): + rows = self.library_view.selectionModel().selectedRows() + if not rows or len(rows) < 2: + rows = xrange(self.library_view.model().rowCount(QModelIndex())) + ids = map(self.library_view.model().id, rows) + return ids + + def get_formats(id): + formats = db.formats(id, index_is_id=True) + fmts = [] + if formats: + for format in formats.split(','): + fmts.append(format.lower()) + return fmts + + def generate_annotation_paths(ids, db, device): + # Generate path templates + # Individual storage mount points scanned/resolved in driver.get_annotations() + path_map = {} + for id in ids: + mi = db.get_metadata(id, index_is_id=True) + a_path = device.create_upload_path(os.path.abspath('/'), mi, 'x.bookmark', create_dirs=False) + path_map[id] = dict(path=a_path, fmts=get_formats(id)) + return path_map + + device = self.device_manager.device + + if self.current_view() is not self.library_view: + return error_dialog(self, _('Use library only'), + _('User annotations generated from main library only'), + show=True) + db = self.library_view.model().db + + # Get the list of ids + ids = get_ids_from_selected_rows() + if not ids: + return error_dialog(self, _('No books selected'), + _('No books selected to fetch annotations from'), + show=True) + + # Map ids to paths + path_map = generate_annotation_paths(ids, db, device) + + # Dispatch to devices.kindle.driver.get_annotations() + self.device_manager.annotations(Dispatcher(self.annotations_fetched), + path_map) + + def annotations_fetched(self, job): + from calibre.devices.usbms.device import Device + from calibre.ebooks.metadata import MetaInformation + from calibre.gui2.dialogs.progress import ProgressDialog + from calibre.library.cli import do_add_format + + class Updater(QThread): + + update_progress = pyqtSignal(int) + update_done = pyqtSignal() + FINISHED_READING_PCT_THRESHOLD = 96 + + def __init__(self, parent, db, annotation_map, done_callback): + QThread.__init__(self, parent) + self.db = db + self.pd = ProgressDialog(_('Merging user annotations into database'), '', + 0, len(job.result), parent=parent) + + self.am = annotation_map + self.done_callback = done_callback + self.connect(self.pd, SIGNAL('canceled()'), self.canceled) + self.pd.setModal(True) + self.pd.show() + self.update_progress.connect(self.pd.set_value, + type=Qt.QueuedConnection) + self.update_done.connect(self.pd.hide, type=Qt.QueuedConnection) + + def generate_annotation_html(self, bookmark): + # Returns
...
+ last_read_location = bookmark.last_read_location + timestamp = datetime.datetime.utcfromtimestamp(bookmark.timestamp) + percent_read = bookmark.percent_read + + ka_soup = BeautifulSoup() + dtc = 0 + divTag = Tag(ka_soup,'div') + divTag['class'] = 'user_annotations' + + # Add the last-read location + spanTag = Tag(ka_soup, 'span') + spanTag['style'] = 'font-weight:bold' + if bookmark.book_format == 'pdf': + spanTag.insert(0,NavigableString( + _("%s
Last Page Read: %d (%d%%)") % \ + (strftime(u'%x', timestamp.timetuple()), + last_read_location, + percent_read))) + else: + spanTag.insert(0,NavigableString( + _("%s
Last Page Read: Location %d (%d%%)") % \ + (strftime(u'%x', timestamp.timetuple()), + last_read_location, + percent_read))) + + divTag.insert(dtc, spanTag) + dtc += 1 + divTag.insert(dtc, Tag(ka_soup,'br')) + dtc += 1 + + if bookmark.user_notes: + user_notes = bookmark.user_notes + annotations = [] + + # Add the annotations sorted by location + # Italicize highlighted text + for location in sorted(user_notes): + if user_notes[location]['text']: + annotations.append( + _('Location %d • %s
%s
') % \ + (user_notes[location]['displayed_location'], + user_notes[location]['type'], + user_notes[location]['text'] if \ + user_notes[location]['type'] == 'Note' else \ + '%s' % user_notes[location]['text'])) + else: + if bookmark.book_format == 'pdf': + annotations.append( + _('Page %d • %s
') % \ + (user_notes[location]['displayed_location'], + user_notes[location]['type'])) + else: + annotations.append( + _('Location %d • %s
') % \ + (user_notes[location]['displayed_location'], + user_notes[location]['type'])) + + for annotation in annotations: + divTag.insert(dtc, annotation) + dtc += 1 + + ka_soup.insert(0,divTag) + return ka_soup + + 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) + + def canceled(self): + self.pd.hide() + + def run(self): + ignore_tags = set(['Catalog','Clippings']) + for (i, id) in enumerate(self.am): + bm = Device.UserAnnotation(self.am[id][0],self.am[id][1]) + if bm.type == 'kindle_bookmark': + mi = self.db.get_metadata(id, index_is_id=True) + user_notes_soup = self.generate_annotation_html(bm.value) + if mi.comments: + a_offset = mi.comments.find('
') + ad_offset = mi.comments.find('
') + + if a_offset >= 0: + mi.comments = mi.comments[:a_offset] + if ad_offset >= 0: + mi.comments = mi.comments[:ad_offset] + if set(mi.tags).intersection(ignore_tags): + continue + if mi.comments: + hrTag = Tag(user_notes_soup,'hr') + hrTag['class'] = 'annotations_divider' + user_notes_soup.insert(0,hrTag) + + mi.comments += user_notes_soup.prettify() + else: + mi.comments = unicode(user_notes_soup.prettify()) + # Update library comments + self.db.set_comment(id, mi.comments) + + # Update 'read' tag except for Catalogs/Clippings + if bm.value.percent_read >= self.FINISHED_READING_PCT_THRESHOLD: + if not set(mi.tags).intersection(ignore_tags): + self.mark_book_as_read(id) + + # Add bookmark file to id + self.db.add_format_with_hooks(id, bm.value.bookmark_extension, + bm.value.path, index_is_id=True) + self.update_progress.emit(i) + elif bm.type == 'kindle_clippings': + # Find 'My Clippings' author=Kindle in database, or add + last_update = 'Last modified %s' % strftime(u'%x %X',bm.value['timestamp'].timetuple()) + mc_id = list(db.data.parse('title:"My Clippings"')) + if mc_id: + do_add_format(self.db, mc_id[0], 'TXT', bm.value['path']) + mi = self.db.get_metadata(mc_id[0], index_is_id=True) + mi.comments = last_update + self.db.set_metadata(mc_id[0], mi) + else: + mi = MetaInformation('My Clippings', authors = ['Kindle']) + mi.tags = ['Clippings'] + mi.comments = last_update + self.db.add_books([bm.value['path']], ['txt'], [mi]) + + self.update_done.emit() + self.done_callback(self.am.keys()) + + if not job.result: return + + if self.current_view() is not self.library_view: + return error_dialog(self, _('Use library only'), + _('User annotations generated from main library only'), + show=True) + db = self.library_view.model().db + + self.__annotation_updater = Updater(self, db, job.result, + Dispatcher(self.library_view.model().refresh_ids)) + self.__annotation_updater.start() + + # }}} + +class AddAction(object): # {{{ + + def __init__(self): + self._add_filesystem_book = Dispatcher(self.__add_filesystem_book) + + def add_recursive(self, single): + root = choose_dir(self, 'recursive book import root dir dialog', + 'Select root folder') + if not root: + return + from calibre.gui2.add import Adder + self._adder = Adder(self, + self.library_view.model().db, + Dispatcher(self._files_added), spare_server=self.spare_server) + self._adder.add_recursive(root, single) + + def add_recursive_single(self, *args): + ''' + Add books from the local filesystem to either the library or the device + recursively assuming one book per folder. + ''' + self.add_recursive(True) + + def add_recursive_multiple(self, *args): + ''' + Add books from the local filesystem to either the library or the device + recursively assuming multiple books per folder. + ''' + self.add_recursive(False) + + def add_empty(self, *args): + ''' + Add an empty book item to the library. This does not import any formats + from a book file. + ''' + num, ok = QInputDialog.getInt(self, _('How many empty books?'), + _('How many empty books should be added?'), 1, 1, 100) + if ok: + from calibre.ebooks.metadata import MetaInformation + for x in xrange(num): + self.library_view.model().db.import_book(MetaInformation(None), []) + self.library_view.model().books_added(num) + + def files_dropped(self, paths): + to_device = self.stack.currentIndex() != 0 + self._add_books(paths, to_device) + + def files_dropped_on_book(self, event, paths): + accept = False + if self.current_view() is not self.library_view: + return + db = self.library_view.model().db + current_idx = self.library_view.currentIndex() + if not current_idx.isValid(): return + cid = db.id(current_idx.row()) + for path in paths: + ext = os.path.splitext(path)[1].lower() + if ext: + ext = ext[1:] + if ext in IMAGE_EXTENSIONS: + pmap = QPixmap() + pmap.load(path) + if not pmap.isNull(): + accept = True + db.set_cover(cid, pmap) + elif ext in BOOK_EXTENSIONS: + db.add_format_with_hooks(cid, ext, path, index_is_id=True) + 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): + if isinstance(paths, basestring): + paths = [paths] + books = [path for path in map(os.path.abspath, paths) if os.access(path, + os.R_OK)] + + if books: + to_device = allow_device and self.stack.currentIndex() != 0 + self._add_books(books, to_device) + if to_device: + self.status_bar.show_message(\ + _('Uploading books to device.'), 2000) + + + def add_filesystem_book(self, paths, allow_device=True): + self._add_filesystem_book(paths, allow_device=allow_device) + + def add_books(self, *args): + ''' + Add books from the local filesystem to either the library or the device. + ''' + filters = [ + (_('Books'), BOOK_EXTENSIONS), + (_('EPUB Books'), ['epub']), + (_('LRF Books'), ['lrf']), + (_('HTML Books'), ['htm', 'html', 'xhtm', 'xhtml']), + (_('LIT Books'), ['lit']), + (_('MOBI Books'), ['mobi', 'prc', 'azw']), + (_('Topaz books'), ['tpz','azw1']), + (_('Text books'), ['txt', 'rtf']), + (_('PDF Books'), ['pdf']), + (_('Comics'), ['cbz', 'cbr', 'cbc']), + (_('Archives'), ['zip', 'rar']), + ] + to_device = self.stack.currentIndex() != 0 + if to_device: + filters = [(_('Supported books'), self.device_manager.device.FORMATS)] + + books = choose_files(self, 'add books dialog dir', 'Select books', + filters=filters) + if not books: + return + self._add_books(books, to_device) + + def _add_books(self, paths, to_device, on_card=None): + if on_card is None: + on_card = 'carda' if self.stack.currentIndex() == 2 else 'cardb' if self.stack.currentIndex() == 3 else None + if not paths: + return + from calibre.gui2.add import Adder + self.__adder_func = partial(self._files_added, on_card=on_card) + self._adder = Adder(self, + None if to_device else self.library_view.model().db, + Dispatcher(self.__adder_func), spare_server=self.spare_server) + self._adder.add(paths) + + def _files_added(self, paths=[], names=[], infos=[], on_card=None): + if paths: + self.upload_books(paths, + list(map(ascii_filename, names)), + infos, on_card=on_card) + self.status_bar.show_message( + _('Uploading books to device.'), 2000) + if getattr(self._adder, 'number_of_books_added', 0) > 0: + self.library_view.model().books_added(self._adder.number_of_books_added) + if hasattr(self, 'db_images'): + self.db_images.reset() + if getattr(self._adder, 'merged_books', False): + books = u'\n'.join([x if isinstance(x, unicode) else + x.decode(preferred_encoding, 'replace') for x in + self._adder.merged_books]) + info_dialog(self, _('Merged some books'), + _('Some duplicates were found and merged into the ' + 'following existing books:'), det_msg=books, show=True) + if getattr(self._adder, 'critical', None): + det_msg = [] + for name, log in self._adder.critical.items(): + if isinstance(name, str): + name = name.decode(filesystem_encoding, 'replace') + det_msg.append(name+'\n'+log) + + warning_dialog(self, _('Failed to read metadata'), + _('Failed to read metadata from the following')+':', + det_msg='\n\n'.join(det_msg), show=True) + + 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): # {{{ + + def _get_selected_formats(self, msg): + from calibre.gui2.dialogs.select_formats import SelectFormats + fmts = self.library_view.model().db.all_formats() + d = SelectFormats([x.lower() for x in fmts], msg, parent=self) + if d.exec_() != d.Accepted: + return None + return d.selected_formats + + def _get_selected_ids(self, err_title=_('Cannot delete')): + rows = self.library_view.selectionModel().selectedRows() + if not rows or len(rows) == 0: + d = error_dialog(self, err_title, _('No book selected')) + d.exec_() + return set([]) + return set(map(self.library_view.model().id, rows)) + + def delete_selected_formats(self, *args): + ids = self._get_selected_ids() + if not ids: + return + fmts = self._get_selected_formats( + _('Choose formats to be deleted')) + if not fmts: + return + for id in ids: + for fmt in fmts: + self.library_view.model().db.remove_format(id, fmt, + index_is_id=True, notify=False) + self.library_view.model().refresh_ids(ids) + self.library_view.model().current_changed(self.library_view.currentIndex(), + self.library_view.currentIndex()) + if ids: + self.tags_view.recount() + + def delete_all_but_selected_formats(self, *args): + ids = self._get_selected_ids() + if not ids: + return + fmts = self._get_selected_formats( + '

'+_('Choose formats not to be deleted')) + if fmts is None: + return + for id in ids: + bfmts = self.library_view.model().db.formats(id, index_is_id=True) + if bfmts is None: + continue + bfmts = set([x.lower() for x in bfmts.split(',')]) + rfmts = bfmts - set(fmts) + for fmt in rfmts: + self.library_view.model().db.remove_format(id, fmt, + index_is_id=True, notify=False) + self.library_view.model().refresh_ids(ids) + self.library_view.model().current_changed(self.library_view.currentIndex(), + self.library_view.currentIndex()) + if ids: + self.tags_view.recount() + + def remove_matching_books_from_device(self, *args): + if not self.device_manager.is_device_connected: + d = error_dialog(self, _('Cannot delete books'), + _('No device is connected')) + d.exec_() + return + ids = self._get_selected_ids() + if not ids: + #_get_selected_ids shows a dialog box if nothing is selected, so we + #do not need to show one here + return + to_delete = {} + some_to_delete = False + for model,name in ((self.memory_view.model(), _('Main memory')), + (self.card_a_view.model(), _('Storage Card A')), + (self.card_b_view.model(), _('Storage Card B'))): + to_delete[name] = (model, model.paths_for_db_ids(ids)) + if len(to_delete[name][1]) > 0: + some_to_delete = True + if not some_to_delete: + d = error_dialog(self, _('No books to delete'), + _('None of the selected books are on the device')) + d.exec_() + return + d = DeleteMatchingFromDeviceDialog(self, to_delete) + if d.exec_(): + paths = {} + ids = {} + for (model, id, path) in d.result: + if model not in paths: + paths[model] = [] + ids[model] = [] + paths[model].append(path) + ids[model].append(id) + for model in paths: + job = self.remove_paths(paths[model]) + self.delete_memory[job] = (paths[model], model) + model.mark_for_deletion(job, ids[model], rows_are_ids=True) + self.status_bar.show_message(_('Deleting books from device.'), 1000) + + def delete_covers(self, *args): + ids = self._get_selected_ids() + if not ids: + return + for id in ids: + self.library_view.model().db.remove_cover(id) + self.library_view.model().refresh_ids(ids) + self.library_view.model().current_changed(self.library_view.currentIndex(), + self.library_view.currentIndex()) + + def delete_books(self, *args): + ''' + Delete selected books from device or library. + ''' + view = self.current_view() + rows = view.selectionModel().selectedRows() + if not rows or len(rows) == 0: + return + if self.stack.currentIndex() == 0: + if not confirm('

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

', 'library_delete_books', self): + return + ci = view.currentIndex() + row = None + if ci.isValid(): + row = ci.row() + ids_deleted = view.model().delete_books(rows) + for v in (self.memory_view, self.card_a_view, self.card_b_view): + if v is None: + continue + v.model().clear_ondevice(ids_deleted) + if row is not None: + ci = view.model().index(row, 0) + if ci.isValid(): + view.setCurrentIndex(ci) + sm = view.selectionModel() + sm.select(ci, sm.Select) + else: + if not confirm('

'+_('The selected books will be ' + 'permanently deleted ' + 'from your device. Are you sure?') + +'

', 'device_delete_books', self): + return + if self.stack.currentIndex() == 1: + view = self.memory_view + elif self.stack.currentIndex() == 2: + view = self.card_a_view + else: + view = self.card_b_view + paths = view.model().paths(rows) + job = self.remove_paths(paths) + self.delete_memory[job] = (paths, view.model()) + view.model().mark_for_deletion(job, rows) + self.status_bar.show_message(_('Deleting books from device.'), 1000) + + # }}} + +class EditMetadataAction(object): # {{{ + + def download_metadata(self, checked, covers=True, set_metadata=True, + set_social_metadata=None): + rows = self.library_view.selectionModel().selectedRows() + if not rows or len(rows) == 0: + d = error_dialog(self, _('Cannot download metadata'), + _('No books selected')) + d.exec_() + return + db = self.library_view.model().db + ids = [db.id(row.row()) for row in rows] + if set_social_metadata is None: + get_social_metadata = config['get_social_metadata'] + else: + get_social_metadata = set_social_metadata + from calibre.gui2.metadata import DownloadMetadata + self._download_book_metadata = DownloadMetadata(db, ids, + get_covers=covers, set_metadata=set_metadata, + get_social_metadata=get_social_metadata) + self._download_book_metadata.start() + if set_social_metadata is not None and set_social_metadata: + x = _('social metadata') + else: + x = _('covers') if covers and not set_metadata else _('metadata') + self.progress_indicator.start( + _('Downloading %s for %d book(s)')%(x, len(ids))) + self._book_metadata_download_check = QTimer(self) + self.connect(self._book_metadata_download_check, + SIGNAL('timeout()'), self.book_metadata_download_check, + Qt.QueuedConnection) + self._book_metadata_download_check.start(100) + + def book_metadata_download_check(self): + if self._download_book_metadata.is_alive(): + return + self._book_metadata_download_check.stop() + self.progress_indicator.stop() + cr = self.library_view.currentIndex().row() + x = self._download_book_metadata + self._download_book_metadata = None + if x.exception is None: + self.library_view.model().refresh_ids( + x.updated, cr) + if x.failures: + details = ['%s: %s'%(title, reason) for title, + reason in x.failures.values()] + details = '%s\n'%('\n'.join(details)) + warning_dialog(self, _('Failed to download some metadata'), + _('Failed to download metadata for the following:'), + det_msg=details).exec_() + else: + err = _('Failed to download metadata:') + error_dialog(self, _('Error'), err, det_msg=x.tb).exec_() + + + def edit_metadata(self, checked, bulk=None): + ''' + Edit metadata of selected books in library. + ''' + rows = self.library_view.selectionModel().selectedRows() + previous = self.library_view.currentIndex() + if not rows or len(rows) == 0: + d = error_dialog(self, _('Cannot edit metadata'), + _('No books selected')) + d.exec_() + return + + if bulk or (bulk is None and len(rows) > 1): + return self.edit_bulk_metadata(checked) + + def accepted(id): + self.library_view.model().refresh_ids([id]) + + for row in rows: + self._metadata_view_id = self.library_view.model().db.id(row.row()) + d = MetadataSingleDialog(self, row.row(), + self.library_view.model().db, + accepted_callback=accepted, + cancel_all=rows.index(row) < len(rows)-1) + self.connect(d, SIGNAL('view_format(PyQt_PyObject)'), + self.metadata_view_format) + d.exec_() + if d.cancel_all: + break + 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) + self.tags_view.recount() + + def edit_bulk_metadata(self, checked): + ''' + Edit metadata of selected books in library in bulk. + ''' + rows = [r.row() for r in \ + self.library_view.selectionModel().selectedRows()] + if not rows or len(rows) == 0: + d = error_dialog(self, _('Cannot edit metadata'), + _('No books selected')) + d.exec_() + return + if MetadataBulkDialog(self, rows, + self.library_view.model().db).changed: + self.library_view.model().resort(reset=False) + self.library_view.model().research() + self.tags_view.recount() + + # Merge books {{{ + def merge_books(self, safe_merge=False): + ''' + Merge selected books in library. + ''' + if self.stack.currentIndex() != 0: + return + rows = self.library_view.selectionModel().selectedRows() + if not rows or len(rows) == 0: + return error_dialog(self, _('Cannot merge books'), + _('No books selected'), show=True) + if len(rows) < 2: + return error_dialog(self, _('Cannot merge books'), + _('At least two books must be selected for merging'), + show=True) + dest_id, src_books, src_ids = self.books_to_merge(rows) + if safe_merge: + if not confirm('

'+_( + '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.') + +'

', 'merge_books_safe', self): + return + self.add_formats(dest_id, src_books) + self.merge_metadata(dest_id, src_ids) + else: + if not confirm('

'+_( + '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?') + +'

', 'merge_books', self): + return + if len(rows)>5: + if not confirm('

'+_('You are about to merge more than 5 books. ' + 'Are you sure you want to proceed?') + +'

', 'merge_too_many_books', self): + return + self.add_formats(dest_id, src_books) + self.merge_metadata(dest_id, src_ids) + self.delete_books_after_merge(src_ids) + # leave the selection highlight on first selected book + dest_row = rows[0].row() + for row in rows: + if row.row() < rows[0].row(): + dest_row -= 1 + ci = self.library_view.model().index(dest_row, 0) + if ci.isValid(): + self.library_view.setCurrentIndex(ci) + + def add_formats(self, dest_id, src_books, replace=False): + for src_book in src_books: + if src_book: + fmt = os.path.splitext(src_book)[-1].replace('.', '').upper() + with open(src_book, 'rb') as f: + self.library_view.model().db.add_format(dest_id, fmt, f, index_is_id=True, + notify=False, replace=replace) + + def books_to_merge(self, rows): + src_books = [] + src_ids = [] + m = self.library_view.model() + for i, row in enumerate(rows): + id_ = m.id(row) + if i == 0: + dest_id = id_ + else: + src_ids.append(id_) + dbfmts = m.db.formats(id_, index_is_id=True) + if dbfmts: + for fmt in dbfmts.split(','): + src_books.append(m.db.format_abspath(id_, fmt, + index_is_id=True)) + return [dest_id, src_books, src_ids] + + def delete_books_after_merge(self, ids_to_delete): + self.library_view.model().delete_books_by_id(ids_to_delete) + + def merge_metadata(self, dest_id, src_ids): + db = self.library_view.model().db + dest_mi = db.get_metadata(dest_id, index_is_id=True, get_cover=True) + orig_dest_comments = dest_mi.comments + for src_id in src_ids: + src_mi = db.get_metadata(src_id, index_is_id=True, get_cover=True) + if src_mi.comments and orig_dest_comments != src_mi.comments: + if not dest_mi.comments or len(dest_mi.comments) == 0: + dest_mi.comments = src_mi.comments + else: + dest_mi.comments = unicode(dest_mi.comments) + u'\n\n' + unicode(src_mi.comments) + if src_mi.title and src_mi.title and (not dest_mi.title or + dest_mi.title == _('Unknown')): + dest_mi.title = src_mi.title + if src_mi.title and (not dest_mi.authors or dest_mi.authors[0] == + _('Unknown')): + dest_mi.authors = src_mi.authors + dest_mi.author_sort = src_mi.author_sort + if src_mi.tags: + if not dest_mi.tags: + dest_mi.tags = src_mi.tags + else: + for tag in src_mi.tags: + dest_mi.tags.append(tag) + if src_mi.cover and not dest_mi.cover: + dest_mi.cover = src_mi.cover + if not dest_mi.publisher: + dest_mi.publisher = src_mi.publisher + if not dest_mi.rating: + dest_mi.rating = src_mi.rating + if not dest_mi.series: + dest_mi.series = src_mi.series + dest_mi.series_index = src_mi.series_index + db.set_metadata(dest_id, dest_mi, ignore_errors=False) + # }}} + + # }}} + +class SaveToDiskAction(object): # {{{ + + def save_single_format_to_disk(self, checked): + self.save_to_disk(checked, False, prefs['output_format']) + + def save_specific_format_disk(self, fmt): + self.save_to_disk(False, False, fmt) + + def save_to_single_dir(self, checked): + self.save_to_disk(checked, True) + + def save_single_fmt_to_single_dir(self, *args): + self.save_to_disk(False, single_dir=True, + single_format=prefs['output_format']) + + def save_to_disk(self, checked, single_dir=False, single_format=None): + rows = self.current_view().selectionModel().selectedRows() + if not rows or len(rows) == 0: + return error_dialog(self, _('Cannot save to disk'), + _('No books selected'), show=True) + path = choose_dir(self, 'save to disk dialog', + _('Choose destination directory')) + if not path: + return + + if self.current_view() is self.library_view: + from calibre.gui2.add import Saver + from calibre.library.save_to_disk import config + opts = config().parse() + if single_format is not None: + opts.formats = single_format + # Special case for Kindle annotation files + if single_format.lower() in ['mbp','pdr','tan']: + opts.to_lowercase = False + opts.save_cover = False + opts.write_opf = False + opts.template = opts.send_template + if single_dir: + opts.template = opts.template.split('/')[-1].strip() + if not opts.template: + opts.template = '{title} - {authors}' + self._saver = Saver(self, self.library_view.model().db, + Dispatcher(self._books_saved), rows, path, opts, + spare_server=self.spare_server) + + else: + paths = self.current_view().model().paths(rows) + self.device_manager.save_books( + Dispatcher(self.books_saved), paths, path) + + + def _books_saved(self, path, failures, error): + self._saver = None + if error: + return error_dialog(self, _('Error while saving'), + _('There was an error while saving.'), + error, show=True) + if failures: + failures = [u'%s\n\t%s'% + (title, '\n\t'.join(err.splitlines())) for title, err in + failures] + + warning_dialog(self, _('Could not save some books'), + _('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)) + + def books_saved(self, job): + if job.failed: + return self.device_job_exception(job) + + # }}} + +class GenerateCatalogAction(object): # {{{ + + def generate_catalog(self): + rows = self.library_view.selectionModel().selectedRows() + if not rows or len(rows) < 2: + rows = xrange(self.library_view.model().rowCount(QModelIndex())) + ids = map(self.library_view.model().id, rows) + + dbspec = None + if not ids: + return error_dialog(self, _('No books selected'), + _('No books selected to generate catalog for'), + show=True) + + # Calling gui2.tools:generate_catalog() + ret = generate_catalog(self, dbspec, ids, self.device_manager.device) + if ret is None: + return + + func, args, desc, out, sync, title = ret + + fmt = os.path.splitext(out)[1][1:].upper() + job = self.job_manager.run_job( + Dispatcher(self.catalog_generated), func, args=args, + description=desc) + job.catalog_file_path = out + job.fmt = fmt + job.catalog_sync, job.catalog_title = sync, title + self.status_bar.show_message(_('Generating %s catalog...')%fmt) + + def catalog_generated(self, job): + if job.result: + # Search terms nulled catalog results + return error_dialog(self, _('No books found'), + _("No books to catalog\nCheck exclude tags"), + show=True) + if job.failed: + return self.job_exception(job) + id = self.library_view.model().add_catalog(job.catalog_file_path, job.catalog_title) + self.library_view.model().reset() + if job.catalog_sync: + sync = dynamic.get('catalogs_to_be_synced', set([])) + sync.add(id) + dynamic.set('catalogs_to_be_synced', sync) + self.status_bar.show_message(_('Catalog generated.'), 3000) + self.sync_catalogs() + if job.fmt not in ['EPUB','MOBI']: + export_dir = choose_dir(self, _('Export Catalog Directory'), + _('Select destination for %s.%s') % (job.catalog_title, job.fmt.lower())) + if export_dir: + destination = os.path.join(export_dir, '%s.%s' % (job.catalog_title, job.fmt.lower())) + shutil.copyfile(job.catalog_file_path, destination) + + # }}} + +class FetchNewsAction(object): # {{{ + + def download_scheduled_recipe(self, arg): + func, args, desc, fmt, temp_files = \ + fetch_scheduled_recipe(arg) + job = self.job_manager.run_job( + Dispatcher(self.scheduled_recipe_fetched), func, args=args, + description=desc) + self.conversion_jobs[job] = (temp_files, fmt, arg) + self.status_bar.show_message(_('Fetching news from ')+arg['title'], 2000) + + def scheduled_recipe_fetched(self, job): + temp_files, fmt, arg = self.conversion_jobs.pop(job) + pt = temp_files[0] + if job.failed: + self.scheduler.recipe_download_failed(arg) + return self.job_exception(job) + id = self.library_view.model().add_news(pt.name, arg) + self.library_view.model().reset() + sync = dynamic.get('news_to_be_synced', set([])) + sync.add(id) + dynamic.set('news_to_be_synced', sync) + self.scheduler.recipe_downloaded(arg) + self.status_bar.show_message(arg['title'] + _(' fetched.'), 3000) + self.email_news(id) + self.sync_news() + + # }}} + +class ConvertAction(object): # {{{ + + def auto_convert(self, book_ids, on_card, format): + previous = self.library_view.currentIndex() + rows = [x.row() for x in \ + self.library_view.selectionModel().selectedRows()] + jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format) + if jobs == []: return + self.queue_convert_jobs(jobs, changed, bad, rows, previous, + self.book_auto_converted, extra_job_args=[on_card]) + + def auto_convert_mail(self, to, fmts, delete_from_library, book_ids, format): + previous = self.library_view.currentIndex() + rows = [x.row() for x in \ + self.library_view.selectionModel().selectedRows()] + jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format) + if jobs == []: return + self.queue_convert_jobs(jobs, changed, bad, rows, previous, + self.book_auto_converted_mail, + extra_job_args=[delete_from_library, to, fmts]) + + def auto_convert_news(self, book_ids, format): + previous = self.library_view.currentIndex() + rows = [x.row() for x in \ + self.library_view.selectionModel().selectedRows()] + jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format) + if jobs == []: return + self.queue_convert_jobs(jobs, changed, bad, rows, previous, + self.book_auto_converted_news) + + def auto_convert_catalogs(self, book_ids, format): + previous = self.library_view.currentIndex() + rows = [x.row() for x in \ + self.library_view.selectionModel().selectedRows()] + jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format) + if jobs == []: return + self.queue_convert_jobs(jobs, changed, bad, rows, previous, + self.book_auto_converted_catalogs) + + def get_books_for_conversion(self): + rows = [r.row() for r in \ + self.library_view.selectionModel().selectedRows()] + if not rows or len(rows) == 0: + d = error_dialog(self, _('Cannot convert'), + _('No books selected')) + d.exec_() + return None + return [self.library_view.model().db.id(r) for r in rows] + + def convert_ebook(self, checked, bulk=None): + book_ids = self.get_books_for_conversion() + if book_ids is None: return + previous = self.library_view.currentIndex() + rows = [x.row() for x in \ + self.library_view.selectionModel().selectedRows()] + num = 0 + if bulk or (bulk is None and len(book_ids) > 1): + self.__bulk_queue = convert_bulk_ebook(self, self.queue_convert_jobs, + self.library_view.model().db, book_ids, + out_format=prefs['output_format'], args=(rows, previous, + self.book_converted)) + if self.__bulk_queue is None: + return + num = len(self.__bulk_queue.book_ids) + else: + jobs, changed, bad = convert_single_ebook(self, + self.library_view.model().db, book_ids, out_format=prefs['output_format']) + self.queue_convert_jobs(jobs, changed, bad, rows, previous, + self.book_converted) + num = len(jobs) + + if num > 0: + self.status_bar.show_message(_('Starting conversion of %d book(s)') % + num, 2000) + + def queue_convert_jobs(self, jobs, changed, bad, rows, previous, + converted_func, extra_job_args=[]): + for func, args, desc, fmt, id, temp_files in jobs: + if id not in bad: + job = self.job_manager.run_job(Dispatcher(converted_func), + func, args=args, description=desc) + args = [temp_files, fmt, id]+extra_job_args + self.conversion_jobs[job] = tuple(args) + + if changed: + self.library_view.model().refresh_rows(rows) + current = self.library_view.currentIndex() + self.library_view.model().current_changed(current, previous) + + def book_auto_converted(self, job): + temp_files, fmt, book_id, on_card = self.conversion_jobs[job] + self.book_converted(job) + self.sync_to_device(on_card, False, specific_format=fmt, send_ids=[book_id], do_auto_convert=False) + + def book_auto_converted_mail(self, job): + temp_files, fmt, book_id, delete_from_library, to, fmts = self.conversion_jobs[job] + self.book_converted(job) + self.send_by_mail(to, fmts, delete_from_library, specific_format=fmt, send_ids=[book_id], do_auto_convert=False) + + def book_auto_converted_news(self, job): + temp_files, fmt, book_id = self.conversion_jobs[job] + self.book_converted(job) + self.sync_news(send_ids=[book_id], do_auto_convert=False) + + def book_auto_converted_catalogs(self, job): + temp_files, fmt, book_id = self.conversion_jobs[job] + self.book_converted(job) + self.sync_catalogs(send_ids=[book_id], do_auto_convert=False) + + def book_converted(self, job): + temp_files, fmt, book_id = self.conversion_jobs.pop(job)[:3] + try: + if job.failed: + self.job_exception(job) + return + data = open(temp_files[-1].name, 'rb') + self.library_view.model().db.add_format(book_id, \ + fmt, data, index_is_id=True) + data.close() + self.status_bar.show_message(job.description + \ + (' completed'), 2000) + finally: + for f in temp_files: + try: + if os.path.exists(f.name): + os.remove(f.name) + except: + pass + self.tags_view.recount() + if self.current_view() is self.library_view: + current = self.library_view.currentIndex() + self.library_view.model().current_changed(current, QModelIndex()) + + # }}} + +class ViewAction(object): # {{{ + + def view_format(self, row, format): + fmt_path = self.library_view.model().db.format_abspath(row, format) + if fmt_path: + self._view_file(fmt_path) + + def view_format_by_id(self, id_, format): + fmt_path = self.library_view.model().db.format_abspath(id_, format, + index_is_id=True) + if fmt_path: + self._view_file(fmt_path) + + def metadata_view_format(self, fmt): + fmt_path = self.library_view.model().db.\ + format_abspath(self._metadata_view_id, + fmt, index_is_id=True) + if fmt_path: + self._view_file(fmt_path) + + + def book_downloaded_for_viewing(self, job): + if job.failed: + self.device_job_exception(job) + return + self._view_file(job.result) + + def _launch_viewer(self, name=None, viewer='ebook-viewer', internal=True): + self.setCursor(Qt.BusyCursor) + try: + if internal: + args = [viewer] + if isosx and 'ebook' in viewer: + args.append('--raise-window') + if name is not None: + args.append(name) + 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) + time.sleep(2) # User feedback + finally: + self.unsetCursor() + + def _view_file(self, name): + ext = os.path.splitext(name)[1].upper().replace('.', '') + viewer = 'lrfviewer' if ext == 'LRF' else 'ebook-viewer' + internal = ext in config['internally_viewed_formats'] + self._launch_viewer(name, viewer, internal) + + def view_specific_format(self, triggered): + rows = self.library_view.selectionModel().selectedRows() + if not rows or len(rows) == 0: + d = error_dialog(self, _('Cannot view'), _('No book selected')) + d.exec_() + return + + row = rows[0].row() + formats = self.library_view.model().db.formats(row).upper().split(',') + d = ChooseFormatDialog(self, _('Choose the format to view'), formats) + if d.exec_() == QDialog.Accepted: + format = d.format() + self.view_format(row, format) + + def _view_check(self, num, max_=3): + if num <= max_: + return True + return question_dialog(self, _('Multiple Books Selected'), + _('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?' + ) % num) + + def view_folder(self, *args): + rows = self.current_view().selectionModel().selectedRows() + if not rows or len(rows) == 0: + d = error_dialog(self, _('Cannot open folder'), + _('No book selected')) + d.exec_() + return + if not self._view_check(len(rows)): + return + for row in rows: + path = self.library_view.model().db.abspath(row.row()) + QDesktopServices.openUrl(QUrl.fromLocalFile(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)) + + def view_book(self, triggered): + rows = self.current_view().selectionModel().selectedRows() + self._view_books(rows) + + def view_specific_book(self, index): + self._view_books([index]) + + def _view_books(self, rows): + if not rows or len(rows) == 0: + self._launch_viewer() + return + + if not self._view_check(len(rows)): + return + + if self.current_view() is self.library_view: + for row in rows: + if hasattr(row, 'row'): + row = row.row() + + formats = self.library_view.model().db.formats(row) + title = self.library_view.model().db.title(row) + if not formats: + error_dialog(self, _('Cannot view'), + _('%s has no available formats.')%(title,), show=True) + continue + + formats = formats.upper().split(',') + + + in_prefs = False + for format in prefs['input_format_order']: + if format in formats: + in_prefs = True + self.view_format(row, format) + break + if not in_prefs: + self.view_format(row, formats[0]) + else: + paths = self.current_view().model().paths(rows) + for path in paths: + pt = PersistentTemporaryFile('_viewer_'+\ + os.path.splitext(path)[1]) + self.persistent_files.append(pt) + pt.close() + self.device_manager.view_book(\ + Dispatcher(self.book_downloaded_for_viewing), + path, pt.name) + + # }}} + diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py new file mode 100644 index 0000000000..f87f8886a5 --- /dev/null +++ b/src/calibre/gui2/book_details.py @@ -0,0 +1,315 @@ +#!/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, collections + +from PyQt4.Qt import QLabel, QPixmap, QSize, QWidget, Qt, pyqtSignal, \ + QVBoxLayout, QScrollArea, QPropertyAnimation, QEasingCurve, \ + QSizePolicy, QPainter, QRect, pyqtProperty, QDesktopServices, QUrl + +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 + +# render_rows(data) {{{ +WEIGHTS = collections.defaultdict(lambda : 100) +WEIGHTS[_('Path')] = 5 +WEIGHTS[_('Formats')] = 1 +WEIGHTS[_('Collections')] = 2 +WEIGHTS[_('Series')] = 3 +WEIGHTS[_('Tags')] = 4 + +def render_rows(data): + keys = data.keys() + keys.sort(cmp=lambda x, y: cmp(WEIGHTS[x], WEIGHTS[y])) + rows = [] + for key in keys: + txt = data[key] + if key in ('id', _('Comments')) or not hasattr(txt, 'strip') or not txt.strip() or \ + txt == 'None': + continue + if isinstance(key, str): + key = key.decode(preferred_encoding, 'replace') + if isinstance(txt, str): + txt = txt.decode(preferred_encoding, 'replace') + if '' not in txt: + txt = prepare_string_for_xml(txt) + if 'id' in data: + if key == _('Path'): + txt = u'%s'%(data['id'], + txt, _('Click to open')) + if key == _('Formats') and txt and txt != _('None'): + fmts = [x.strip() for x in txt.split(',')] + fmts = [u'%s' % (data['id'], x, x) for x + in fmts] + txt = ', '.join(fmts) + else: + if key == _('Path'): + txt = u'%s'%(txt, + _('Click to open')) + + rows.append((key, txt)) + return rows + +# }}} + +class CoverView(QWidget): # {{{ + + + def __init__(self, vertical, parent=None): + QWidget.__init__(self, parent) + self.setMaximumSize(QSize(120, 120)) + self.setMinimumSize(QSize(120 if vertical else 20, 120 if vertical else + 20)) + self._current_pixmap_size = self.maximumSize() + self.vertical = vertical + + self.animation = QPropertyAnimation(self, 'current_pixmap_size', self) + self.animation.setEasingCurve(QEasingCurve(QEasingCurve.OutExpo)) + self.animation.setDuration(1000) + self.animation.setStartValue(QSize(0, 0)) + self.animation.valueChanged.connect(self.value_changed) + + self.setSizePolicy(QSizePolicy.Expanding if vertical else + QSizePolicy.Minimum, QSizePolicy.Expanding) + + self.default_pixmap = QPixmap(I('book.svg')) + self.pixmap = self.default_pixmap + self.pwidth = self.pheight = None + self.data = {} + + self.do_layout() + + def value_changed(self, val): + self.update() + + def setCurrentPixmapSize(self, val): + 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() + 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) + + def relayout(self, parent_size): + if self.vertical: + self.setMaximumSize(parent_size.width(), + min(int(parent_size.height()/2.),int(4/3. * parent_size.width())+1)) + else: + self.setMaximumSize(1+int(3/4. * parent_size.height()), + parent_size.height()) + self.resize(self.maximumSize()) + self.animation.stop() + self.do_layout() + + def sizeHint(self): + return self.maximumSize() + + def show_data(self, data): + self.animation.stop() + same_item = data.get('id', True) == self.data.get('id', False) + self.data = {'id':data.get('id', None)} + if data.has_key('cover'): + self.pixmap = QPixmap.fromImage(data.pop('cover')) + 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: + self.animation.start() + + def paintEvent(self, event): + canvas_size = self.rect() + width = self.current_pixmap_size.width() + extrax = canvas_size.width() - width + if extrax < 0: extrax = 0 + x = int(extrax/2.) + height = self.current_pixmap_size.height() + extray = canvas_size.height() - height + if extray < 0: extray = 0 + y = int(extray/2.) + target = QRect(x, y, width, height) + p = QPainter(self) + p.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform) + p.drawPixmap(target, self.pixmap.scaled(target.size(), + Qt.KeepAspectRatio, Qt.SmoothTransformation)) + p.end() + + current_pixmap_size = pyqtProperty('QSize', + fget=lambda self: self._current_pixmap_size, + fset=setCurrentPixmapSize + ) + + + # }}} + +# Book Info {{{ +class Label(QLabel): + + mr = pyqtSignal(object) + link_clicked = pyqtSignal(object) + + def __init__(self): + QLabel.__init__(self) + self.setTextFormat(Qt.RichText) + self.setText('') + self.setWordWrap(True) + self.linkActivated.connect(self.link_activated) + self._link_clicked = False + self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + + def link_activated(self, link): + self._link_clicked = True + link = unicode(link) + self.link_clicked.emit(link) + + def mouseReleaseEvent(self, ev): + QLabel.mouseReleaseEvent(self, ev) + if not self._link_clicked: + self.mr.emit(ev) + self._link_clicked = False + +class BookInfo(QScrollArea): + + def __init__(self, vertical, parent=None): + QScrollArea.__init__(self, parent) + self.vertical = vertical + self.setWidgetResizable(True) + self.label = Label() + self.setWidget(self.label) + self.link_clicked = self.label.link_clicked + self.mr = self.label.mr + self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + + def show_data(self, data): + self.label.setText('') + rows = render_rows(data) + rows = u'\n'.join([u'%s:%s'%(k,t) for + k, t in rows]) + if self.vertical: + if _('Comments') in data and data[_('Comments')]: + comments = comments_to_html(data[_('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'
%s%s
' + % (left_pane, right_pane)) + + +# }}} + +class BookDetails(QWidget): # {{{ + + resized = pyqtSignal(object) + show_book_info = pyqtSignal() + open_containing_folder = pyqtSignal(int) + view_specific_format = pyqtSignal(int, object) + + # Drag 'n drop {{{ + DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS+BOOK_EXTENSIONS + files_dropped = pyqtSignal(object, object) + + @classmethod + def paths_from_event(cls, event): + ''' + Accept a drop event and return a list of paths that can be read from + and represent files with extensions. + ''' + if event.mimeData().hasFormat('text/uri-list'): + urls = [unicode(u.toLocalFile()) for u in event.mimeData().urls()] + urls = [u for u in urls if os.path.splitext(u)[1] and os.access(u, os.R_OK)] + return [u for u in urls if os.path.splitext(u)[1][1:].lower() in cls.DROPABBLE_EXTENSIONS] + + def dragEnterEvent(self, event): + if int(event.possibleActions() & Qt.CopyAction) + \ + int(event.possibleActions() & Qt.MoveAction) == 0: + return + paths = self.paths_from_event(event) + if paths: + event.acceptProposedAction() + + def dropEvent(self, event): + paths = self.paths_from_event(event) + event.setDropAction(Qt.CopyAction) + self.files_dropped.emit(event, paths) + + def dragMoveEvent(self, event): + event.acceptProposedAction() + + # }}} + + def __init__(self, vertical, parent=None): + QWidget.__init__(self, parent) + self.setAcceptDrops(True) + self._layout = QVBoxLayout() + if not vertical: + self._layout.setDirection(self._layout.LeftToRight) + self.setLayout(self._layout) + + self.cover_view = CoverView(vertical, self) + self.cover_view.relayout(self.size()) + self.resized.connect(self.cover_view.relayout, type=Qt.QueuedConnection) + self._layout.addWidget(self.cover_view) + self.book_info = BookInfo(vertical, self) + self._layout.addWidget(self.book_info) + self.book_info.link_clicked.connect(self._link_clicked) + self.book_info.mr.connect(self.mouseReleaseEvent) + if vertical: + self.setMinimumSize(QSize(190, 200)) + else: + self.setMinimumSize(120, 120) + self.setCursor(Qt.PointingHandCursor) + + def _link_clicked(self, link): + typ, _, val = link.partition(':') + if typ == 'path': + self.open_containing_folder.emit(int(val)) + elif typ == 'format': + id_, fmt = val.split(':') + self.view_specific_format.emit(int(id_), fmt) + elif typ == 'devpath': + QDesktopServices.openUrl(QUrl.fromLocalFile(val)) + + + def mouseReleaseEvent(self, ev): + ev.accept() + self.show_book_info.emit() + + def resizeEvent(self, ev): + self.resized.emit(self.size()) + + def show_data(self, data): + self.cover_view.show_data(data) + self.book_info.show_data(data) + self.setToolTip('

'+_('Click to open Book Details window') + + '

' + _('Path') + ': ' + data.get(_('Path'), '')) + + def reset_info(self): + self.show_data({}) + +# }}} + diff --git a/src/calibre/gui2/convert/metadata.py b/src/calibre/gui2/convert/metadata.py index 2026f1cee5..3ddd5674bb 100644 --- a/src/calibre/gui2/convert/metadata.py +++ b/src/calibre/gui2/convert/metadata.py @@ -13,7 +13,7 @@ from PyQt4.Qt import QPixmap, SIGNAL from calibre.gui2 import choose_images, error_dialog from calibre.gui2.convert.metadata_ui import Ui_Form from calibre.ebooks.metadata import authors_to_string, string_to_authors, \ - MetaInformation, authors_to_sort_string + MetaInformation from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.ptempfile import PersistentTemporaryFile from calibre.gui2.convert import Widget @@ -57,7 +57,7 @@ class MetadataWidget(Widget, Ui_Form): au = unicode(self.author.currentText()) au = re.sub(r'\s+et al\.$', '', au) authors = string_to_authors(au) - self.author_sort.setText(authors_to_sort_string(authors)) + self.author_sort.setText(self.db.author_sort_from_authors(authors)) def initialize_metadata_options(self): diff --git a/src/calibre/gui2/cover_flow.py b/src/calibre/gui2/cover_flow.py index f06d912a5d..c5ac474b0d 100644 --- a/src/calibre/gui2/cover_flow.py +++ b/src/calibre/gui2/cover_flow.py @@ -83,7 +83,6 @@ if pictureflow is not None: self.setFocusPolicy(Qt.WheelFocus) self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) - self.setZoomFactor(150) def sizeHint(self): return self.minimumSize() @@ -206,8 +205,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/device.py b/src/calibre/gui2/device.py index 9d7cf86dac..33191d1773 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -3,25 +3,27 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' # Imports {{{ -import os, traceback, Queue, time, socket, cStringIO, re +import os, traceback, Queue, time, socket, cStringIO, re, sys from threading import Thread, RLock from itertools import repeat from functools import partial from binascii import unhexlify from PyQt4.Qt import QMenu, QAction, QActionGroup, QIcon, SIGNAL, QPixmap, \ - Qt, pyqtSignal + Qt, pyqtSignal, QColor, QPainter +from PyQt4.QtSvg import QSvgRenderer from calibre.customize.ui import available_input_formats, available_output_formats, \ device_plugins from calibre.devices.interface import DevicePlugin +from calibre.devices.errors import UserFeedback from calibre.gui2.dialogs.choose_format import ChooseFormatDialog from calibre.utils.ipc.job import BaseJob from calibre.devices.scanner import DeviceScanner from calibre.gui2 import config, error_dialog, Dispatcher, dynamic, \ - pixmap_to_data, warning_dialog, \ - question_dialog -from calibre.ebooks.metadata import authors_to_string, authors_to_sort_string + pixmap_to_data, warning_dialog, \ + question_dialog, info_dialog, choose_dir +from calibre.ebooks.metadata import authors_to_string from calibre import preferred_encoding, prints from calibre.utils.filenames import ascii_filename from calibre.devices.errors import FreeSpaceError @@ -597,10 +599,209 @@ class Emailer(Thread): # {{{ # }}} -class DeviceMixin(object): +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) + self.device_connected = None + self.emailer = Emailer() + self.emailer.start() + self.device_manager = DeviceManager(Dispatcher(self.device_detected), + self.job_manager, Dispatcher(self.status_bar.show_message)) + self.device_manager.start() + + def set_default_thumbnail(self, height): + r = QSvgRenderer(I('book.svg')) + pixmap = QPixmap(height, height) + pixmap.fill(QColor(255,255,255)) + p = QPainter(pixmap) + r.render(p) + p.end() + self.default_thumbnail = (pixmap.width(), pixmap.height(), + pixmap_to_data(pixmap)) + + 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) + + def disconnect_from_folder(self): + self.device_manager.disconnect_folder() + + def _sync_action_triggered(self, *args): + m = getattr(self, '_sync_menu', None) + if m is not None: + m.trigger_default() + + def create_device_menu(self): + self._sync_menu = DeviceMenu(self) + self.action_sync.setMenu(self._sync_menu) + self.connect(self._sync_menu, + SIGNAL('sync(PyQt_PyObject, PyQt_PyObject, PyQt_PyObject)'), + 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) + 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) + else: + self._sync_menu.connect_to_folder_action.setEnabled(True) + self._sync_menu.disconnect_from_folder_action.setEnabled(False) + + + + def device_job_exception(self, job): + ''' + Handle exceptions in threaded device jobs. + ''' + if isinstance(getattr(job, 'exception', None), UserFeedback): + ex = job.exception + func = {UserFeedback.ERROR:error_dialog, + UserFeedback.WARNING:warning_dialog, + UserFeedback.INFO:info_dialog}[ex.level] + return func(self, _('Failed'), ex.msg, det_msg=ex.details if + ex.details else '', show=True) + + try: + if 'Could not read 32 bytes on the control bus.' in \ + unicode(job.details): + error_dialog(self, _('Error talking to device'), + _('There was a temporary error talking to the ' + 'device. Please unplug and reconnect the device ' + 'and or reboot.')).show() + return + except: + pass + try: + prints(job.details, file=sys.stderr) + except: + pass + if not self.device_error_dialog.isVisible(): + self.device_error_dialog.setDetailedText(job.details) + self.device_error_dialog.show() + + # Device connected {{{ + + def set_device_menu_items_state(self, connected, is_folder_device): + 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.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.enable_device_actions(False) + self.eject_action.setEnabled(False) + + def device_detected(self, connected, is_folder_device): + ''' + Called when a device is connected to the computer. + ''' + self.set_device_menu_items_state(connected, is_folder_device) + if connected: + self.device_manager.get_device_information(\ + Dispatcher(self.info_read)) + self.set_default_thumbnail(\ + self.device_manager.device.THUMBNAIL_HEIGHT) + 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.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.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)) + self.refresh_ondevice_info (device_connected = False) + + def info_read(self, job): + ''' + Called once device information has been read. + ''' + if job.failed: + 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.device_manager.books(Dispatcher(self.metadata_downloaded)) + + def metadata_downloaded(self, job): + ''' + Called once metadata has been read for all books on the device. + ''' + if job.failed: + self.device_job_exception(job) + return + self.set_books_in_library(job.result, reset=True) + mainlist, cardalist, cardblist = job.result + self.memory_view.set_database(mainlist) + self.memory_view.set_editable(self.device_manager.device.CAN_SET_METADATA) + self.card_a_view.set_database(cardalist) + self.card_a_view.set_editable(self.device_manager.device.CAN_SET_METADATA) + self.card_b_view.set_database(cardblist) + self.card_b_view.set_editable(self.device_manager.device.CAN_SET_METADATA) + self.sync_news() + self.sync_catalogs() + self.refresh_ondevice_info(device_connected = True) + + def refresh_ondevice_info(self, device_connected, reset_only = False): + ''' + Force the library view to refresh, taking into consideration + books information + ''' + self.book_on_device(None, reset=True) + if reset_only: + return + self.library_view.set_device_connected(device_connected) + + # }}} + + def remove_paths(self, paths): + return self.device_manager.delete_books( + Dispatcher(self.books_deleted), paths) + + def books_deleted(self, job): + ''' + Called once deletion is done on the device + ''' + for view in (self.memory_view, self.card_a_view, self.card_b_view): + view.model().deletion_done(job, job.failed) + if job.failed: + self.device_job_exception(job) + return + + if self.delete_memory.has_key(job): + paths, model = self.delete_memory.pop(job) + self.device_manager.remove_books_from_metadata(paths, + self.booklists()) + model.paths_deleted(paths) + self.upload_booklists() + # Clear the ondevice info so it will be recomputed + self.book_on_device(None, None, reset=True) + # We want to reset all the ondevice flags in the library. Use a big + # hammer, so we don't need to worry about whether some succeeded or not + self.library_view.model().refresh() + def dispatch_sync_event(self, dest, delete, specific): rows = self.library_view.selectionModel().selectedRows() @@ -1148,11 +1349,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 = set() - db = self.library_view.model().db + self.db_book_uuid_cache = {} for id in db.data.iterallids(): mi = db.get_metadata(id, index_is_id=True) title = re.sub('(?u)\W|[_]', '', mi.title.lower()) @@ -1168,7 +1376,7 @@ class DeviceMixin(object): aus = re.sub('(?u)\W|[_]', '', aus) self.db_book_title_cache[title]['author_sort'][aus] = mi self.db_book_title_cache[title]['db_ids'][mi.application_id] = mi - self.db_book_uuid_cache.add(mi.uuid) + self.db_book_uuid_cache[mi.uuid] = mi.application_id # Now iterate through all the books on the device, setting the # in_library field Fastest and most accurate key is the uuid. Second is @@ -1180,11 +1388,13 @@ class DeviceMixin(object): for book in booklist: if getattr(book, 'uuid', None) in self.db_book_uuid_cache: book.in_library = True + # ensure that the correct application_id is set + book.application_id = self.db_book_uuid_cache[book.uuid] continue book_title = book.title.lower() if book.title else '' book_title = re.sub('(?u)\W|[_]', '', book_title) - book.in_library = False + book.in_library = None d = self.db_book_title_cache.get(book_title, None) if d is not None: if getattr(book, 'application_id', None) in d['db_ids']: @@ -1213,10 +1423,13 @@ class DeviceMixin(object): # Set author_sort if it isn't already asort = getattr(book, 'author_sort', None) if not asort and book.authors: - book.author_sort = authors_to_sort_string(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/device_drivers/configwidget.py b/src/calibre/gui2/device_drivers/configwidget.py index 585eed30df..3d9c9ab2ee 100644 --- a/src/calibre/gui2/device_drivers/configwidget.py +++ b/src/calibre/gui2/device_drivers/configwidget.py @@ -11,7 +11,8 @@ from calibre.gui2.device_drivers.configwidget_ui import Ui_ConfigWidget class ConfigWidget(QWidget, Ui_ConfigWidget): def __init__(self, settings, all_formats, supports_subdirs, - must_read_metadata, extra_customization_message): + must_read_metadata, supports_use_author_sort, + extra_customization_message): QWidget.__init__(self) Ui_ConfigWidget.__init__(self) @@ -38,6 +39,10 @@ class ConfigWidget(QWidget, Ui_ConfigWidget): self.opt_read_metadata.setChecked(self.settings.read_metadata) else: self.opt_read_metadata.hide() + if supports_use_author_sort: + self.opt_use_author_sort.setChecked(self.settings.use_author_sort) + else: + self.opt_use_author_sort.hide() if extra_customization_message: self.extra_customization_label.setText(extra_customization_message) if settings.extra_customization: @@ -69,3 +74,6 @@ class ConfigWidget(QWidget, Ui_ConfigWidget): def read_metadata(self): return self.opt_read_metadata.isChecked() + + def use_author_sort(self): + return self.opt_use_author_sort.isChecked() diff --git a/src/calibre/gui2/device_drivers/configwidget.ui b/src/calibre/gui2/device_drivers/configwidget.ui index d007599424..497ba43259 100644 --- a/src/calibre/gui2/device_drivers/configwidget.ui +++ b/src/calibre/gui2/device_drivers/configwidget.ui @@ -90,7 +90,14 @@ - + + + + Use author sort for author + + + + Extra customization @@ -103,10 +110,10 @@ - + - + Save &template: @@ -116,7 +123,7 @@ - + diff --git a/src/calibre/gui2/dialogs/book_info.py b/src/calibre/gui2/dialogs/book_info.py index 0cd7c1d419..20ddfae0b4 100644 --- a/src/calibre/gui2/dialogs/book_info.py +++ b/src/calibre/gui2/dialogs/book_info.py @@ -121,6 +121,7 @@ class BookInfo(QDialog, Ui_BookInfo): f = f.strip() info[_('Formats')] += '%s, '%(f,f) for key in info.keys(): + if key == 'id': continue txt = info[key] txt = u'
\n'.join(textwrap.wrap(txt, 120)) rows += u'%s:%s'%(key, txt) diff --git a/src/calibre/gui2/dialogs/config/__init__.py b/src/calibre/gui2/dialogs/config/__init__.py index b9c57b27ab..ad49848b7b 100644 --- a/src/calibre/gui2/dialogs/config/__init__.py +++ b/src/calibre/gui2/dialogs/config/__init__.py @@ -481,8 +481,18 @@ class ConfigDialog(ResizableDialog, Ui_Dialog): self.opt_enforce_cpu_limit.setChecked(config['enforce_cpu_limit']) self.device_detection_button.clicked.connect(self.debug_device_detection) self.port.editingFinished.connect(self.check_port_value) + self.search_as_you_type.setChecked(config['search_as_you_type']) + self.show_avg_rating.setChecked(config['show_avg_rating']) self.show_splash_screen.setChecked(gprefs.get('show_splash_screen', True)) + li = None + for i, z in enumerate([('wide', _('Wide')), + ('narrow', _('Narrow'))]): + x, y = z + self.opt_gui_layout.addItem(y, QVariant(x)) + if x == config['gui_layout']: + li = i + self.opt_gui_layout.setCurrentIndex(li) def check_port_value(self, *args): port = self.port.value() @@ -854,6 +864,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog): config['delete_news_from_library_on_upload'] = self.delete_news.isChecked() config['upload_news_to_device'] = self.sync_news.isChecked() config['search_as_you_type'] = self.search_as_you_type.isChecked() + config['show_avg_rating'] = self.show_avg_rating.isChecked() config['get_social_metadata'] = self.opt_get_social_metadata.isChecked() config['overwrite_author_title_metadata'] = self.opt_overwrite_author_title_metadata.isChecked() config['enforce_cpu_limit'] = bool(self.opt_enforce_cpu_limit.isChecked()) @@ -863,6 +874,8 @@ class ConfigDialog(ResizableDialog, Ui_Dialog): if self.viewer.item(i).checkState() == Qt.Checked: fmts.append(str(self.viewer.item(i).text())) config['internally_viewed_formats'] = fmts + val = self.opt_gui_layout.itemData(self.opt_gui_layout.currentIndex()).toString() + config['gui_layout'] = unicode(val) if not path or not os.path.exists(path) or not os.path.isdir(path): d = error_dialog(self, _('Invalid database location'), diff --git a/src/calibre/gui2/dialogs/config/config.ui b/src/calibre/gui2/dialogs/config/config.ui index 917333a989..efda00fc97 100644 --- a/src/calibre/gui2/dialogs/config/config.ui +++ b/src/calibre/gui2/dialogs/config/config.ui @@ -7,7 +7,7 @@ 0 0 - 884 + 1000 730 @@ -89,8 +89,8 @@ 0 0 - 608 - 683 + 720 + 679 @@ -332,7 +332,7 @@ - + Use &Roman numerals for series number @@ -342,35 +342,45 @@ - + Enable system &tray icon (needs restart) - + Show &notifications in system tray - + Show &splash screen at startup - + Show cover &browser in a separate window (needs restart) - + + + + Show &average ratings in the tags browser + + + true + + + + Search as you type @@ -380,21 +390,21 @@ - + Automatically send downloaded &news to ebook reader - + &Delete news from library when it is automatically sent to reader - + @@ -411,7 +421,7 @@ - + Toolbar @@ -459,7 +469,7 @@
- + @@ -625,6 +635,26 @@ + + + + User Interface &layout (needs restart): + + + opt_gui_layout + + + + + + + + 250 + 16777215 + + + + diff --git a/src/calibre/gui2/dialogs/config/social.py b/src/calibre/gui2/dialogs/config/social.py index 6a767e7b3b..ad14ea05b0 100644 --- a/src/calibre/gui2/dialogs/config/social.py +++ b/src/calibre/gui2/dialogs/config/social.py @@ -49,6 +49,9 @@ class SocialMetadata(QDialog): self.mi.tags = self.worker.mi.tags self.mi.rating = self.worker.mi.rating self.mi.comments = self.worker.mi.comments + if self.worker.mi.series: + self.mi.series = self.worker.mi.series + self.mi.series_index = self.worker.mi.series_index QDialog.accept(self) @property diff --git a/src/calibre/gui2/dialogs/delete_matching_from_device.py b/src/calibre/gui2/dialogs/delete_matching_from_device.py new file mode 100644 index 0000000000..dbac2fe4ad --- /dev/null +++ b/src/calibre/gui2/dialogs/delete_matching_from_device.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' +__license__ = 'GPL v3' + +from PyQt4.Qt import Qt, QDialog, QTableWidgetItem, QAbstractItemView + +from calibre import strftime +from calibre.ebooks.metadata import authors_to_string, authors_to_sort_string, \ + title_sort +from calibre.gui2.dialogs.delete_matching_from_device_ui import \ + Ui_DeleteMatchingFromDeviceDialog +from calibre.utils.date import UNDEFINED_DATE + +class tableItem(QTableWidgetItem): + + def __init__(self, text): + QTableWidgetItem.__init__(self, text) + self.setFlags(Qt.ItemIsEnabled) + self.sort = text.lower() + + def __ge__(self, other): + return self.sort >= other.sort + + def __lt__(self, other): + return self.sort < other.sort + +class titleTableItem(tableItem): + + def __init__(self, text): + tableItem.__init__(self, text) + self.sort = title_sort(text.lower()) + +class authorTableItem(tableItem): + + def __init__(self, book): + tableItem.__init__(self, authors_to_string(book.authors)) + if book.author_sort is not None: + self.sort = book.author_sort.lower() + else: + self.sort = authors_to_sort_string(book.authors).lower() + +class dateTableItem(tableItem): + + def __init__(self, date): + if date is not None: + tableItem.__init__(self, strftime('%x', date)) + self.sort = date + else: + tableItem.__init__(self, '') + self.sort = UNDEFINED_DATE + + +class DeleteMatchingFromDeviceDialog(QDialog, Ui_DeleteMatchingFromDeviceDialog): + + def __init__(self, parent, items): + QDialog.__init__(self, parent) + Ui_DeleteMatchingFromDeviceDialog.__init__(self) + self.setupUi(self) + + self.explanation.setText('

'+_('All checked books will be ' + 'permanently deleted from your ' + '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.setHorizontalHeaderLabels( + ['', _('Location'), _('Title'), + _('Author'), _('Date'), _('Format')]) + rows = 0 + for card in items: + rows += len(items[card][1]) + self.table.setRowCount(rows) + row = 0 + for card in items: + (model,books) = items[card] + for (id,book) in books: + item = QTableWidgetItem() + item.setFlags(Qt.ItemIsUserCheckable|Qt.ItemIsEnabled) + item.setCheckState(Qt.Checked) + item.setData(Qt.UserRole, (model, id, book.path)) + self.table.setItem(row, 0, item) + self.table.setItem(row, 1, tableItem(card)) + 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])) + row += 1 + self.table.setCurrentCell(0, 1) + self.table.resizeColumnsToContents() + self.table.setSortingEnabled(True) + self.table.sortByColumn(2, Qt.AscendingOrder) + self.table.setCurrentCell(0, 1) + + def cell_clicked(self, row, col): + if col == 0: + self.table.setCurrentCell(row, 1) + + def accepted(self): + self.result = [] + for row in range(self.table.rowCount()): + if self.table.item(row, 0).checkState() == Qt.Unchecked: + continue + (model, id, path) = self.table.item(row, 0).data(Qt.UserRole).toPyObject() + path = unicode(path) + self.result.append((model, id, path)) + return + diff --git a/src/calibre/gui2/dialogs/delete_matching_from_device.ui b/src/calibre/gui2/dialogs/delete_matching_from_device.ui new file mode 100644 index 0000000000..fec08e5b00 --- /dev/null +++ b/src/calibre/gui2/dialogs/delete_matching_from_device.ui @@ -0,0 +1,90 @@ + + + DeleteMatchingFromDeviceDialog + + + + 0 + 0 + 730 + 342 + + + + + 0 + 0 + + + + Delete from device + + + + + + + + + + + 0 + 0 + + + + 0 + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + true + + + + + + + + + buttonBox + accepted() + DeleteMatchingFromDeviceDialog + accept() + + + 229 + 211 + + + 157 + 234 + + + + + buttonBox + rejected() + DeleteMatchingFromDeviceDialog + reject() + + + 297 + 217 + + + 286 + 234 + + + + + diff --git a/src/calibre/gui2/dialogs/edit_authors_dialog.py b/src/calibre/gui2/dialogs/edit_authors_dialog.py new file mode 100644 index 0000000000..842fd7c943 --- /dev/null +++ b/src/calibre/gui2/dialogs/edit_authors_dialog.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' +__license__ = 'GPL v3' + +from PyQt4.Qt import Qt, QDialog, QTableWidgetItem, QAbstractItemView + +from calibre.ebooks.metadata import author_to_author_sort +from calibre.gui2.dialogs.edit_authors_dialog_ui import Ui_EditAuthorsDialog + +class tableItem(QTableWidgetItem): + def __ge__(self, other): + return unicode(self.text()).lower() >= unicode(other.text()).lower() + + def __lt__(self, other): + return unicode(self.text()).lower() < unicode(other.text()).lower() + +class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog): + + def __init__(self, parent, db, id_to_select): + QDialog.__init__(self, parent) + Ui_EditAuthorsDialog.__init__(self) + self.setupUi(self) + + self.buttonBox.accepted.connect(self.accepted) + + self.table.setSelectionMode(QAbstractItemView.SingleSelection) + self.table.setColumnCount(2) + self.table.setHorizontalHeaderLabels([_('Author'), _('Author sort')]) + + self.authors = {} + auts = db.get_authors_with_ids() + self.table.setRowCount(len(auts)) + select_item = None + for row, (id, author, sort) in enumerate(auts): + author = author.replace('|', ',') + self.authors[id] = (author, sort) + aut = tableItem(author) + aut.setData(Qt.UserRole, id) + sort = tableItem(sort) + self.table.setItem(row, 0, aut) + self.table.setItem(row, 1, sort) + if id == id_to_select: + select_item = sort + self.table.resizeColumnsToContents() + + # set up the signal after the table is filled + self.table.cellChanged.connect(self.cell_changed) + + self.table.setSortingEnabled(True) + self.table.sortByColumn(1, Qt.AscendingOrder) + if select_item is not None: + self.table.setCurrentItem(select_item) + self.table.editItem(select_item) + else: + self.table.setCurrentCell(0, 0) + + def accepted(self): + self.result = [] + for row in range(0,self.table.rowCount()): + id = self.table.item(row, 0).data(Qt.UserRole).toInt()[0] + aut = unicode(self.table.item(row, 0).text()).strip() + sort = unicode(self.table.item(row, 1).text()).strip() + orig_aut,orig_sort = self.authors[id] + if orig_aut != aut or orig_sort != sort: + self.result.append((id, orig_aut, aut, sort)) + + def cell_changed(self, row, col): + if col == 0: + item = self.table.item(row, 0) + aut = unicode(item.text()).strip() + c = self.table.item(row, 1) + c.setText(author_to_author_sort(aut)) + item = c + else: + item = self.table.item(row, 1) + self.table.setCurrentItem(item) + # disable and reenable sorting to force the sort now, so we can scroll + # to the item after it moves + self.table.setSortingEnabled(False) + self.table.setSortingEnabled(True) + self.table.scrollToItem(item) diff --git a/src/calibre/gui2/dialogs/edit_authors_dialog.ui b/src/calibre/gui2/dialogs/edit_authors_dialog.ui new file mode 100644 index 0000000000..d124f1498d --- /dev/null +++ b/src/calibre/gui2/dialogs/edit_authors_dialog.ui @@ -0,0 +1,86 @@ + + + EditAuthorsDialog + + + + 0 + 0 + 730 + 342 + + + + + 0 + 0 + + + + Manage authors + + + + + + + 0 + 0 + + + + 0 + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + true + + + + + + + + + buttonBox + accepted() + EditAuthorsDialog + accept() + + + 229 + 211 + + + 157 + 234 + + + + + buttonBox + rejected() + EditAuthorsDialog + reject() + + + 297 + 217 + + + 286 + 234 + + + + + diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index eca7fe9c15..8b27ff1999 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -8,7 +8,7 @@ from PyQt4.QtGui import QDialog, QGridLayout 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_sort_string, \ +from calibre.ebooks.metadata import string_to_authors, \ authors_to_string from calibre.gui2.custom_column_widgets import populate_bulk_metadata_page @@ -110,10 +110,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): au = string_to_authors(au) self.db.set_authors(id, au, notify=False) if self.auto_author_sort.isChecked(): - aut = self.db.authors(id, index_is_id=True) - aut = aut if aut else '' - aut = [a.strip().replace('|', ',') for a in aut.strip().split(',')] - x = authors_to_sort_string(aut) + x = self.db.author_sort_from_book(id, index_is_id=True) if x: self.db.set_author_sort(id, x, notify=False) aus = unicode(self.author_sort.text()) diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 0241e1b542..96323ac596 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -23,7 +23,7 @@ from calibre.gui2.dialogs.fetch_metadata import FetchMetadata from calibre.gui2.dialogs.tag_editor import TagEditor from calibre.gui2.widgets import ProgressIndicator from calibre.ebooks import BOOK_EXTENSIONS -from calibre.ebooks.metadata import authors_to_sort_string, string_to_authors, \ +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 @@ -357,7 +357,8 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): aus = self.db.author_sort(row) self.author_sort.setText(aus if aus else '') tags = self.db.tags(row) - self.tags.setText(', '.join(tags.split(',')) if tags else '') + self.original_tags = ', '.join(tags.split(',')) if tags else '' + self.tags.setText(self.original_tags) self.tags.update_tags_cache(self.db.all_tags()) rating = self.db.rating(row) if rating > 0: @@ -459,7 +460,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): au = unicode(self.authors.text()) au = re.sub(r'\s+et al\.$', '', au) authors = string_to_authors(au) - self.author_sort.setText(authors_to_sort_string(authors)) + self.author_sort.setText(self.db.author_sort_from_authors(authors)) def swap_title_author(self): title = self.title.text() @@ -527,6 +528,10 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.publisher.setCurrentIndex(idx) def edit_tags(self): + if self.tags.text() != self.original_tags: + error_dialog(self, _('Cannot use tag editor'), + _('The tags editor cannot be used if you have modified the tags')).exec_() + return d = TagEditor(self, self.db, self.row) d.exec_() if d.result() == QDialog.Accepted: diff --git a/src/calibre/gui2/dialogs/tag_list_editor.ui b/src/calibre/gui2/dialogs/tag_list_editor.ui index 4f57af745b..39076aa1f6 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.ui +++ b/src/calibre/gui2/dialogs/tag_list_editor.ui @@ -121,6 +121,9 @@ QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + true + diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index 5f42636dad..b334808d9b 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -8,15 +8,18 @@ __docformat__ = 'restructuredtext en' import functools from PyQt4.Qt import QMenu, Qt, pyqtSignal, QToolButton, QIcon, QStackedWidget, \ - QWidget, QHBoxLayout, QToolBar, QSize, QSizePolicy + QSize, QSizePolicy, QStatusBar from calibre.utils.config import prefs from calibre.ebooks import BOOK_EXTENSIONS -from calibre.constants import isosx, __appname__ +from calibre.constants import isosx, __appname__, preferred_encoding from calibre.gui2 import config, is_widescreen 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 = [] @@ -47,7 +50,7 @@ class ToolbarMixin(object): # {{{ def __init__(self): md = QMenu() md.addAction(_('Edit metadata individually'), - partial(self.edit_metadata, False)) + partial(self.edit_metadata, False, bulk=False)) md.addSeparator() md.addAction(_('Edit metadata in bulk'), partial(self.edit_metadata, False, bulk=True)) @@ -128,6 +131,10 @@ class ToolbarMixin(object): # {{{ self.delete_all_but_selected_formats) self.delete_menu.addAction( _('Remove covers from selected books'), self.delete_covers) + self.delete_menu.addSeparator() + self.delete_menu.addAction( + _('Remove matching books from device'), + self.remove_matching_books_from_device) self.action_del.setMenu(self.delete_menu) self.action_open_containing_folder.setShortcut(Qt.Key_O) @@ -156,8 +163,7 @@ class ToolbarMixin(object): # {{{ self.convert_menu = cm pm = QMenu() - ap = self.action_preferences - pm.addAction(ap) + pm.addAction(QIcon(I('config.svg')), _('Preferences'), self.do_config) pm.addAction(QIcon(I('wizard.svg')), _('Run welcome wizard'), self.run_wizard) self.action_preferences.setMenu(pm) @@ -212,20 +218,25 @@ 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, similar_menu=similar_menu) - + add_to_library = (_('Add books to library'), self.add_books_from_device) 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) 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) 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) self.library_view.files_dropped.connect(self.files_dropped, type=Qt.QueuedConnection) for func, args in [ @@ -290,9 +301,9 @@ class LibraryViewMixin(object): # {{{ class LibraryWidget(Splitter): # {{{ def __init__(self, parent): - orientation = Qt.Vertical if config['gui_layout'] == 'narrow' and \ - not is_widescreen() else Qt.Horizontal - #orientation = Qt.Vertical + orientation = Qt.Vertical + if config['gui_layout'] == 'narrow': + orientation = Qt.Horizontal if is_widescreen() else Qt.Vertical idx = 0 if orientation == Qt.Vertical else 1 size = 300 if orientation == Qt.Vertical else 550 Splitter.__init__(self, 'cover_browser_splitter', _('Cover Browser'), @@ -330,26 +341,24 @@ class Stack(QStackedWidget): # {{{ # }}} -class SideBar(QToolBar): # {{{ +class StatusBar(QStatusBar): # {{{ + def initialize(self, systray=None): + self.systray = systray + self.notifier = get_notifier(systray) - def __init__(self, splitters, jobs_button, parent=None): - QToolBar.__init__(self, _('Side bar'), parent) - self.setOrientation(Qt.Vertical) - self.setMovable(False) - self.setFloatable(False) - self.setToolButtonStyle(Qt.ToolButtonIconOnly) - self.setIconSize(QSize(48, 48)) - self.spacer = QWidget(self) - self.spacer.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding) - for s in splitters: - self.addWidget(s.button) - self.addWidget(self.spacer) - self.addWidget(jobs_button) + def show_message(self, msg, timeout=0): + QStatusBar.showMessage(self, msg, timeout) + if self.notifier is not None and not config['disable_tray_notification']: + if isosx and isinstance(msg, unicode): + try: + msg = msg.encode(preferred_encoding) + except UnicodeEncodeError: + msg = msg.encode('utf-8') + self.notifier(msg) - for ch in self.children(): - if isinstance(ch, QToolButton): - ch.setCursor(Qt.PointingHandCursor) + def clear_message(self): + QStatusBar.clearMessage(self) # }}} @@ -359,31 +368,52 @@ class LayoutMixin(object): # {{{ self.setupUi(self) self.setWindowTitle(__appname__) - if config['gui_layout'] == 'narrow': - from calibre.gui2.status import StatusBar - self.status_bar = self.book_details = StatusBar(self) + if config['gui_layout'] == 'narrow': # narrow {{{ + self.book_details = BookDetails(False, self) self.stack = Stack(self) self.bd_splitter = Splitter('book_details_splitter', _('Book Details'), I('book.svg'), orientation=Qt.Vertical, parent=self, side_index=1) - self._layout_mem = [QWidget(self), QHBoxLayout()] - self._layout_mem[0].setLayout(self._layout_mem[1]) - l = self._layout_mem[1] - l.addWidget(self.stack) - self.sidebar = SideBar([getattr(self, x+'_splitter') - for x in ('bd', 'tb', 'cb')], self.jobs_button, parent=self) - l.addWidget(self.sidebar) - self.bd_splitter.addWidget(self._layout_mem[0]) - self.bd_splitter.addWidget(self.status_bar) - self.bd_splitter.setCollapsible((self.bd_splitter.side_index+1)%2, False) + self.bd_splitter.addWidget(self.stack) + self.bd_splitter.addWidget(self.book_details) + self.bd_splitter.setCollapsible(self.bd_splitter.other_index, False) self.centralwidget.layout().addWidget(self.bd_splitter) + # }}} + else: # wide {{{ + self.bd_splitter = Splitter('book_details_splitter', + _('Book Details'), I('book.svg'), initial_side_size=200, + orientation=Qt.Horizontal, parent=self, side_index=1) + self.stack = Stack(self) + self.bd_splitter.addWidget(self.stack) + self.book_details = BookDetails(True, self) + self.bd_splitter.addWidget(self.book_details) + self.bd_splitter.setCollapsible(self.bd_splitter.other_index, False) + self.bd_splitter.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, + QSizePolicy.Expanding)) + self.centralwidget.layout().addWidget(self.bd_splitter) + # }}} + + self.status_bar = StatusBar(self) + for x in ('cb', 'tb', 'bd'): + button = getattr(self, x+'_splitter').button + button.setIconSize(QSize(24, 24)) + self.status_bar.addPermanentWidget(button) + self.status_bar.addPermanentWidget(self.jobs_button) + self.setStatusBar(self.status_bar) def finalize_layout(self): + self.status_bar.initialize(self.system_tray_icon) + self.book_details.show_book_info.connect(self.show_book_info) + self.book_details.files_dropped.connect(self.files_dropped_on_book) + self.book_details.open_containing_folder.connect(self.view_folder_for_id) + self.book_details.view_specific_format.connect(self.view_format_by_id) + m = self.library_view.model() if m.rowCount(None) > 0: self.library_view.set_current_row(0) m.current_changed(self.library_view.currentIndex(), self.library_view.currentIndex()) + self.library_view.setFocus(Qt.OtherFocusReason) def save_layout_state(self): diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index adf938c435..d512409d25 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -274,11 +274,15 @@ class JobsButton(QFrame): def __init__(self, horizontal=False, size=48, parent=None): QFrame.__init__(self, parent) + if horizontal: + size = 24 self.pi = ProgressIndicator(self, size) self._jobs = QLabel(''+_('Jobs:')+' 0') + self._jobs.mouseReleaseEvent = self.mouseReleaseEvent if horizontal: self.setLayout(QHBoxLayout()) + self.layout().setDirection(self.layout().RightToLeft) else: self.setLayout(QVBoxLayout()) self._jobs.setAlignment(Qt.AlignHCenter|Qt.AlignBottom) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 293a522a9e..dcc338dbdc 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -21,7 +21,7 @@ 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 import strftime, isbytestring +from calibre import strftime, isbytestring, prepare_string_for_xml from calibre.constants import filesystem_encoding from calibre.gui2.library import DEFAULT_SORT @@ -300,6 +300,7 @@ class BooksModel(QAbstractTableModel): # {{{ formats = _('None') data[_('Formats')] = formats data[_('Path')] = self.db.abspath(idx) + data['id'] = self.id(idx) comments = self.db.comments(idx) if not comments: comments = _('None') @@ -308,7 +309,9 @@ class BooksModel(QAbstractTableModel): # {{{ if series: sidx = self.db.series_index(idx) sidx = fmt_sidx(sidx, use_roman = self.use_roman_numbers) - data[_('Series')] = _('Book %s of %s.')%(sidx, series) + data[_('Series')] = \ + _('Book %s of %s.')%\ + (sidx, prepare_string_for_xml(series)) return data @@ -417,8 +420,11 @@ class BooksModel(QAbstractTableModel): # {{{ pt.orig_file_path = os.path.abspath(src.name) pt.seek(0) if set_metadata: - _set_metadata(pt, self.db.get_metadata(id, get_cover=True, index_is_id=True), + try: + _set_metadata(pt, self.db.get_metadata(id, get_cover=True, index_is_id=True), format) + except: + traceback.print_exc() pt.close() def to_uni(x): if isbytestring(x): @@ -763,6 +769,7 @@ class OnDeviceSearch(SearchQueryParser): # {{{ 'format', 'formats', 'title', + 'inlibrary' ] @@ -801,12 +808,23 @@ class OnDeviceSearch(SearchQueryParser): # {{{ 'author': lambda x: ' & '.join(getattr(x, 'authors')).lower(), 'collections':lambda x: ','.join(getattr(x, 'device_collections')).lower(), 'format':lambda x: os.path.splitext(x.path)[1].lower(), + 'inlibrary':lambda x : getattr(x, 'in_library') } for x in ('author', 'format'): q[x+'s'] = q[x] for index, row in enumerate(self.model.db): for locvalue in locations: accessor = q[locvalue] + if query == 'true': + if accessor(row) is not None: + matches.add(index) + continue + if query == 'false': + if accessor(row) is None: + matches.add(index) + continue + if locvalue == 'inlibrary': + continue # this is bool, so can't match below try: ### Can't separate authors because comma is used for name sep and author sep ### Exact match might not get what you want. For that reason, turn author @@ -856,11 +874,15 @@ class DeviceBooksModel(BooksModel): # {{{ self.editable = True self.book_in_library = None - def mark_for_deletion(self, job, rows): - self.marked_for_deletion[job] = self.indices(rows) - for row in rows: - indices = self.row_indices(row) - self.dataChanged.emit(indices[0], indices[-1]) + def mark_for_deletion(self, job, rows, rows_are_ids=False): + if rows_are_ids: + self.marked_for_deletion[job] = rows + self.reset() + else: + self.marked_for_deletion[job] = self.indices(rows) + for row in rows: + indices = self.row_indices(row) + self.dataChanged.emit(indices[0], indices[-1]) def deletion_done(self, job, succeeded=True): if not self.marked_for_deletion.has_key(job): @@ -882,13 +904,13 @@ class DeviceBooksModel(BooksModel): # {{{ ans.extend(v) return ans - def clear_ondevice(self, db_ids): + def clear_ondevice(self, db_ids, to_what=None): for data in self.db: if data is None: continue app_id = getattr(data, 'application_id', None) if app_id is not None and app_id in db_ids: - data.in_library = False + data.in_library = to_what self.reset() def flags(self, index): @@ -897,8 +919,8 @@ 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 self.db.supports_collections()): flags |= Qt.ItemIsEditable return flags @@ -1043,6 +1065,13 @@ class DeviceBooksModel(BooksModel): # {{{ def paths(self, rows): return [self.db[self.map[r.row()]].path for r in rows ] + def paths_for_db_ids(self, db_ids): + res = [] + for r,b in enumerate(self.db): + if b.application_id in db_ids: + res.append((r,b)) + return res + def indices(self, rows): ''' Return indices into underlying database from rows @@ -1083,6 +1112,8 @@ class DeviceBooksModel(BooksModel): # {{{ elif role == Qt.DecorationRole and cname == 'inlibrary': if self.db[self.map[row]].in_library: return QVariant(self.bool_yes_icon) + elif self.db[self.map[row]].in_library is not None: + return QVariant(self.bool_no_icon) elif role == Qt.TextAlignmentRole: cname = self.column_map[index.column()] ans = Qt.AlignVCenter | ALIGNMENT_MAP[self.alignment_map.get(cname, diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index ad26e50b0e..b949306294 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -370,7 +370,8 @@ 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): self.setContextMenuPolicy(Qt.DefaultContextMenu) self.context_menu = QMenu(self) if edit_metadata is not None: @@ -389,6 +390,9 @@ 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) def contextMenuEvent(self, event): self.context_menu.popup(event.globalPos()) diff --git a/src/calibre/gui2/metadata.py b/src/calibre/gui2/metadata.py index d63e9648cc..cd4cc1be41 100644 --- a/src/calibre/gui2/metadata.py +++ b/src/calibre/gui2/metadata.py @@ -84,12 +84,12 @@ class DownloadMetadata(Thread): if mi.isbn: args['isbn'] = mi.isbn else: - if not mi.title: + if not mi.title or mi.title == _('Unknown'): self.failures[id] = \ (str(id), _('Book has neither title nor ISBN')) continue args['title'] = mi.title - if mi.authors: + if mi.authors and mi.authors[0] != _('Unknown'): args['author'] = mi.authors[0] if self.key: args['isbndb_key'] = self.key @@ -127,6 +127,10 @@ class DownloadMetadata(Thread): self.db.set_tags(id, mi.tags) if mi.comments: self.db.set_comment(id, mi.comments) + if mi.series: + self.db.set_series(id, mi.series) + if mi.series_index is not None: + self.db.set_series_index(id, mi.series_index) self.updated = set(self.fetched_metadata) diff --git a/src/calibre/gui2/pictureflow/pictureflow.cpp b/src/calibre/gui2/pictureflow/pictureflow.cpp index 60985a1a12..d1434e763c 100644 --- a/src/calibre/gui2/pictureflow/pictureflow.cpp +++ b/src/calibre/gui2/pictureflow/pictureflow.cpp @@ -85,7 +85,9 @@ typedef long PFreal; typedef unsigned short QRgb565; -#define FONT_SIZE 18 +#define REFLECTION_FACTOR 1.5 + +#define MAX(x, y) ((x > y) ? x : y) #define RGB565_RED_MASK 0xF800 #define RGB565_GREEN_MASK 0x07E0 @@ -124,6 +126,7 @@ inline PFreal floatToFixed(float val) return (PFreal)(val*PFREAL_ONE); } +// sinTable {{{ #define IANGLE_MAX 1024 #define IANGLE_MASK 1023 @@ -293,6 +296,7 @@ int main(int, char**) return 0; } #endif +// }}} inline PFreal fsin(int iangle) { @@ -315,6 +319,8 @@ struct SlideInfo PFreal cy; }; +// PicturePlowPrivate {{{ + class PictureFlowPrivate { public: @@ -369,6 +375,7 @@ private: int slideWidth; int slideHeight; + int fontSize; int zoom; int queueLength; @@ -406,6 +413,7 @@ PictureFlowPrivate::PictureFlowPrivate(PictureFlow* w, int queueLength_) slideWidth = 200; slideHeight = 200; + fontSize = 10; zoom = 100; centerIndex = 0; @@ -488,6 +496,7 @@ int PictureFlowPrivate::currentSlide() const void PictureFlowPrivate::setCurrentSlide(int index) { + animateTimer.stop(); step = 0; centerIndex = qBound(index, 0, slideImages->count()-1); target = centerIndex; @@ -542,8 +551,11 @@ void PictureFlowPrivate::showSlide(int index) void PictureFlowPrivate::resize(int w, int h) { - slideHeight = int(float(h)/2.); + if (w < 10) w = 10; + if (h < 10) h = 10; + slideHeight = int(float(h)/REFLECTION_FACTOR); slideWidth = int(float(slideHeight) * 2/3.); + fontSize = MAX(int(h/15.), 12); recalc(w, h); resetSlides(); triggerRender(); @@ -592,8 +604,8 @@ static QImage prepareSurface(QImage img, int w, int h) img = img.scaled(w, h, Qt::IgnoreAspectRatio, mode); // slightly larger, to accomodate for the reflection - int hs = h * 2; - int hofs = h / 3; + int hs = int(h * REFLECTION_FACTOR); + int hofs = 0; // offscreen buffer: black is sweet QImage result(hs, w, QImage::Format_RGB16); @@ -715,13 +727,13 @@ void PictureFlowPrivate::render() QFont font = QFont(); font.setBold(true); - font.setPointSize(FONT_SIZE); + font.setPixelSize(fontSize); painter.setFont(font); 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-FONT_SIZE*3), + painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2-fontSize*3), Qt::AlignCenter, slideImages->caption(centerIndex)); painter.end(); @@ -766,7 +778,7 @@ void PictureFlowPrivate::render() QFont font = QFont(); font.setBold(true); - font.setPointSize(FONT_SIZE); + font.setPixelSize(fontSize); painter.setFont(font); int leftTextIndex = (step>0) ? centerIndex : centerIndex-1; @@ -774,12 +786,12 @@ void PictureFlowPrivate::render() painter.setPen(QColor(255,255,255, (255-fade) )); if (leftTextIndex < sc && leftTextIndex > -1) - painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2 - FONT_SIZE*3), + painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2 - fontSize*3), Qt::AlignCenter, slideImages->caption(leftTextIndex)); painter.setPen(QColor(255,255,255, fade)); if (leftTextIndex+1 < sc && leftTextIndex > -2) - painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2 - FONT_SIZE*3), + painter.drawText( QRect(0,0, buffer.width(), buffer.height()*2 - fontSize*3), Qt::AlignCenter, slideImages->caption(leftTextIndex+1)); @@ -893,7 +905,7 @@ int col1, int col2) int center = (sh*BILINEAR_STRETCH_VER/2); int dy = dist*BILINEAR_STRETCH_VER / h; #else - int center = (sh/2); + int center = sh/2; int dy = dist / h; #endif int p1 = center*PFREAL_ONE - dy/2; @@ -1110,8 +1122,9 @@ void PictureFlowPrivate::clearSurfaceCache() surfaceCache.clear(); } -// ----------------------------------------- +// }}} +// PictureFlow {{{ PictureFlow::PictureFlow(QWidget* parent, int queueLength): QWidget(parent) { d = new PictureFlowPrivate(this, queueLength); @@ -1387,3 +1400,5 @@ 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(); } + +// }}} diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index f34c52d221..35bf7374a0 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -18,17 +18,20 @@ from calibre.utils.config import prefs from calibre.utils.search_query_parser import saved_searches class SearchLineEdit(QLineEdit): + key_pressed = pyqtSignal(object) + mouse_released = pyqtSignal(object) + focus_out = pyqtSignal(object) def keyPressEvent(self, event): - self.emit(SIGNAL('key_pressed(PyQt_PyObject)'), event) + self.key_pressed.emit(event) QLineEdit.keyPressEvent(self, event) def mouseReleaseEvent(self, event): - self.emit(SIGNAL('mouse_released(PyQt_PyObject)'), event) + self.mouse_released.emit(event) QLineEdit.mouseReleaseEvent(self, event) def focusOutEvent(self, event): - self.emit(SIGNAL('focus_out(PyQt_PyObject)'), event) + self.focus_out.emit(event) QLineEdit.focusOutEvent(self, event) def dropEvent(self, ev): @@ -68,10 +71,10 @@ class SearchBox2(QComboBox): self.normal_background = 'rgb(255, 255, 255, 0%)' self.line_edit = SearchLineEdit(self) self.setLineEdit(self.line_edit) - self.connect(self.line_edit, SIGNAL('key_pressed(PyQt_PyObject)'), - self.key_pressed, Qt.DirectConnection) - self.connect(self.line_edit, SIGNAL('mouse_released(PyQt_PyObject)'), - self.mouse_released, Qt.DirectConnection) + self.line_edit.key_pressed.connect(self.key_pressed, + type=Qt.DirectConnection) + self.line_edit.mouse_released.connect(self.mouse_released, + type=Qt.DirectConnection) self.setEditable(True) self.help_state = False self.as_you_type = True @@ -90,14 +93,18 @@ class SearchBox2(QComboBox): self.help_text = help_text self.colorize = colorize self.clear_to_help() - self.connect(self, SIGNAL('editTextChanged(QString)'), self.text_edited_slot) def normalize_state(self): - self.setEditText('') - self.line_edit.setStyleSheet( - 'QLineEdit { color: black; background-color: %s; }' % - self.normal_background) - self.help_state = False + if self.help_state: + self.setEditText('') + self.line_edit.setStyleSheet( + 'QLineEdit { color: black; background-color: %s; }' % + self.normal_background) + self.help_state = False + else: + self.line_edit.setStyleSheet( + 'QLineEdit { color: black; background-color: %s; }' % + self.normal_background) def clear_to_help(self): if self.help_state: @@ -131,17 +138,13 @@ class SearchBox2(QComboBox): self.line_edit.setStyleSheet('QLineEdit { color: black; background-color: %s; }' % col) def key_pressed(self, event): - if self.help_state: - self.normalize_state() - if not self.as_you_type: - if event.key() in (Qt.Key_Return, Qt.Key_Enter): - self.do_search() + self.normalize_state() + if event.key() in (Qt.Key_Return, Qt.Key_Enter): + self.do_search() + self.timer = self.startTimer(self.__class__.INTERVAL) def mouse_released(self, event): - if self.help_state: - self.normalize_state() - - def text_edited_slot(self, text): + self.normalize_state() if self.as_you_type: self.timer = self.startTimer(self.__class__.INTERVAL) @@ -227,14 +230,13 @@ class SavedSearchBox(QComboBox): self.line_edit = SearchLineEdit(self) self.setLineEdit(self.line_edit) - self.connect(self.line_edit, SIGNAL('key_pressed(PyQt_PyObject)'), - self.key_pressed, Qt.DirectConnection) - self.connect(self.line_edit, SIGNAL('mouse_released(PyQt_PyObject)'), - self.mouse_released, Qt.DirectConnection) - self.connect(self.line_edit, SIGNAL('focus_out(PyQt_PyObject)'), - self.focus_out, Qt.DirectConnection) - self.connect(self, SIGNAL('activated(const QString&)'), - self.saved_search_selected) + self.line_edit.key_pressed.connect(self.key_pressed, + type=Qt.DirectConnection) + self.line_edit.mouse_released.connect(self.mouse_released, + type=Qt.DirectConnection) + self.line_edit.focus_out.connect(self.focus_out, + type=Qt.DirectConnection) + self.activated[str].connect(self.saved_search_selected) completer = QCompleter(self) # turn off auto-completion self.setCompleter(completer) @@ -282,7 +284,7 @@ class SavedSearchBox(QComboBox): if self.help_state: self.normalize_state() - def saved_search_selected (self, qname): + def saved_search_selected(self, qname): qname = unicode(qname) if qname is None or not qname.strip(): return diff --git a/src/calibre/gui2/status.py b/src/calibre/gui2/status.py deleted file mode 100644 index 50a256ef2d..0000000000 --- a/src/calibre/gui2/status.py +++ /dev/null @@ -1,228 +0,0 @@ -__license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal ' -import os, collections - -from PyQt4.QtGui import QStatusBar, QLabel, QWidget, QHBoxLayout, QPixmap, \ - QSizePolicy, QScrollArea -from PyQt4.QtCore import Qt, QSize, pyqtSignal - -from calibre import fit_image, preferred_encoding, isosx -from calibre.gui2 import config -from calibre.gui2.widgets import IMAGE_EXTENSIONS -from calibre.gui2.notify import get_notifier -from calibre.ebooks import BOOK_EXTENSIONS -from calibre.library.comments import comments_to_html - -class BookInfoDisplay(QWidget): - - DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS+BOOK_EXTENSIONS - files_dropped = pyqtSignal(object, object) - - @classmethod - def paths_from_event(cls, event): - ''' - Accept a drop event and return a list of paths that can be read from - and represent files with extensions. - ''' - if event.mimeData().hasFormat('text/uri-list'): - urls = [unicode(u.toLocalFile()) for u in event.mimeData().urls()] - urls = [u for u in urls if os.path.splitext(u)[1] and os.access(u, os.R_OK)] - return [u for u in urls if os.path.splitext(u)[1][1:].lower() in cls.DROPABBLE_EXTENSIONS] - - def dragEnterEvent(self, event): - if int(event.possibleActions() & Qt.CopyAction) + \ - int(event.possibleActions() & Qt.MoveAction) == 0: - return - paths = self.paths_from_event(event) - if paths: - event.acceptProposedAction() - - def dropEvent(self, event): - paths = self.paths_from_event(event) - event.setDropAction(Qt.CopyAction) - self.files_dropped.emit(event, paths) - - def dragMoveEvent(self, event): - event.acceptProposedAction() - - - class BookCoverDisplay(QLabel): - - def __init__(self, coverpath=I('book.svg')): - QLabel.__init__(self) - self.setMaximumWidth(81) - self.setMaximumHeight(108) - self.default_pixmap = QPixmap(coverpath) - self.setScaledContents(True) - self.statusbar_height = 120 - self.setPixmap(self.default_pixmap) - - def do_layout(self): - pixmap = self.pixmap() - pwidth, pheight = pixmap.width(), pixmap.height() - width, height = fit_image(pwidth, pheight, - pwidth, self.statusbar_height-20)[1:] - self.setMaximumHeight(height) - try: - aspect_ratio = pwidth/float(pheight) - except ZeroDivisionError: - aspect_ratio = 1 - self.setMaximumWidth(int(aspect_ratio*self.maximumHeight())) - - def setPixmap(self, pixmap): - QLabel.setPixmap(self, pixmap) - self.do_layout() - - - def sizeHint(self): - return QSize(self.maximumWidth(), self.maximumHeight()) - - def relayout(self, statusbar_size): - self.statusbar_height = statusbar_size.height() - self.do_layout() - - - class BookDataDisplay(QLabel): - - mr = pyqtSignal(int) - - def __init__(self): - QLabel.__init__(self) - self.setText('') - self.setWordWrap(True) - self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) - - def mouseReleaseEvent(self, ev): - self.mr.emit(1) - - WEIGHTS = collections.defaultdict(lambda : 100) - WEIGHTS[_('Path')] = 0 - WEIGHTS[_('Formats')] = 1 - WEIGHTS[_('Collections')] = 2 - WEIGHTS[_('Series')] = 3 - WEIGHTS[_('Tags')] = 4 - WEIGHTS[_('Comments')] = 5 - - show_book_info = pyqtSignal() - - def __init__(self, clear_message): - QWidget.__init__(self) - self.setCursor(Qt.PointingHandCursor) - self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) - self._layout = QHBoxLayout() - self.setLayout(self._layout) - self.clear_message = clear_message - self.cover_display = BookInfoDisplay.BookCoverDisplay() - self._layout.addWidget(self.cover_display) - self.book_data = BookInfoDisplay.BookDataDisplay() - self.book_data.mr.connect(self.mouseReleaseEvent) - self._layout.addWidget(self.book_data) - self.data = {} - self.setVisible(False) - self._layout.setAlignment(self.cover_display, Qt.AlignTop|Qt.AlignLeft) - - def mouseReleaseEvent(self, ev): - self.show_book_info.emit() - - def show_data(self, data): - if data.has_key('cover'): - self.cover_display.setPixmap(QPixmap.fromImage(data.pop('cover'))) - else: - self.cover_display.setPixmap(self.cover_display.default_pixmap) - - rows, comments = [], '' - self.book_data.setText('') - self.data = data.copy() - keys = data.keys() - keys.sort(cmp=lambda x, y: cmp(self.WEIGHTS[x], self.WEIGHTS[y])) - for key in keys: - txt = data[key] - if not txt or not txt.strip() or txt == 'None': - continue - if isinstance(key, str): - key = key.decode(preferred_encoding, 'replace') - if isinstance(txt, str): - txt = txt.decode(preferred_encoding, 'replace') - if key == _('Comments'): - comments = comments_to_html(txt) - else: - rows.append((key, txt)) - rows = '\n'.join([u'%s:%s'%(k,t) for - k, t in rows]) - if comments: - comments = 'Comments:'+comments - left_pane = u'%s
'%rows - right_pane = u'
%s
'%comments - self.book_data.setText(u'
%s%s
' - % (left_pane, right_pane)) - - self.clear_message() - self.book_data.updateGeometry() - self.updateGeometry() - self.setVisible(True) - -class StatusBarInterface(object): - - def initialize(self, systray=None): - self.systray = systray - self.notifier = get_notifier(systray) - - def show_message(self, msg, timeout=0): - QStatusBar.showMessage(self, msg, timeout) - if self.notifier is not None and not config['disable_tray_notification']: - if isosx and isinstance(msg, unicode): - try: - msg = msg.encode(preferred_encoding) - except UnicodeEncodeError: - msg = msg.encode('utf-8') - self.notifier(msg) - - def clear_message(self): - QStatusBar.clearMessage(self) - -class BookDetailsInterface(object): - - # These signals must be defined in the class implementing this interface - files_dropped = None - show_book_info = None - - def reset_info(self): - raise NotImplementedError() - - def show_data(self, data): - raise NotImplementedError() - -class StatusBar(QStatusBar, StatusBarInterface, BookDetailsInterface): - - files_dropped = pyqtSignal(object, object) - show_book_info = pyqtSignal() - - - resized = pyqtSignal(object) - - def initialize(self, systray=None): - StatusBarInterface.initialize(self, systray=systray) - self.book_info = BookInfoDisplay(self.clear_message) - self.book_info.setAcceptDrops(True) - self.scroll_area = QScrollArea() - self.scroll_area.setWidget(self.book_info) - self.scroll_area.setWidgetResizable(True) - self.book_info.show_book_info.connect(self.show_book_info.emit, - type=Qt.QueuedConnection) - self.book_info.files_dropped.connect(self.files_dropped.emit, - type=Qt.QueuedConnection) - self.addWidget(self.scroll_area, 100) - self.setMinimumHeight(120) - self.resized.connect(self.book_info.cover_display.relayout) - self.book_info.cover_display.relayout(self.size()) - - def resizeEvent(self, ev): - self.resized.emit(self.size()) - - def reset_info(self): - self.book_info.show_data({}) - - def show_data(self, data): - self.book_info.show_data(data) - diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index bc698a3502..daea4e86ea 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -10,10 +10,10 @@ Browsing book collection by tags. from itertools import izip from functools import partial -from PyQt4.Qt import Qt, QTreeView, QApplication, pyqtSignal, QCheckBox, \ +from PyQt4.Qt import Qt, QTreeView, QApplication, pyqtSignal, \ QFont, QSize, QIcon, QPoint, QVBoxLayout, QComboBox, \ QAbstractItemModel, QVariant, QModelIndex, QMenu, \ - QPushButton, QWidget + QPushButton, QWidget, QItemDelegate from calibre.gui2 import config, NONE from calibre.utils.config import prefs @@ -22,6 +22,39 @@ from calibre.utils.search_query_parser import saved_searches from calibre.gui2 import error_dialog from calibre.gui2.dialogs.tag_categories import TagCategories from calibre.gui2.dialogs.tag_list_editor import TagListEditor +from calibre.gui2.dialogs.edit_authors_dialog import EditAuthorsDialog + +class TagDelegate(QItemDelegate): # {{{ + + def paint(self, painter, option, index): + item = index.internalPointer() + if item.type != TagTreeItem.TAG: + QItemDelegate.paint(self, painter, option, index) + return + r = option.rect + model = self.parent().model() + icon = model.data(index, Qt.DecorationRole).toPyObject() + painter.save() + if item.tag.state != 0 or not config['show_avg_rating'] or \ + item.tag.avg_rating is None: + icon.paint(painter, r, Qt.AlignLeft) + else: + painter.setOpacity(0.3) + icon.paint(painter, r, Qt.AlignLeft) + painter.setOpacity(1) + rating = item.tag.avg_rating + painter.setClipRect(r.left(), r.bottom()-int(r.height()*(rating/5.0)), + r.width(), r.height()) + icon.paint(painter, r, Qt.AlignLeft) + painter.setClipRect(r) + + # Paint the text + r.setLeft(r.left()+r.height()+3) + painter.drawText(r, Qt.AlignLeft|Qt.AlignVCenter, + model.data(index, Qt.DisplayRole).toString()) + painter.restore() + + # }}} class TagsView(QTreeView): # {{{ @@ -30,6 +63,7 @@ class TagsView(QTreeView): # {{{ user_category_edit = pyqtSignal(object) tag_list_edit = pyqtSignal(object, object) saved_search_edit = pyqtSignal(object) + author_sort_edit = pyqtSignal(object, object) tag_item_renamed = pyqtSignal() search_item_renamed = pyqtSignal() @@ -43,13 +77,14 @@ class TagsView(QTreeView): # {{{ self.setAlternatingRowColors(True) self.setAnimated(True) self.setHeaderHidden(True) + self.setItemDelegate(TagDelegate(self)) - def set_database(self, db, tag_match, popularity): + def set_database(self, db, tag_match, sort_by): self.hidden_categories = config['tag_browser_hidden_categories'] self._model = TagsModel(db, parent=self, hidden_categories=self.hidden_categories, search_restriction=None) - self.popularity = popularity + self.sort_by = sort_by self.tag_match = tag_match self.db = db self.search_restriction = None @@ -57,8 +92,9 @@ class TagsView(QTreeView): # {{{ self.setContextMenuPolicy(Qt.CustomContextMenu) self.clicked.connect(self.toggle) self.customContextMenuRequested.connect(self.show_context_menu) - self.popularity.setChecked(config['sort_by_popularity']) - self.popularity.stateChanged.connect(self.sort_changed) + pop = config['sort_tags_by'] + self.sort_by.setCurrentIndex(self.db.CATEGORY_SORTS.index(pop)) + self.sort_by.currentIndexChanged.connect(self.sort_changed) self.refresh_required.connect(self.recount, type=Qt.QueuedConnection) db.add_listener(self.database_changed) @@ -69,8 +105,8 @@ class TagsView(QTreeView): # {{{ def match_all(self): return self.tag_match and self.tag_match.currentIndex() > 0 - def sort_changed(self, state): - config.set('sort_by_popularity', state == Qt.Checked) + def sort_changed(self, pop): + config.set('sort_tags_by', self.db.CATEGORY_SORTS[pop]) self.recount() def set_search_restriction(self, s): @@ -112,6 +148,9 @@ class TagsView(QTreeView): # {{{ if action == 'manage_searches': self.saved_search_edit.emit(category) return + if action == 'edit_author_sort': + self.author_sort_edit.emit(self, index) + return if action == 'hide': self.hidden_categories.add(category) elif action == 'show': @@ -132,6 +171,7 @@ class TagsView(QTreeView): # {{{ if item.type == TagTreeItem.TAG: tag_item = item tag_name = item.tag.name + tag_id = item.tag.id item = item.parent if item.type == TagTreeItem.CATEGORY: category = unicode(item.name.toString()) @@ -147,9 +187,13 @@ class TagsView(QTreeView): # {{{ (key in ['authors', 'tags', 'series', 'publisher', 'search'] or \ self.db.field_metadata[key]['is_custom'] and \ self.db.field_metadata[key]['datatype'] != 'rating'): - self.context_menu.addAction(_('Rename') + " '" + tag_name + "'", + self.context_menu.addAction(_('Rename \'%s\'')%tag_name, partial(self.context_menu_handler, action='edit_item', category=tag_item, index=index)) + if key == 'authors': + self.context_menu.addAction(_('Edit sort for \'%s\'')%tag_name, + partial(self.context_menu_handler, + action='edit_author_sort', index=tag_id)) self.context_menu.addSeparator() # Hide/Show/Restore categories self.context_menu.addAction(_('Hide category %s') % category, @@ -166,9 +210,12 @@ class TagsView(QTreeView): # {{{ self.context_menu.addSeparator() if key in ['tags', 'publisher', 'series'] or \ self.db.field_metadata[key]['is_custom']: - self.context_menu.addAction(_('Manage ') + category, + self.context_menu.addAction(_('Manage %s')%category, partial(self.context_menu_handler, action='open_editor', category=tag_name, key=key)) + elif key == 'authors': + self.context_menu.addAction(_('Manage %s')%category, + partial(self.context_menu_handler, action='edit_author_sort')) elif key == 'search': self.context_menu.addAction(_('Manage Saved Searches'), partial(self.context_menu_handler, action='manage_searches', @@ -332,6 +379,7 @@ class TagsModel(QAbstractItemModel): # {{{ ':custom' : QIcon(I('column.svg')), ':user' : QIcon(I('drawer.svg')), 'search' : QIcon(I('search.svg'))}) + self.categories_with_ratings = ['authors', 'series', 'publisher', 'tags'] self.icon_state_map = [None, QIcon(I('plus.svg')), QIcon(I('minus.svg'))] self.db = db @@ -341,7 +389,7 @@ class TagsModel(QAbstractItemModel): # {{{ self.row_map = [] # get_node_tree cannot return None here, because row_map is empty - data = self.get_node_tree(config['sort_by_popularity']) + data = self.get_node_tree(config['sort_tags_by']) self.root_item = TagTreeItem() for i, r in enumerate(self.row_map): if self.hidden_categories and self.categories[i] in self.hidden_categories: @@ -354,7 +402,14 @@ class TagsModel(QAbstractItemModel): # {{{ data=self.categories[i], category_icon=self.category_icon_map[r], tooltip=tt, category_key=r) + # This duplicates code in refresh(). Having it here as well + # can save seconds during startup, because we avoid a second + # call to get_node_tree. for tag in data[r]: + if r not in self.categories_with_ratings and \ + not self.db.field_metadata[r]['is_custom'] and \ + not self.db.field_metadata[r]['kind'] == 'user': + tag.avg_rating = None TagTreeItem(parent=c, data=tag, icon_map=self.icon_state_map) def set_search_restriction(self, s): @@ -378,11 +433,11 @@ class TagsModel(QAbstractItemModel): # {{{ # Now get the categories if self.search_restriction: - data = self.db.get_categories(sort_on_count=sort, + data = self.db.get_categories(sort=sort, icon_map=self.category_icon_map, ids=self.db.search('', return_matches=True)) else: - data = self.db.get_categories(sort_on_count=sort, icon_map=self.category_icon_map) + data = self.db.get_categories(sort=sort, icon_map=self.category_icon_map) tb_categories = self.db.field_metadata for category in tb_categories: @@ -396,7 +451,7 @@ class TagsModel(QAbstractItemModel): # {{{ return data def refresh(self): - data = self.get_node_tree(config['sort_by_popularity']) # get category data + data = self.get_node_tree(config['sort_tags_by']) # get category data if data is None: return False row_index = -1 @@ -417,6 +472,10 @@ class TagsModel(QAbstractItemModel): # {{{ if len(data[r]) > 0: self.beginInsertRows(category_index, 0, len(data[r])-1) for tag in data[r]: + if r not in self.categories_with_ratings and \ + not self.db.field_metadata[r]['is_custom'] and \ + not self.db.field_metadata[r]['kind'] == 'user': + tag.avg_rating = None tag.state = state_map.get(tag.name, 0) t = TagTreeItem(parent=category, data=tag, icon_map=self.icon_state_map) self.endInsertRows() @@ -601,12 +660,13 @@ class TagBrowserMixin(object): # {{{ def __init__(self, db): self.library_view.model().count_changed_signal.connect(self.tags_view.recount) self.tags_view.set_database(self.library_view.model().db, - self.tag_match, self.popularity) + self.tag_match, self.sort_by) self.tags_view.tags_marked.connect(self.search.search_from_tags) self.tags_view.tags_marked.connect(self.saved_search.clear_to_help) self.tags_view.tag_list_edit.connect(self.do_tags_list_edit) self.tags_view.user_category_edit.connect(self.do_user_categories_edit) self.tags_view.saved_search_edit.connect(self.do_saved_search_edit) + self.tags_view.author_sort_edit.connect(self.do_author_sort_edit) self.tags_view.tag_item_renamed.connect(self.do_tag_item_renamed) self.tags_view.search_item_renamed.connect(self.saved_search.clear_to_help) self.edit_categories.clicked.connect(lambda x: @@ -636,6 +696,19 @@ class TagBrowserMixin(object): # {{{ self.saved_search.clear_to_help() self.search.clear_to_help() + def do_author_sort_edit(self, parent, id): + db = self.library_view.model().db + editor = EditAuthorsDialog(parent, db, id) + d = editor.exec_() + if d: + for (id, old_author, new_author, new_sort) in editor.result: + if old_author != new_author: + # The id might change if the new author already exists + id = db.rename_author(id, new_author) + db.set_sort_field_for_author(id, unicode(new_sort)) + self.library_view.model().refresh() + self.tags_view.recount() + # }}} class TagBrowserWidget(QWidget): # {{{ @@ -648,9 +721,13 @@ class TagBrowserWidget(QWidget): # {{{ parent.tags_view = TagsView(parent) self._layout.addWidget(parent.tags_view) - parent.popularity = QCheckBox(parent) - parent.popularity.setText(_('Sort by &popularity')) - self._layout.addWidget(parent.popularity) + parent.sort_by = QComboBox(parent) + # Must be in the same order as db2.CATEGORY_SORTS + for x in (_('Sort by name'), _('Sort by popularity'), + _('Sort by average rating')): + parent.sort_by.addItem(x) + parent.sort_by.setCurrentIndex(0) + self._layout.addWidget(parent.sort_by) parent.tag_match = QComboBox(parent) for x in (_('Match any'), _('Match all')): diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 5824171213..6452890883 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -9,58 +9,44 @@ __docformat__ = 'restructuredtext en' '''The main GUI''' -import collections, datetime, os, shutil, sys, textwrap, time -from xml.parsers.expat import ExpatError +import collections, os, sys, textwrap, time from Queue import Queue, Empty from threading import Thread -from functools import partial from PyQt4.Qt import Qt, SIGNAL, QObject, QUrl, QTimer, \ - QModelIndex, QPixmap, QColor, QPainter, QMenu, QIcon, \ + QPixmap, QMenu, QIcon, pyqtSignal, \ QDialog, QDesktopServices, \ QSystemTrayIcon, QApplication, QKeySequence, QAction, \ - QMessageBox, QHelpEvent, QInputDialog,\ - QThread, pyqtSignal -from PyQt4.QtSvg import QSvgRenderer + QMessageBox, QHelpEvent -from calibre import prints, patheq, strftime -from calibre.constants import __version__, __appname__, isfrozen, islinux, \ - iswindows, isosx, filesystem_encoding, preferred_encoding -from calibre.utils.filenames import ascii_filename +from calibre import prints, patheq +from calibre.constants import __version__, __appname__, isosx from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config import prefs, dynamic from calibre.utils.ipc.server import Server -from calibre.devices.errors import UserFeedback -from calibre.gui2 import warning_dialog, choose_files, error_dialog, \ - question_dialog,\ - pixmap_to_data, choose_dir, \ - Dispatcher, gprefs, \ - max_available_height, config, info_dialog, \ - GetMetadata +from calibre.gui2 import error_dialog, GetMetadata, \ + gprefs, max_available_height, config, info_dialog from calibre.gui2.cover_flow import CoverFlowMixin -from calibre.gui2.widgets import ProgressIndicator, IMAGE_EXTENSIONS +from calibre.gui2.widgets import ProgressIndicator from calibre.gui2.wizard import move_library from calibre.gui2.dialogs.scheduler import Scheduler -from calibre.gui2.update import CheckForUpdates +from calibre.gui2.update import UpdateMixin from calibre.gui2.main_window import MainWindow from calibre.gui2.main_ui import Ui_MainWindow -from calibre.gui2.device import DeviceManager, DeviceMenu, DeviceMixin, Emailer +from calibre.gui2.device import DeviceMixin from calibre.gui2.jobs import JobManager, JobsDialog, JobsButton -from calibre.gui2.dialogs.metadata_single import MetadataSingleDialog -from calibre.gui2.dialogs.metadata_bulk import MetadataBulkDialog -from calibre.gui2.tools import convert_single_ebook, convert_bulk_ebook, \ - fetch_scheduled_recipe, generate_catalog from calibre.gui2.dialogs.config import ConfigDialog -from calibre.gui2.dialogs.choose_format import ChooseFormatDialog + from calibre.gui2.dialogs.book_info import BookInfo -from calibre.ebooks import BOOK_EXTENSIONS -from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag, NavigableString from calibre.library.database2 import LibraryDatabase2 from calibre.library.caches import CoverCache -from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.init import ToolbarMixin, LibraryViewMixin, LayoutMixin from calibre.gui2.search_box import SearchBoxMixin, SavedSearchBoxMixin from calibre.gui2.search_restriction_mixin import SearchRestrictionMixin from calibre.gui2.tag_view import TagBrowserMixin +from calibre.gui2.actions import AnnotationsAction, AddAction, DeleteAction, \ + EditMetadataAction, SaveToDiskAction, GenerateCatalogAction, FetchNewsAction, \ + ConvertAction, ViewAction + class Listener(Thread): # {{{ @@ -91,35 +77,29 @@ class Listener(Thread): # {{{ class SystemTrayIcon(QSystemTrayIcon): # {{{ + tooltip_requested = pyqtSignal(object) + def __init__(self, icon, parent): QSystemTrayIcon.__init__(self, icon, parent) def event(self, ev): if ev.type() == ev.ToolTip: evh = QHelpEvent(ev) - self.emit(SIGNAL('tooltip_requested(PyQt_PyObject)'), + self.tooltip_requested.emit( (self, evh.globalPos())) return True return QSystemTrayIcon.event(self, ev) # }}} -class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, +class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ TagBrowserMixin, CoverFlowMixin, LibraryViewMixin, SearchBoxMixin, - SavedSearchBoxMixin, SearchRestrictionMixin, LayoutMixin): + SavedSearchBoxMixin, SearchRestrictionMixin, LayoutMixin, UpdateMixin, + AnnotationsAction, AddAction, DeleteAction, + EditMetadataAction, SaveToDiskAction, GenerateCatalogAction, FetchNewsAction, + ConvertAction, ViewAction): 'The main GUI' - def set_default_thumbnail(self, height): - r = QSvgRenderer(I('book.svg')) - pixmap = QPixmap(height, height) - pixmap.fill(QColor(255,255,255)) - p = QPainter(pixmap) - r.render(p) - p.end() - self.default_thumbnail = (pixmap.width(), pixmap.height(), - pixmap_to_data(pixmap)) - - self.last_time = datetime.datetime.now() def __init__(self, opts, parent=None): MainWindow.__init__(self, opts, parent) @@ -127,7 +107,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, def initialize(self, library_path, db, listener, actions): opts = self.opts - self.last_time = datetime.datetime.now() self.preferences_action, self.quit_action = actions self.library_path = library_path self.spare_servers = [] @@ -147,11 +126,12 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # Jobs Button {{{ self.job_manager = JobManager() self.jobs_dialog = JobsDialog(self, self.job_manager) - self.jobs_button = JobsButton() + self.jobs_button = JobsButton(horizontal=True) self.jobs_button.initialize(self.jobs_dialog, self.job_manager) # }}} LayoutMixin.__init__(self) + DeviceMixin.__init__(self) self.restriction_count_of_books_in_view = 0 self.restriction_count_of_books_in_library = 0 @@ -160,25 +140,18 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, self.progress_indicator = ProgressIndicator(self) self.verbose = opts.verbose self.get_metadata = GetMetadata() - self.emailer = Emailer() - self.emailer.start() self.upload_memory = {} self.delete_memory = {} self.conversion_jobs = {} self.persistent_files = [] self.metadata_dialogs = [] self.default_thumbnail = None - self.device_error_dialog = error_dialog(self, _('Error'), - _('Error communicating with device'), ' ') - self.device_error_dialog.setModal(Qt.NonModal) self.tb_wrapper = textwrap.TextWrapper(width=40) - self.device_connected = None self.viewers = collections.deque() self.content_server = None self.system_tray_icon = SystemTrayIcon(QIcon(I('library.png')), self) self.system_tray_icon.setToolTip('calibre') - self.connect(self.system_tray_icon, - SIGNAL('tooltip_requested(PyQt_PyObject)'), + self.system_tray_icon.tooltip_requested.connect( self.job_manager.show_tooltip) if not config['systray_icon']: self.system_tray_icon.hide() @@ -216,17 +189,10 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, SIGNAL('activated(QSystemTrayIcon::ActivationReason)'), self.system_tray_icon_activated) - DeviceMixin.__init__(self) ####################### Start spare job server ######################## QTimer.singleShot(1000, self.add_spare_server) - ####################### Setup device detection ######################## - self.device_manager = DeviceManager(Dispatcher(self.device_detected), - self.job_manager, Dispatcher(self.status_bar.show_message)) - self.device_manager.start() - - ####################### Location View ######################## QObject.connect(self.location_view, SIGNAL('location_selected(PyQt_PyObject)'), @@ -248,16 +214,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, self.latest_version = ' ' self.vanity.setText(self.vanity_template%dict(version=' ', device=' ')) self.device_info = ' ' - if not opts.no_update_check: - self.update_checker = CheckForUpdates(self) - self.update_checker.update_found.connect(self.update_found, - type=Qt.QueuedConnection) - self.update_checker.start() - - ####################### Status Bar ##################### - self.status_bar.initialize(self.system_tray_icon) - self.book_details.show_book_info.connect(self.show_book_info) - self.book_details.files_dropped.connect(self.files_dropped_on_book) + UpdateMixin.__init__(self, opts) ####################### Setup Toolbar ##################### ToolbarMixin.__init__(self) @@ -332,8 +289,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, self.location_view.setCurrentIndex(self.location_view.model().index(0)) - self._add_filesystem_book = Dispatcher(self.__add_filesystem_book) self.keyboard_interrupt.connect(self.quit, type=Qt.QueuedConnection) + AddAction.__init__(self) self.read_settings() self.finalize_layout() @@ -342,39 +299,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, MainWindow.resizeEvent(self, ev) self.search.setMaximumWidth(self.width()-150) - 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) - - def disconnect_from_folder(self): - self.device_manager.disconnect_folder() - - def _sync_action_triggered(self, *args): - m = getattr(self, '_sync_menu', None) - if m is not None: - m.trigger_default() - - def create_device_menu(self): - self._sync_menu = DeviceMenu(self) - self.action_sync.setMenu(self._sync_menu) - self.connect(self._sync_menu, - SIGNAL('sync(PyQt_PyObject, PyQt_PyObject, PyQt_PyObject)'), - 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) - 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) - else: - self._sync_menu.connect_to_folder_action.setEnabled(True) - self._sync_menu.disconnect_from_folder_action.setEnabled(False) - def add_spare_server(self, *args): self.spare_servers.append(Server(limit=int(config['worker_limit']/2.0))) @@ -457,1307 +381,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, def booklists(self): return self.memory_view.model().db, self.card_a_view.model().db, self.card_b_view.model().db - ########################## Connect to device ############################## - - def save_device_view_settings(self): - model = self.location_view.model() - return - #self.memory_view.write_settings() - for x in range(model.rowCount()): - if x > 1: - if model.location_for_row(x) == 'carda': - self.card_a_view.write_settings() - elif model.location_for_row(x) == 'cardb': - self.card_b_view.write_settings() - - def device_detected(self, connected, is_folder_device): - ''' - Called when a device is connected to the computer. - ''' - 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.device_manager.get_device_information(\ - Dispatcher(self.info_read)) - self.set_default_thumbnail(\ - self.device_manager.device.THUMBNAIL_HEIGHT) - 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._sync_menu.enable_device_actions(True, - self.device_manager.device.card_prefix(), - self.device_manager.device) - self.location_view.model().device_connected(self.device_manager.device) - self.eject_action.setEnabled(True) - self.refresh_ondevice_info (device_connected = True, reset_only = True) - else: - self._sync_menu.connect_to_folder_action.setEnabled(True) - self._sync_menu.disconnect_from_folder_action.setEnabled(False) - self.save_device_view_settings() - self.device_connected = None - self._sync_menu.enable_device_actions(False) - 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)) - self.eject_action.setEnabled(False) - self.refresh_ondevice_info (device_connected = False) - - def info_read(self, job): - ''' - Called once device information has been read. - ''' - if job.failed: - 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.device_manager.books(Dispatcher(self.metadata_downloaded)) - - def metadata_downloaded(self, job): - ''' - Called once metadata has been read for all books on the device. - ''' - if job.failed: - if isinstance(job.exception, ExpatError): - error_dialog(self, _('Device database corrupted'), - _(''' -

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

    -
  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. -
  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. -
- ''')%dict(app=__appname__)).exec_() - else: - self.device_job_exception(job) - return - self.set_books_in_library(job.result, reset=True) - mainlist, cardalist, cardblist = job.result - self.memory_view.set_database(mainlist) - self.memory_view.set_editable(self.device_manager.device.CAN_SET_METADATA) - self.card_a_view.set_database(cardalist) - self.card_a_view.set_editable(self.device_manager.device.CAN_SET_METADATA) - self.card_b_view.set_database(cardblist) - self.card_b_view.set_editable(self.device_manager.device.CAN_SET_METADATA) - self.sync_news() - self.sync_catalogs() - self.refresh_ondevice_info(device_connected = True) - - ############################################################################ - ### Force the library view to refresh, taking into consideration books information - def refresh_ondevice_info(self, device_connected, reset_only = False): - self.book_on_device(None, reset=True) - if reset_only: - return - self.library_view.set_device_connected(device_connected) - ############################################################################ - - ######################### Fetch annotations ################################ - - def fetch_annotations(self, *args): - # Generate a path_map from selected ids - def get_ids_from_selected_rows(): - rows = self.library_view.selectionModel().selectedRows() - if not rows or len(rows) < 2: - rows = xrange(self.library_view.model().rowCount(QModelIndex())) - ids = map(self.library_view.model().id, rows) - return ids - - def get_formats(id): - formats = db.formats(id, index_is_id=True) - fmts = [] - if formats: - for format in formats.split(','): - fmts.append(format.lower()) - return fmts - - def generate_annotation_paths(ids, db, device): - # Generate path templates - # Individual storage mount points scanned/resolved in driver.get_annotations() - path_map = {} - for id in ids: - mi = db.get_metadata(id, index_is_id=True) - a_path = device.create_upload_path(os.path.abspath('/'), mi, 'x.bookmark', create_dirs=False) - path_map[id] = dict(path=a_path, fmts=get_formats(id)) - return path_map - - device = self.device_manager.device - - if self.current_view() is not self.library_view: - return error_dialog(self, _('Use library only'), - _('User annotations generated from main library only'), - show=True) - db = self.library_view.model().db - - # Get the list of ids - ids = get_ids_from_selected_rows() - if not ids: - return error_dialog(self, _('No books selected'), - _('No books selected to fetch annotations from'), - show=True) - - # Map ids to paths - path_map = generate_annotation_paths(ids, db, device) - - # Dispatch to devices.kindle.driver.get_annotations() - self.device_manager.annotations(Dispatcher(self.annotations_fetched), - path_map) - - def annotations_fetched(self, job): - from calibre.devices.usbms.device import Device - from calibre.ebooks.metadata import MetaInformation - from calibre.gui2.dialogs.progress import ProgressDialog - from calibre.library.cli import do_add_format - - class Updater(QThread): - - update_progress = pyqtSignal(int) - update_done = pyqtSignal() - FINISHED_READING_PCT_THRESHOLD = 96 - - def __init__(self, parent, db, annotation_map, done_callback): - QThread.__init__(self, parent) - self.db = db - self.pd = ProgressDialog(_('Merging user annotations into database'), '', - 0, len(job.result), parent=parent) - - self.am = annotation_map - self.done_callback = done_callback - self.connect(self.pd, SIGNAL('canceled()'), self.canceled) - self.pd.setModal(True) - self.pd.show() - self.update_progress.connect(self.pd.set_value, - type=Qt.QueuedConnection) - self.update_done.connect(self.pd.hide, type=Qt.QueuedConnection) - - def generate_annotation_html(self, bookmark): - # Returns
...
- last_read_location = bookmark.last_read_location - timestamp = datetime.datetime.utcfromtimestamp(bookmark.timestamp) - percent_read = bookmark.percent_read - - ka_soup = BeautifulSoup() - dtc = 0 - divTag = Tag(ka_soup,'div') - divTag['class'] = 'user_annotations' - - # Add the last-read location - spanTag = Tag(ka_soup, 'span') - spanTag['style'] = 'font-weight:bold' - if bookmark.book_format == 'pdf': - spanTag.insert(0,NavigableString( - _("%s
Last Page Read: %d (%d%%)") % \ - (strftime(u'%x', timestamp.timetuple()), - last_read_location, - percent_read))) - else: - spanTag.insert(0,NavigableString( - _("%s
Last Page Read: Location %d (%d%%)") % \ - (strftime(u'%x', timestamp.timetuple()), - last_read_location, - percent_read))) - - divTag.insert(dtc, spanTag) - dtc += 1 - divTag.insert(dtc, Tag(ka_soup,'br')) - dtc += 1 - - if bookmark.user_notes: - user_notes = bookmark.user_notes - annotations = [] - - # Add the annotations sorted by location - # Italicize highlighted text - for location in sorted(user_notes): - if user_notes[location]['text']: - annotations.append( - _('Location %d • %s
%s
') % \ - (user_notes[location]['displayed_location'], - user_notes[location]['type'], - user_notes[location]['text'] if \ - user_notes[location]['type'] == 'Note' else \ - '%s' % user_notes[location]['text'])) - else: - if bookmark.book_format == 'pdf': - annotations.append( - _('Page %d • %s
') % \ - (user_notes[location]['displayed_location'], - user_notes[location]['type'])) - else: - annotations.append( - _('Location %d • %s
') % \ - (user_notes[location]['displayed_location'], - user_notes[location]['type'])) - - for annotation in annotations: - divTag.insert(dtc, annotation) - dtc += 1 - - ka_soup.insert(0,divTag) - return ka_soup - - 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) - - def canceled(self): - self.pd.hide() - - def run(self): - ignore_tags = set(['Catalog','Clippings']) - for (i, id) in enumerate(self.am): - bm = Device.UserAnnotation(self.am[id][0],self.am[id][1]) - if bm.type == 'kindle_bookmark': - mi = self.db.get_metadata(id, index_is_id=True) - user_notes_soup = self.generate_annotation_html(bm.value) - if mi.comments: - a_offset = mi.comments.find('
') - ad_offset = mi.comments.find('
') - - if a_offset >= 0: - mi.comments = mi.comments[:a_offset] - if ad_offset >= 0: - mi.comments = mi.comments[:ad_offset] - if set(mi.tags).intersection(ignore_tags): - continue - if mi.comments: - hrTag = Tag(user_notes_soup,'hr') - hrTag['class'] = 'annotations_divider' - user_notes_soup.insert(0,hrTag) - - mi.comments += user_notes_soup.prettify() - else: - mi.comments = unicode(user_notes_soup.prettify()) - # Update library comments - self.db.set_comment(id, mi.comments) - - # Update 'read' tag except for Catalogs/Clippings - if bm.value.percent_read >= self.FINISHED_READING_PCT_THRESHOLD: - if not set(mi.tags).intersection(ignore_tags): - self.mark_book_as_read(id) - - # Add bookmark file to id - self.db.add_format_with_hooks(id, bm.value.bookmark_extension, - bm.value.path, index_is_id=True) - self.update_progress.emit(i) - elif bm.type == 'kindle_clippings': - # Find 'My Clippings' author=Kindle in database, or add - last_update = 'Last modified %s' % strftime(u'%x %X',bm.value['timestamp'].timetuple()) - mc_id = list(db.data.parse('title:"My Clippings"')) - if mc_id: - do_add_format(self.db, mc_id[0], 'TXT', bm.value['path']) - mi = self.db.get_metadata(mc_id[0], index_is_id=True) - mi.comments = last_update - self.db.set_metadata(mc_id[0], mi) - else: - mi = MetaInformation('My Clippings', authors = ['Kindle']) - mi.tags = ['Clippings'] - mi.comments = last_update - self.db.add_books([bm.value['path']], ['txt'], [mi]) - - self.update_done.emit() - self.done_callback(self.am.keys()) - - if not job.result: return - - if self.current_view() is not self.library_view: - return error_dialog(self, _('Use library only'), - _('User annotations generated from main library only'), - show=True) - db = self.library_view.model().db - - self.__annotation_updater = Updater(self, db, job.result, - Dispatcher(self.library_view.model().refresh_ids)) - self.__annotation_updater.start() - - - ############################################################################ - - ################################# Add books ################################ - - def add_recursive(self, single): - root = choose_dir(self, 'recursive book import root dir dialog', - 'Select root folder') - if not root: - return - from calibre.gui2.add import Adder - self._adder = Adder(self, - self.library_view.model().db, - Dispatcher(self._files_added), spare_server=self.spare_server) - self._adder.add_recursive(root, single) - - def add_recursive_single(self, *args): - ''' - Add books from the local filesystem to either the library or the device - recursively assuming one book per folder. - ''' - self.add_recursive(True) - - def add_recursive_multiple(self, *args): - ''' - Add books from the local filesystem to either the library or the device - recursively assuming multiple books per folder. - ''' - self.add_recursive(False) - - def add_empty(self, *args): - ''' - Add an empty book item to the library. This does not import any formats - from a book file. - ''' - num, ok = QInputDialog.getInt(self, _('How many empty books?'), - _('How many empty books should be added?'), 1, 1, 100) - if ok: - from calibre.ebooks.metadata import MetaInformation - for x in xrange(num): - self.library_view.model().db.import_book(MetaInformation(None), []) - self.library_view.model().books_added(num) - - def files_dropped(self, paths): - to_device = self.stack.currentIndex() != 0 - self._add_books(paths, to_device) - - def files_dropped_on_book(self, event, paths): - accept = False - if self.current_view() is not self.library_view: - return - db = self.library_view.model().db - current_idx = self.library_view.currentIndex() - if not current_idx.isValid(): return - cid = db.id(current_idx.row()) - for path in paths: - ext = os.path.splitext(path)[1].lower() - if ext: - ext = ext[1:] - if ext in IMAGE_EXTENSIONS: - pmap = QPixmap() - pmap.load(path) - if not pmap.isNull(): - accept = True - db.set_cover(cid, pmap) - elif ext in BOOK_EXTENSIONS: - db.add_format_with_hooks(cid, ext, path, index_is_id=True) - 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): - if isinstance(paths, basestring): - paths = [paths] - books = [path for path in map(os.path.abspath, paths) if os.access(path, - os.R_OK)] - - if books: - to_device = allow_device and self.stack.currentIndex() != 0 - self._add_books(books, to_device) - if to_device: - self.status_bar.show_message(\ - _('Uploading books to device.'), 2000) - - - def add_filesystem_book(self, paths, allow_device=True): - self._add_filesystem_book(paths, allow_device=allow_device) - - def add_books(self, *args): - ''' - Add books from the local filesystem to either the library or the device. - ''' - filters = [ - (_('Books'), BOOK_EXTENSIONS), - (_('EPUB Books'), ['epub']), - (_('LRF Books'), ['lrf']), - (_('HTML Books'), ['htm', 'html', 'xhtm', 'xhtml']), - (_('LIT Books'), ['lit']), - (_('MOBI Books'), ['mobi', 'prc', 'azw']), - (_('Topaz books'), ['tpz','azw1']), - (_('Text books'), ['txt', 'rtf']), - (_('PDF Books'), ['pdf']), - (_('Comics'), ['cbz', 'cbr', 'cbc']), - (_('Archives'), ['zip', 'rar']), - ] - to_device = self.stack.currentIndex() != 0 - if to_device: - filters = [(_('Supported books'), self.device_manager.device.FORMATS)] - - books = choose_files(self, 'add books dialog dir', 'Select books', - filters=filters) - if not books: - return - self._add_books(books, to_device) - - def _add_books(self, paths, to_device, on_card=None): - if on_card is None: - on_card = 'carda' if self.stack.currentIndex() == 2 else 'cardb' if self.stack.currentIndex() == 3 else None - if not paths: - return - from calibre.gui2.add import Adder - self.__adder_func = partial(self._files_added, on_card=on_card) - self._adder = Adder(self, - None if to_device else self.library_view.model().db, - Dispatcher(self.__adder_func), spare_server=self.spare_server) - self._adder.add(paths) - - def _files_added(self, paths=[], names=[], infos=[], on_card=None): - if paths: - self.upload_books(paths, - list(map(ascii_filename, names)), - infos, on_card=on_card) - self.status_bar.show_message( - _('Uploading books to device.'), 2000) - if getattr(self._adder, 'number_of_books_added', 0) > 0: - self.library_view.model().books_added(self._adder.number_of_books_added) - if hasattr(self, 'db_images'): - self.db_images.reset() - if getattr(self._adder, 'merged_books', False): - books = u'\n'.join([x if isinstance(x, unicode) else - x.decode(preferred_encoding, 'replace') for x in - self._adder.merged_books]) - info_dialog(self, _('Merged some books'), - _('Some duplicates were found and merged into the ' - 'following existing books:'), det_msg=books, show=True) - if getattr(self._adder, 'critical', None): - det_msg = [] - for name, log in self._adder.critical.items(): - if isinstance(name, str): - name = name.decode(filesystem_encoding, 'replace') - det_msg.append(name+'\n'+log) - - warning_dialog(self, _('Failed to read metadata'), - _('Failed to read metadata from the following')+':', - det_msg='\n\n'.join(det_msg), show=True) - - if hasattr(self._adder, 'cleanup'): - self._adder.cleanup() - self._adder = None - - - ############################################################################ - - ############################### Delete books ############################### - - def _get_selected_formats(self, msg): - from calibre.gui2.dialogs.select_formats import SelectFormats - fmts = self.library_view.model().db.all_formats() - d = SelectFormats([x.lower() for x in fmts], msg, parent=self) - if d.exec_() != d.Accepted: - return None - return d.selected_formats - - def _get_selected_ids(self, err_title=_('Cannot delete')): - rows = self.library_view.selectionModel().selectedRows() - if not rows or len(rows) == 0: - d = error_dialog(self, err_title, _('No book selected')) - d.exec_() - return set([]) - return set(map(self.library_view.model().id, rows)) - - def delete_selected_formats(self, *args): - ids = self._get_selected_ids() - if not ids: - return - fmts = self._get_selected_formats( - _('Choose formats to be deleted')) - if not fmts: - return - for id in ids: - for fmt in fmts: - self.library_view.model().db.remove_format(id, fmt, - index_is_id=True, notify=False) - self.library_view.model().refresh_ids(ids) - self.library_view.model().current_changed(self.library_view.currentIndex(), - self.library_view.currentIndex()) - if ids: - self.tags_view.recount() - - def delete_all_but_selected_formats(self, *args): - ids = self._get_selected_ids() - if not ids: - return - fmts = self._get_selected_formats( - '

'+_('Choose formats not to be deleted')) - if fmts is None: - return - for id in ids: - bfmts = self.library_view.model().db.formats(id, index_is_id=True) - if bfmts is None: - continue - bfmts = set([x.lower() for x in bfmts.split(',')]) - rfmts = bfmts - set(fmts) - for fmt in rfmts: - self.library_view.model().db.remove_format(id, fmt, - index_is_id=True, notify=False) - self.library_view.model().refresh_ids(ids) - self.library_view.model().current_changed(self.library_view.currentIndex(), - self.library_view.currentIndex()) - if ids: - self.tags_view.recount() - - - def delete_covers(self, *args): - ids = self._get_selected_ids() - if not ids: - return - for id in ids: - self.library_view.model().db.remove_cover(id) - self.library_view.model().refresh_ids(ids) - self.library_view.model().current_changed(self.library_view.currentIndex(), - self.library_view.currentIndex()) - - def delete_books(self, *args): - ''' - Delete selected books from device or library. - ''' - view = self.current_view() - rows = view.selectionModel().selectedRows() - if not rows or len(rows) == 0: - return - if self.stack.currentIndex() == 0: - if not confirm('

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

', 'library_delete_books', self): - return - ci = view.currentIndex() - row = None - if ci.isValid(): - row = ci.row() - ids_deleted = view.model().delete_books(rows) - for v in (self.memory_view, self.card_a_view, self.card_b_view): - if v is None: - continue - v.model().clear_ondevice(ids_deleted) - if row is not None: - ci = view.model().index(row, 0) - if ci.isValid(): - view.setCurrentIndex(ci) - sm = view.selectionModel() - sm.select(ci, sm.Select) - else: - if not confirm('

'+_('The selected books will be ' - 'permanently deleted ' - 'from your device. Are you sure?') - +'

', 'device_delete_books', self): - return - if self.stack.currentIndex() == 1: - view = self.memory_view - elif self.stack.currentIndex() == 2: - view = self.card_a_view - else: - view = self.card_b_view - paths = view.model().paths(rows) - job = self.remove_paths(paths) - self.delete_memory[job] = (paths, view.model()) - view.model().mark_for_deletion(job, rows) - self.status_bar.show_message(_('Deleting books from device.'), 1000) - - def remove_paths(self, paths): - return self.device_manager.delete_books(\ - Dispatcher(self.books_deleted), paths) - - def books_deleted(self, job): - ''' - Called once deletion is done on the device - ''' - for view in (self.memory_view, self.card_a_view, self.card_b_view): - view.model().deletion_done(job, job.failed) - if job.failed: - self.device_job_exception(job) - return - - if self.delete_memory.has_key(job): - paths, model = self.delete_memory.pop(job) - self.device_manager.remove_books_from_metadata(paths, - self.booklists()) - model.paths_deleted(paths) - self.upload_booklists() - # Clear the ondevice info so it will be recomputed - self.book_on_device(None, None, reset=True) - # We want to reset all the ondevice flags in the library. Use a big - # hammer, so we don't need to worry about whether some succeeded or not - self.library_view.model().refresh() - - ############################################################################ - - ############################### Edit metadata ############################## - - def download_metadata(self, checked, covers=True, set_metadata=True, - set_social_metadata=None): - rows = self.library_view.selectionModel().selectedRows() - if not rows or len(rows) == 0: - d = error_dialog(self, _('Cannot download metadata'), - _('No books selected')) - d.exec_() - return - db = self.library_view.model().db - ids = [db.id(row.row()) for row in rows] - if set_social_metadata is None: - get_social_metadata = config['get_social_metadata'] - else: - get_social_metadata = set_social_metadata - from calibre.gui2.metadata import DownloadMetadata - self._download_book_metadata = DownloadMetadata(db, ids, - get_covers=covers, set_metadata=set_metadata, - get_social_metadata=get_social_metadata) - self._download_book_metadata.start() - if set_social_metadata is not None and set_social_metadata: - x = _('social metadata') - else: - x = _('covers') if covers and not set_metadata else _('metadata') - self.progress_indicator.start( - _('Downloading %s for %d book(s)')%(x, len(ids))) - self._book_metadata_download_check = QTimer(self) - self.connect(self._book_metadata_download_check, - SIGNAL('timeout()'), self.book_metadata_download_check, - Qt.QueuedConnection) - self._book_metadata_download_check.start(100) - - def book_metadata_download_check(self): - if self._download_book_metadata.is_alive(): - return - self._book_metadata_download_check.stop() - self.progress_indicator.stop() - cr = self.library_view.currentIndex().row() - x = self._download_book_metadata - self._download_book_metadata = None - if x.exception is None: - self.library_view.model().refresh_ids( - x.updated, cr) - if x.failures: - details = ['%s: %s'%(title, reason) for title, - reason in x.failures.values()] - details = '%s\n'%('\n'.join(details)) - warning_dialog(self, _('Failed to download some metadata'), - _('Failed to download metadata for the following:'), - det_msg=details).exec_() - else: - err = _('Failed to download metadata:') - error_dialog(self, _('Error'), err, det_msg=x.tb).exec_() - - - def edit_metadata(self, checked, bulk=None): - ''' - Edit metadata of selected books in library. - ''' - rows = self.library_view.selectionModel().selectedRows() - previous = self.library_view.currentIndex() - if not rows or len(rows) == 0: - d = error_dialog(self, _('Cannot edit metadata'), - _('No books selected')) - d.exec_() - return - - if bulk or (bulk is None and len(rows) > 1): - return self.edit_bulk_metadata(checked) - - def accepted(id): - self.library_view.model().refresh_ids([id]) - - for row in rows: - self._metadata_view_id = self.library_view.model().db.id(row.row()) - d = MetadataSingleDialog(self, row.row(), - self.library_view.model().db, - accepted_callback=accepted, - cancel_all=rows.index(row) < len(rows)-1) - self.connect(d, SIGNAL('view_format(PyQt_PyObject)'), - self.metadata_view_format) - d.exec_() - if d.cancel_all: - break - 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) - self.tags_view.recount() - - def edit_bulk_metadata(self, checked): - ''' - Edit metadata of selected books in library in bulk. - ''' - rows = [r.row() for r in \ - self.library_view.selectionModel().selectedRows()] - if not rows or len(rows) == 0: - d = error_dialog(self, _('Cannot edit metadata'), - _('No books selected')) - d.exec_() - return - if MetadataBulkDialog(self, rows, - self.library_view.model().db).changed: - self.library_view.model().resort(reset=False) - self.library_view.model().research() - self.tags_view.recount() - - ############################################################################ - - ############################### Merge books ############################## - def merge_books(self, safe_merge=False): - ''' - Merge selected books in library. - ''' - if self.stack.currentIndex() != 0: - return - rows = self.library_view.selectionModel().selectedRows() - if not rows or len(rows) == 0: - return error_dialog(self, _('Cannot merge books'), - _('No books selected'), show=True) - if len(rows) < 2: - return error_dialog(self, _('Cannot merge books'), - _('At least two books must be selected for merging'), - show=True) - dest_id, src_books, src_ids = self.books_to_merge(rows) - if safe_merge: - if not confirm('

'+_( - '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.') - +'

', 'merge_books_safe', self): - return - self.add_formats(dest_id, src_books) - self.merge_metadata(dest_id, src_ids) - else: - if not confirm('

'+_( - '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?') - +'

', 'merge_books', self): - return - if len(rows)>5: - if not confirm('

'+_('You are about to merge more than 5 books. ' - 'Are you sure you want to proceed?') - +'

', 'merge_too_many_books', self): - return - self.add_formats(dest_id, src_books) - self.merge_metadata(dest_id, src_ids) - self.delete_books_after_merge(src_ids) - # leave the selection highlight on first selected book - dest_row = rows[0].row() - for row in rows: - if row.row() < rows[0].row(): - dest_row -= 1 - ci = self.library_view.model().index(dest_row, 0) - if ci.isValid(): - self.library_view.setCurrentIndex(ci) - - def add_formats(self, dest_id, src_books, replace=False): - for src_book in src_books: - if src_book: - fmt = os.path.splitext(src_book)[-1].replace('.', '').upper() - with open(src_book, 'rb') as f: - self.library_view.model().db.add_format(dest_id, fmt, f, index_is_id=True, - notify=False, replace=replace) - - def books_to_merge(self, rows): - src_books = [] - src_ids = [] - m = self.library_view.model() - for i, row in enumerate(rows): - id_ = m.id(row) - if i == 0: - dest_id = id_ - else: - src_ids.append(id_) - dbfmts = m.db.formats(id_, index_is_id=True) - if dbfmts: - for fmt in dbfmts.split(','): - src_books.append(m.db.format_abspath(id_, fmt, - index_is_id=True)) - return [dest_id, src_books, src_ids] - - def delete_books_after_merge(self, ids_to_delete): - self.library_view.model().delete_books_by_id(ids_to_delete) - - def merge_metadata(self, dest_id, src_ids): - db = self.library_view.model().db - dest_mi = db.get_metadata(dest_id, index_is_id=True, get_cover=True) - orig_dest_comments = dest_mi.comments - for src_id in src_ids: - src_mi = db.get_metadata(src_id, index_is_id=True, get_cover=True) - if src_mi.comments and orig_dest_comments != src_mi.comments: - if not dest_mi.comments or len(dest_mi.comments) == 0: - dest_mi.comments = src_mi.comments - else: - dest_mi.comments = unicode(dest_mi.comments) + u'\n\n' + unicode(src_mi.comments) - if src_mi.title and src_mi.title and (not dest_mi.title or - dest_mi.title == _('Unknown')): - dest_mi.title = src_mi.title - if src_mi.title and (not dest_mi.authors or dest_mi.authors[0] == - _('Unknown')): - dest_mi.authors = src_mi.authors - dest_mi.author_sort = src_mi.author_sort - if src_mi.tags: - if not dest_mi.tags: - dest_mi.tags = src_mi.tags - else: - for tag in src_mi.tags: - dest_mi.tags.append(tag) - if src_mi.cover and not dest_mi.cover: - dest_mi.cover = src_mi.cover - if not dest_mi.publisher: - dest_mi.publisher = src_mi.publisher - if not dest_mi.rating: - dest_mi.rating = src_mi.rating - if not dest_mi.series: - dest_mi.series = src_mi.series - dest_mi.series_index = src_mi.series_index - db.set_metadata(dest_id, dest_mi, ignore_errors=False) - - ############################################################################ - - - ############################## Save to disk ################################ - def save_single_format_to_disk(self, checked): - self.save_to_disk(checked, False, prefs['output_format']) - - def save_specific_format_disk(self, fmt): - self.save_to_disk(False, False, fmt) - - def save_to_single_dir(self, checked): - self.save_to_disk(checked, True) - - def save_single_fmt_to_single_dir(self, *args): - self.save_to_disk(False, single_dir=True, - single_format=prefs['output_format']) - - def save_to_disk(self, checked, single_dir=False, single_format=None): - rows = self.current_view().selectionModel().selectedRows() - if not rows or len(rows) == 0: - return error_dialog(self, _('Cannot save to disk'), - _('No books selected'), show=True) - path = choose_dir(self, 'save to disk dialog', - _('Choose destination directory')) - if not path: - return - - if self.current_view() is self.library_view: - from calibre.gui2.add import Saver - from calibre.library.save_to_disk import config - opts = config().parse() - if single_format is not None: - opts.formats = single_format - # Special case for Kindle annotation files - if single_format.lower() in ['mbp','pdr','tan']: - opts.to_lowercase = False - opts.save_cover = False - opts.write_opf = False - opts.template = opts.send_template - if single_dir: - opts.template = opts.template.split('/')[-1].strip() - if not opts.template: - opts.template = '{title} - {authors}' - self._saver = Saver(self, self.library_view.model().db, - Dispatcher(self._books_saved), rows, path, opts, - spare_server=self.spare_server) - - else: - paths = self.current_view().model().paths(rows) - self.device_manager.save_books( - Dispatcher(self.books_saved), paths, path) - - - def _books_saved(self, path, failures, error): - self._saver = None - if error: - return error_dialog(self, _('Error while saving'), - _('There was an error while saving.'), - error, show=True) - if failures: - failures = [u'%s\n\t%s'% - (title, '\n\t'.join(err.splitlines())) for title, err in - failures] - - warning_dialog(self, _('Could not save some books'), - _('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)) - - def books_saved(self, job): - if job.failed: - return self.device_job_exception(job) - - ############################################################################ - - ############################### Generate catalog ########################### - - def generate_catalog(self): - rows = self.library_view.selectionModel().selectedRows() - if not rows or len(rows) < 2: - rows = xrange(self.library_view.model().rowCount(QModelIndex())) - ids = map(self.library_view.model().id, rows) - - dbspec = None - if not ids: - return error_dialog(self, _('No books selected'), - _('No books selected to generate catalog for'), - show=True) - - # Calling gui2.tools:generate_catalog() - ret = generate_catalog(self, dbspec, ids, self.device_manager.device) - if ret is None: - return - - func, args, desc, out, sync, title = ret - - fmt = os.path.splitext(out)[1][1:].upper() - job = self.job_manager.run_job( - Dispatcher(self.catalog_generated), func, args=args, - description=desc) - job.catalog_file_path = out - job.fmt = fmt - job.catalog_sync, job.catalog_title = sync, title - self.status_bar.show_message(_('Generating %s catalog...')%fmt) - - def catalog_generated(self, job): - if job.result: - # Search terms nulled catalog results - return error_dialog(self, _('No books found'), - _("No books to catalog\nCheck exclude tags"), - show=True) - if job.failed: - return self.job_exception(job) - id = self.library_view.model().add_catalog(job.catalog_file_path, job.catalog_title) - self.library_view.model().reset() - if job.catalog_sync: - sync = dynamic.get('catalogs_to_be_synced', set([])) - sync.add(id) - dynamic.set('catalogs_to_be_synced', sync) - self.status_bar.show_message(_('Catalog generated.'), 3000) - self.sync_catalogs() - if job.fmt not in ['EPUB','MOBI']: - export_dir = choose_dir(self, _('Export Catalog Directory'), - _('Select destination for %s.%s') % (job.catalog_title, job.fmt.lower())) - if export_dir: - destination = os.path.join(export_dir, '%s.%s' % (job.catalog_title, job.fmt.lower())) - shutil.copyfile(job.catalog_file_path, destination) - - ############################### Fetch news ################################# - - def download_scheduled_recipe(self, arg): - func, args, desc, fmt, temp_files = \ - fetch_scheduled_recipe(arg) - job = self.job_manager.run_job( - Dispatcher(self.scheduled_recipe_fetched), func, args=args, - description=desc) - self.conversion_jobs[job] = (temp_files, fmt, arg) - self.status_bar.show_message(_('Fetching news from ')+arg['title'], 2000) - - def scheduled_recipe_fetched(self, job): - temp_files, fmt, arg = self.conversion_jobs.pop(job) - pt = temp_files[0] - if job.failed: - self.scheduler.recipe_download_failed(arg) - return self.job_exception(job) - id = self.library_view.model().add_news(pt.name, arg) - self.library_view.model().reset() - sync = dynamic.get('news_to_be_synced', set([])) - sync.add(id) - dynamic.set('news_to_be_synced', sync) - self.scheduler.recipe_downloaded(arg) - self.status_bar.show_message(arg['title'] + _(' fetched.'), 3000) - self.email_news(id) - self.sync_news() - - ############################################################################ - - ############################### Convert #################################### - - def auto_convert(self, book_ids, on_card, format): - previous = self.library_view.currentIndex() - rows = [x.row() for x in \ - self.library_view.selectionModel().selectedRows()] - jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format) - if jobs == []: return - self.queue_convert_jobs(jobs, changed, bad, rows, previous, - self.book_auto_converted, extra_job_args=[on_card]) - - def auto_convert_mail(self, to, fmts, delete_from_library, book_ids, format): - previous = self.library_view.currentIndex() - rows = [x.row() for x in \ - self.library_view.selectionModel().selectedRows()] - jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format) - if jobs == []: return - self.queue_convert_jobs(jobs, changed, bad, rows, previous, - self.book_auto_converted_mail, - extra_job_args=[delete_from_library, to, fmts]) - - def auto_convert_news(self, book_ids, format): - previous = self.library_view.currentIndex() - rows = [x.row() for x in \ - self.library_view.selectionModel().selectedRows()] - jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format) - if jobs == []: return - self.queue_convert_jobs(jobs, changed, bad, rows, previous, - self.book_auto_converted_news) - - def auto_convert_catalogs(self, book_ids, format): - previous = self.library_view.currentIndex() - rows = [x.row() for x in \ - self.library_view.selectionModel().selectedRows()] - jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format) - if jobs == []: return - self.queue_convert_jobs(jobs, changed, bad, rows, previous, - self.book_auto_converted_catalogs) - - - - def get_books_for_conversion(self): - rows = [r.row() for r in \ - self.library_view.selectionModel().selectedRows()] - if not rows or len(rows) == 0: - d = error_dialog(self, _('Cannot convert'), - _('No books selected')) - d.exec_() - return None - return [self.library_view.model().db.id(r) for r in rows] - - def convert_ebook(self, checked, bulk=None): - book_ids = self.get_books_for_conversion() - if book_ids is None: return - previous = self.library_view.currentIndex() - rows = [x.row() for x in \ - self.library_view.selectionModel().selectedRows()] - num = 0 - if bulk or (bulk is None and len(book_ids) > 1): - self.__bulk_queue = convert_bulk_ebook(self, self.queue_convert_jobs, - self.library_view.model().db, book_ids, - out_format=prefs['output_format'], args=(rows, previous, - self.book_converted)) - if self.__bulk_queue is None: - return - num = len(self.__bulk_queue.book_ids) - else: - jobs, changed, bad = convert_single_ebook(self, - self.library_view.model().db, book_ids, out_format=prefs['output_format']) - self.queue_convert_jobs(jobs, changed, bad, rows, previous, - self.book_converted) - num = len(jobs) - - if num > 0: - self.status_bar.show_message(_('Starting conversion of %d book(s)') % - num, 2000) - - def queue_convert_jobs(self, jobs, changed, bad, rows, previous, - converted_func, extra_job_args=[]): - for func, args, desc, fmt, id, temp_files in jobs: - if id not in bad: - job = self.job_manager.run_job(Dispatcher(converted_func), - func, args=args, description=desc) - args = [temp_files, fmt, id]+extra_job_args - self.conversion_jobs[job] = tuple(args) - - if changed: - self.library_view.model().refresh_rows(rows) - current = self.library_view.currentIndex() - self.library_view.model().current_changed(current, previous) - - def book_auto_converted(self, job): - temp_files, fmt, book_id, on_card = self.conversion_jobs[job] - self.book_converted(job) - self.sync_to_device(on_card, False, specific_format=fmt, send_ids=[book_id], do_auto_convert=False) - - def book_auto_converted_mail(self, job): - temp_files, fmt, book_id, delete_from_library, to, fmts = self.conversion_jobs[job] - self.book_converted(job) - self.send_by_mail(to, fmts, delete_from_library, specific_format=fmt, send_ids=[book_id], do_auto_convert=False) - - def book_auto_converted_news(self, job): - temp_files, fmt, book_id = self.conversion_jobs[job] - self.book_converted(job) - self.sync_news(send_ids=[book_id], do_auto_convert=False) - - def book_auto_converted_catalogs(self, job): - temp_files, fmt, book_id = self.conversion_jobs[job] - self.book_converted(job) - self.sync_catalogs(send_ids=[book_id], do_auto_convert=False) - - def book_converted(self, job): - temp_files, fmt, book_id = self.conversion_jobs.pop(job)[:3] - try: - if job.failed: - self.job_exception(job) - return - data = open(temp_files[-1].name, 'rb') - self.library_view.model().db.add_format(book_id, \ - fmt, data, index_is_id=True) - data.close() - self.status_bar.show_message(job.description + \ - (' completed'), 2000) - finally: - for f in temp_files: - try: - if os.path.exists(f.name): - os.remove(f.name) - except: - pass - self.tags_view.recount() - if self.current_view() is self.library_view: - current = self.library_view.currentIndex() - self.library_view.model().current_changed(current, QModelIndex()) - - #############################View book###################################### - - def view_format(self, row, format): - fmt_path = self.library_view.model().db.format_abspath(row, format) - if fmt_path: - self._view_file(fmt_path) - - def metadata_view_format(self, fmt): - fmt_path = self.library_view.model().db.\ - format_abspath(self._metadata_view_id, - fmt, index_is_id=True) - if fmt_path: - self._view_file(fmt_path) - - - def book_downloaded_for_viewing(self, job): - if job.failed: - self.device_job_exception(job) - return - self._view_file(job.result) - - def _launch_viewer(self, name=None, viewer='ebook-viewer', internal=True): - self.setCursor(Qt.BusyCursor) - try: - if internal: - args = [viewer] - if isosx and 'ebook' in viewer: - args.append('--raise-window') - if name is not None: - args.append(name) - 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) - time.sleep(2) # User feedback - finally: - self.unsetCursor() - - def _view_file(self, name): - ext = os.path.splitext(name)[1].upper().replace('.', '') - viewer = 'lrfviewer' if ext == 'LRF' else 'ebook-viewer' - internal = ext in config['internally_viewed_formats'] - self._launch_viewer(name, viewer, internal) - - def view_specific_format(self, triggered): - rows = self.library_view.selectionModel().selectedRows() - if not rows or len(rows) == 0: - d = error_dialog(self, _('Cannot view'), _('No book selected')) - d.exec_() - return - - row = rows[0].row() - formats = self.library_view.model().db.formats(row).upper().split(',') - d = ChooseFormatDialog(self, _('Choose the format to view'), formats) - if d.exec_() == QDialog.Accepted: - format = d.format() - self.view_format(row, format) - - def _view_check(self, num, max_=3): - if num <= max_: - return True - return question_dialog(self, _('Multiple Books Selected'), - _('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?' - ) % num) - - def view_folder(self, *args): - rows = self.current_view().selectionModel().selectedRows() - if not rows or len(rows) == 0: - d = error_dialog(self, _('Cannot open folder'), - _('No book selected')) - d.exec_() - return - if not self._view_check(len(rows)): - return - for row in rows: - path = self.library_view.model().db.abspath(row.row()) - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) - - - def view_book(self, triggered): - rows = self.current_view().selectionModel().selectedRows() - self._view_books(rows) - - def view_specific_book(self, index): - self._view_books([index]) - - def _view_books(self, rows): - if not rows or len(rows) == 0: - self._launch_viewer() - return - - if not self._view_check(len(rows)): - return - - if self.current_view() is self.library_view: - for row in rows: - if hasattr(row, 'row'): - row = row.row() - - formats = self.library_view.model().db.formats(row) - title = self.library_view.model().db.title(row) - if not formats: - error_dialog(self, _('Cannot view'), - _('%s has no available formats.')%(title,), show=True) - continue - - formats = formats.upper().split(',') - - - in_prefs = False - for format in prefs['input_format_order']: - if format in formats: - in_prefs = True - self.view_format(row, format) - break - if not in_prefs: - self.view_format(row, formats[0]) - else: - paths = self.current_view().model().paths(rows) - for path in paths: - pt = PersistentTemporaryFile('_viewer_'+\ - os.path.splitext(path)[1]) - self.persistent_files.append(pt) - pt.close() - self.device_manager.view_book(\ - Dispatcher(self.book_downloaded_for_viewing), - path, pt.name) - - - ############################################################################ - - ############################################################################ - - ############################### Do config ################################## def do_config(self, *args): if self.job_manager.has_jobs(): @@ -1787,6 +410,8 @@ 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') if not patheq(self.library_path, d.database_location): newloc = d.database_location @@ -1800,7 +425,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, self.book_on_device(None, reset=True) db.set_book_on_device_func(self.book_on_device) self.library_view.set_database(db) - self.tags_view.set_database(db, self.tag_match, self.popularity) + self.tags_view.set_database(db, self.tag_match, self.sort_by) self.library_view.model().set_book_on_device_func(self.book_on_device) self.status_bar.clear_message() self.search.clear_to_help() @@ -1808,10 +433,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, self.library_view.model().count_changed() prefs['library_path'] = self.library_path - ############################################################################ - - ################################ Book info ################################# - def show_book_info(self, *args): if self.current_view() is not self.library_view: error_dialog(self, _('No detailed info available'), @@ -1822,9 +443,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, if index.isValid(): BookInfo(self, self.library_view, index).show() - ############################################################################ - - ############################################################################ def location_selected(self, location): ''' Called when a location icon is clicked (e.g. Library) @@ -1858,35 +476,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, self.set_number_of_books_shown() - def device_job_exception(self, job): - ''' - Handle exceptions in threaded device jobs. - ''' - if isinstance(getattr(job, 'exception', None), UserFeedback): - ex = job.exception - func = {UserFeedback.ERROR:error_dialog, - UserFeedback.WARNING:warning_dialog, - UserFeedback.INFO:info_dialog}[ex.level] - return func(self, _('Failed'), ex.msg, det_msg=ex.details if - ex.details else '', show=True) - - try: - if 'Could not read 32 bytes on the control bus.' in \ - unicode(job.details): - error_dialog(self, _('Error talking to device'), - _('There was a temporary error talking to the ' - 'device. Please unplug and reconnect the device ' - 'and or reboot.')).show() - return - except: - pass - try: - prints(job.details, file=sys.stderr) - except: - pass - if not self.device_error_dialog.isVisible(): - self.device_error_dialog.setDetailedText(job.details) - self.device_error_dialog.show() def job_exception(self, job): if not hasattr(self, '_modeless_dialogs'): @@ -2066,26 +655,5 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, else: e.ignore() - 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() - if config.get('new_version_notification') and \ - dynamic.get('update to version %s'%version, True): - if question_dialog(self, _('Update available'), - _('%s has been updated to version %s. ' - 'See the new features. Visit the download pa' - 'ge?')%(__appname__, version)): - url = 'http://calibre-ebook.com/download_'+\ - ('windows' if iswindows else 'osx' if isosx else 'linux') - QDesktopServices.openUrl(QUrl(url)) - dynamic.set('update to version %s'%version, False) - - + # }}} diff --git a/src/calibre/gui2/update.py b/src/calibre/gui2/update.py index 92e9db1cf2..9dcd4d9084 100644 --- a/src/calibre/gui2/update.py +++ b/src/calibre/gui2/update.py @@ -3,12 +3,13 @@ __copyright__ = '2008, Kovid Goyal ' import traceback -from PyQt4.QtCore import QThread, pyqtSignal +from PyQt4.Qt import QThread, pyqtSignal, QDesktopServices, QUrl, Qt import mechanize -from calibre.constants import __version__, iswindows, isosx +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 URL = 'http://status.calibre-ebook.com/latest' @@ -36,3 +37,35 @@ class CheckForUpdates(QThread): traceback.print_exc() self.sleep(self.INTERVAL) +class UpdateMixin(object): + + def __init__(self, opts): + if not opts.no_update_check: + self.update_checker = CheckForUpdates(self) + self.update_checker.update_found.connect(self.update_found, + type=Qt.QueuedConnection) + self.update_checker.start() + + 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() + if config.get('new_version_notification') and \ + dynamic.get('update to version %s'%version, True): + if question_dialog(self, _('Update available'), + _('%s has been updated to version %s. ' + 'See the new features. Visit the download pa' + 'ge?')%(__appname__, version)): + url = 'http://calibre-ebook.com/download_'+\ + ('windows' if iswindows else 'osx' if isosx else 'linux') + QDesktopServices.openUrl(QUrl(url)) + dynamic.set('update to version %s'%version, False) + + + diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index 52bd8eda9a..c32b79fb7c 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -1110,6 +1110,8 @@ class Splitter(QSplitter): def show_side_pane(self): if self.count() < 2 or not self.is_side_index_hidden: return + if self.desired_side_size == 0: + self.desired_side_size = self.initial_side_size self.apply_state((True, self.desired_side_size)) def hide_side_pane(self): diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index bb6001794a..57f9d0baaf 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -10,14 +10,14 @@ import collections, glob, os, re, itertools, functools from itertools import repeat from datetime import timedelta -from PyQt4.QtCore import QThread, QReadWriteLock -from PyQt4.QtGui import QImage +from PyQt4.Qt import QThread, QReadWriteLock, QImage, Qt from calibre.utils.config import tweaks from calibre.utils.date import parse_date, now, UNDEFINED_DATE from calibre.utils.search_query_parser import SearchQueryParser from calibre.utils.pyparsing import ParseException from calibre.ebooks.metadata import title_sort +from calibre import fit_image class CoverCache(QThread): @@ -96,6 +96,11 @@ class CoverCache(QThread): 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() diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index 23b78f38ae..cc690c54db 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -461,14 +461,29 @@ class CustomColumns(object): CREATE VIEW tag_browser_{table} AS SELECT id, value, - (SELECT COUNT(id) FROM {lt} WHERE value={table}.id) count + (SELECT COUNT(id) FROM {lt} WHERE value={table}.id) count, + (SELECT AVG(r.rating) + FROM {lt}, + 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, + value AS sort FROM {table}; CREATE VIEW tag_browser_filtered_{table} AS SELECT id, value, (SELECT COUNT({lt}.id) FROM {lt} WHERE value={table}.id AND - books_list_filter(book)) count + books_list_filter(book)) count, + (SELECT AVG(r.rating) + FROM {lt}, + 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 AND + books_list_filter(bl.book)) avg_rating, + value AS sort FROM {table}; '''.format(lt=lt, table=table), @@ -505,7 +520,6 @@ class CustomColumns(object): END; '''.format(table=table), ] - script = ' \n'.join(lines) self.conn.executescript(script) self.conn.commit() diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 31e9b43f86..fe4aac12b5 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -12,7 +12,7 @@ from math import floor from PyQt4.QtGui import QImage -from calibre.ebooks.metadata import title_sort +from calibre.ebooks.metadata import title_sort, author_to_author_sort from calibre.library.database import LibraryDatabase from calibre.library.field_metadata import FieldMetadata, TagsIcons from calibre.library.schema_upgrades import SchemaUpgrade @@ -20,7 +20,7 @@ from calibre.library.caches import ResultCache from calibre.library.custom_columns import CustomColumns from calibre.library.sqlite import connect, IntegrityError, DBThread from calibre.ebooks.metadata import string_to_authors, authors_to_string, \ - MetaInformation, authors_to_sort_string + MetaInformation from calibre.ebooks.metadata.meta import get_metadata, metadata_from_formats from calibre.constants import preferred_encoding, iswindows, isosx, filesystem_encoding from calibre.ptempfile import PersistentTemporaryFile @@ -56,11 +56,18 @@ copyfile = os.link if hasattr(os, 'link') else shutil.copyfile class Tag(object): - def __init__(self, name, id=None, count=0, state=0, tooltip=None, icon=None): + def __init__(self, name, id=None, count=0, state=0, avg=0, sort=None, + tooltip=None, icon=None): self.name = name self.id = id self.count = count self.state = state + self.avg_rating = avg/2.0 if avg is not None else 0 + self.sort = sort + if self.avg_rating > 0: + if tooltip: + tooltip = tooltip + ': ' + tooltip = _('%sAverage rating is %3.1f')%(tooltip, self.avg_rating) self.tooltip = tooltip self.icon = icon @@ -129,11 +136,30 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.initialize_dynamic() def initialize_dynamic(self): + self.conn.executescript(''' + DROP TRIGGER IF EXISTS author_insert_trg; + CREATE TEMP TRIGGER author_insert_trg + AFTER INSERT ON authors + BEGIN + UPDATE authors SET sort=author_to_author_sort(NEW.name) WHERE id=NEW.id; + END; + DROP TRIGGER IF EXISTS author_update_trg; + CREATE TEMP TRIGGER author_update_trg + BEFORE UPDATE ON authors + BEGIN + UPDATE authors SET sort=author_to_author_sort(NEW.name) + WHERE id=NEW.id AND name <> NEW.name; + END; + ''') + self.conn.execute( + 'UPDATE authors SET sort=author_to_author_sort(name) WHERE sort IS NULL') self.conn.executescript(u''' CREATE TEMP VIEW IF NOT EXISTS tag_browser_news AS SELECT DISTINCT id, name, - (SELECT COUNT(books_tags_link.id) FROM books_tags_link WHERE tag=x.id) count + (SELECT COUNT(books_tags_link.id) FROM books_tags_link WHERE tag=x.id) count, + (0) as avg_rating, + name as sort FROM tags as x WHERE name!="{0}" AND id IN (SELECT DISTINCT tag FROM books_tags_link WHERE book IN (SELECT DISTINCT book FROM books_tags_link WHERE tag IN @@ -144,7 +170,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): CREATE TEMP VIEW IF NOT EXISTS tag_browser_filtered_news AS SELECT DISTINCT id, name, - (SELECT COUNT(books_tags_link.id) FROM books_tags_link WHERE tag=x.id and books_list_filter(book)) count + (SELECT COUNT(books_tags_link.id) FROM books_tags_link WHERE tag=x.id and books_list_filter(book)) count, + (0) as avg_rating, + name as sort FROM tags as x WHERE name!="{0}" AND id IN (SELECT DISTINCT tag FROM books_tags_link WHERE book IN (SELECT DISTINCT book FROM books_tags_link WHERE tag IN @@ -422,6 +450,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if aum: aum = [a.strip().replace('|', ',') for a in aum.split(',')] mi = MetaInformation(self.title(idx, index_is_id=index_is_id), aum) mi.author_sort = self.author_sort(idx, index_is_id=index_is_id) + if mi.authors: + mi.author_sort_map = {} + for name, sort in zip(mi.authors, self.authors_sort_strings(idx, + index_is_id)): + mi.author_sort_map[name] = sort mi.comments = self.comments(idx, index_is_id=index_is_id) mi.publisher = self.publisher(idx, index_is_id=index_is_id) mi.timestamp = self.timestamp(idx, index_is_id=index_is_id) @@ -679,7 +712,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): tn=field['table'], col=field['link_column']), (id_,)) return set(x[0] for x in ans) - def get_categories(self, sort_on_count=False, ids=None, icon_map=None): + CATEGORY_SORTS = ('name', 'popularity', 'rating') + + def get_categories(self, sort='name', ids=None, icon_map=None): self.books_list_filter.change([] if not ids else ids) categories = {} @@ -698,13 +733,17 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): continue cn = cat['column'] if ids is None: - query = 'SELECT id, {0}, count FROM tag_browser_{1}'.format(cn, tn) + query = '''SELECT id, {0}, count, avg_rating, sort + FROM tag_browser_{1}'''.format(cn, tn) else: - query = 'SELECT id, {0}, count FROM tag_browser_filtered_{1}'.format(cn, tn) - if sort_on_count: - query += ' ORDER BY count DESC' + query = '''SELECT id, {0}, count, avg_rating, sort + FROM tag_browser_filtered_{1}'''.format(cn, tn) + if sort == 'popularity': + query += ' ORDER BY count DESC, sort ASC' + elif sort == 'name': + query += ' ORDER BY sort ASC' else: - query += ' ORDER BY {0} ASC'.format(cn) + query += ' ORDER BY avg_rating DESC, sort ASC' data = self.conn.get(query) # icon_map is not None if get_categories is to store an icon and @@ -722,6 +761,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): datatype = cat['datatype'] 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.))) elif category == 'authors': @@ -733,15 +773,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): formatter = (lambda x:unicode(x)) categories[category] = [Tag(formatter(r[1]), count=r[2], id=r[0], - icon=icon, tooltip = tooltip) + avg=r[3], sort=r[4], + icon=icon, tooltip=tooltip) for r in data if item_not_zero_func(r)] - if category == 'series' and not sort_on_count: - if tweaks['title_series_sorting'] == 'library_order': - ts = lambda x: title_sort(x) - else: - ts = lambda x:x - categories[category].sort(cmp=lambda x,y:cmp(ts(x.name).lower(), - ts(y.name).lower())) # We delayed computing the standard formats category because it does not # use a view, but is computed dynamically @@ -765,11 +799,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if count > 0: categories['formats'].append(Tag(fmt, count=count, icon=icon)) - if sort_on_count: - categories['formats'].sort(cmp=lambda x,y:cmp(x.count, y.count), - reverse=True) - else: - categories['formats'].sort(cmp=lambda x,y:cmp(x.name, y.name)) + if sort == 'popularity': + categories['formats'].sort(key=lambda x: x.count, reverse=True) + else: # no ratings exist to sort on + categories['formats'].sort(key = lambda x:x.name) #### Now do the user-defined categories. #### user_categories = prefs['user_categories'] @@ -794,12 +827,15 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # Not a problem if we accumulate entries in the icon map if icon_map is not None: icon_map[cat_name] = icon_map[':user'] - if sort_on_count: + if sort == 'popularity': categories[cat_name] = \ - sorted(items, cmp=(lambda x, y: cmp(y.count, x.count))) + sorted(items, key=lambda x: x.count, reverse=True) + elif sort == 'name': + categories[cat_name] = \ + sorted(items, key=lambda x: x.sort.lower()) else: categories[cat_name] = \ - sorted(items, cmp=(lambda x, y: cmp(x.name.lower(), y.name.lower()))) + sorted(items, key=lambda x:x.avg_rating, reverse=True) #### Finally, the saved searches category #### items = [] @@ -909,6 +945,38 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.set_path(id, True) self.notify('metadata', [id]) + # Given a book, return the list of author sort strings for the book's authors + def authors_sort_strings(self, id, index_is_id=False): + id = id if index_is_id else self.id(id) + aut_strings = self.conn.get(''' + SELECT sort + FROM authors, books_authors_link as bl + WHERE bl.book=? and authors.id=bl.author + ORDER BY bl.id''', (id,)) + result = [] + for (sort,) in aut_strings: + result.append(sort) + return result + + # Given a book, return the author_sort string for authors of the book + def author_sort_from_book(self, id, index_is_id=False): + auts = self.authors_sort_strings(id, index_is_id) + return ' & '.join(auts).replace('|', ',') + + # Given a list of authors, return the author_sort string for the authors, + # preferring the author sort associated with the author over the computed + # string + def author_sort_from_authors(self, authors): + result = [] + for aut in authors: + r = self.conn.get('SELECT sort FROM authors WHERE name=?', + (aut.replace(',', '|'),), all=False) + if r is None: + result.append(author_to_author_sort(aut)) + else: + result.append(r) + return ' & '.join(result).replace('|', ',') + def set_authors(self, id, authors, notify=True): ''' `authors`: A list of authors. @@ -935,7 +1003,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): (id, aid)) except IntegrityError: # Sometimes books specify the same author twice in their metadata pass - ss = authors_to_sort_string(authors) + self.conn.commit() + ss = self.author_sort_from_book(id, index_is_id=True) self.conn.execute('UPDATE books SET author_sort=? WHERE id=?', (ss, id)) self.conn.commit() @@ -1007,6 +1076,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return result def rename_tag(self, old_id, new_name): + new_name = new_name.strip() new_id = self.conn.get( '''SELECT id from tags WHERE name=?''', (new_name,), all=False) @@ -1046,6 +1116,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return result def rename_series(self, old_id, new_name): + new_name = new_name.strip() new_id = self.conn.get( '''SELECT id from series WHERE name=?''', (new_name,), all=False) @@ -1075,7 +1146,6 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): index = index + 1 self.conn.commit() - def delete_series_using_id(self, id): books = self.conn.get('SELECT book from books_series_link WHERE series=?', (id,)) self.conn.execute('DELETE FROM books_series_link WHERE series=?', (id,)) @@ -1091,6 +1161,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return result def rename_publisher(self, old_id, new_name): + new_name = new_name.strip() new_id = self.conn.get( '''SELECT id from publishers WHERE name=?''', (new_name,), all=False) @@ -1113,12 +1184,25 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.conn.execute('DELETE FROM publishers WHERE id=?', (old_id,)) self.conn.commit() - # There is no editor for author, so we do not need get_authors_with_ids or - # delete_author_using_id. + def get_authors_with_ids(self): + result = self.conn.get('SELECT id,name,sort FROM authors') + if not result: + return [] + return result + + def set_sort_field_for_author(self, old_id, new_sort): + self.conn.execute('UPDATE authors SET sort=? WHERE id=?', \ + (new_sort.strip(), old_id)) + self.conn.commit() + # Now change all the author_sort fields in books by this author + bks = self.conn.get('SELECT book from books_authors_link WHERE author=?', (old_id,)) + for (book_id,) in bks: + ss = self.author_sort_from_book(book_id, index_is_id=True) + self.set_author_sort(book_id, ss) def rename_author(self, old_id, new_name): # Make sure that any commas in new_name are changed to '|'! - new_name = new_name.replace(',', '|') + new_name = new_name.replace(',', '|').strip() # Get the list of books we must fix up, one way or the other # Save the list so we can use it twice @@ -1141,7 +1225,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.conn.execute('UPDATE authors SET name=? WHERE id=?', (new_name, old_id)) self.conn.commit() - return + return new_id # Author exists. To fix this, we must replace all the authors # instead of replacing the one. Reason: db integrity checks can stop # the rename process, which would leave everything half-done. We @@ -1184,24 +1268,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # now fix the filesystem paths self.set_path(book_id, index_is_id=True) # Next fix the author sort. Reset it to the default - authors = self.conn.get(''' - SELECT authors.name - FROM authors, books_authors_link as bl - WHERE bl.book = ? and bl.author = authors.id - ORDER BY bl.id - ''' , (book_id,)) - # unpack the double-list structure - for i,aut in enumerate(authors): - authors[i] = aut[0] - ss = authors_to_sort_string(authors) - # Change the '|'s to ',' - ss = ss.replace('|', ',') - self.conn.execute('''UPDATE books - SET author_sort=? - WHERE id=?''', (ss, book_id)) - self.conn.commit() + ss = self.author_sort_from_book(book_id, index_is_id=True) + self.set_author_sort(book_id, ss) # the caller will do a general refresh, so we don't need to # do one here + return new_id # end convenience methods @@ -1436,7 +1507,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if not add_duplicates and self.has_book(mi): return None series_index = 1.0 if mi.series_index is None else mi.series_index - aus = mi.author_sort if mi.author_sort else ', '.join(mi.authors) + aus = mi.author_sort if mi.author_sort else self.author_sort_from_authors(mi.authors) title = mi.title if isinstance(aus, str): aus = aus.decode(preferred_encoding, 'replace') @@ -1476,7 +1547,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): duplicates.append((path, format, mi)) continue series_index = 1.0 if mi.series_index is None else mi.series_index - aus = mi.author_sort if mi.author_sort else ', '.join(mi.authors) + aus = mi.author_sort if mi.author_sort else self.author_sort_from_authors(mi.authors) title = mi.title if isinstance(aus, str): aus = aus.decode(preferred_encoding, 'replace') @@ -1515,7 +1586,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.title = _('Unknown') if not mi.authors: mi.authors = [_('Unknown')] - aus = mi.author_sort if mi.author_sort else authors_to_sort_string(mi.authors) + aus = mi.author_sort if mi.author_sort else self.author_sort_from_authors(mi.authors) if isinstance(aus, str): aus = aus.decode(preferred_encoding, 'replace') title = mi.title if isinstance(mi.title, unicode) else \ diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index 82e4edfdf2..8cb5c9bdad 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -44,9 +44,12 @@ class FieldMetadata(dict): is_category: is a tag browser category. If true, then: table: name of the db table used to construct item list column: name of the column in the normalized table to join on - link_column: name of the column in the connection table to join on + link_column: name of the column in the connection table to join on. This + key should not be present if there is no link table + category_sort: the field in the normalized table to sort on. This + key must be present if is_category is True If these are None, then the category constructor must know how - to build the item list (e.g., formats). + to build the item list (e.g., formats, news). The order below is the order that the categories will appear in the tags pane. @@ -66,6 +69,7 @@ class FieldMetadata(dict): ('authors', {'table':'authors', 'column':'name', 'link_column':'author', + 'category_sort':'sort', 'datatype':'text', 'is_multiple':',', 'kind':'field', @@ -76,6 +80,7 @@ class FieldMetadata(dict): ('series', {'table':'series', 'column':'name', 'link_column':'series', + 'category_sort':'(title_sort(name))', 'datatype':'text', 'is_multiple':None, 'kind':'field', @@ -95,6 +100,7 @@ class FieldMetadata(dict): ('publisher', {'table':'publishers', 'column':'name', 'link_column':'publisher', + 'category_sort':'name', 'datatype':'text', 'is_multiple':None, 'kind':'field', @@ -105,6 +111,7 @@ class FieldMetadata(dict): ('rating', {'table':'ratings', 'column':'rating', 'link_column':'rating', + 'category_sort':'rating', 'datatype':'rating', 'is_multiple':None, 'kind':'field', @@ -114,6 +121,7 @@ class FieldMetadata(dict): 'is_category':True}), ('news', {'table':'news', 'column':'name', + 'category_sort':'name', 'datatype':None, 'is_multiple':None, 'kind':'category', @@ -124,6 +132,7 @@ class FieldMetadata(dict): ('tags', {'table':'tags', 'column':'name', 'link_column': 'tag', + 'category_sort':'name', 'datatype':'text', 'is_multiple':',', 'kind':'field', @@ -374,7 +383,7 @@ class FieldMetadata(dict): 'search_terms':[key], 'label':label, 'colnum':colnum, 'display':display, 'is_custom':True, 'is_category':is_category, - 'link_column':'value', + 'link_column':'value','category_sort':'value', 'is_editable': is_editable,} self._add_search_terms_to_map(key, [key]) self.custom_label_to_key_map[label] = key diff --git a/src/calibre/library/schema_upgrades.py b/src/calibre/library/schema_upgrades.py index 070ad1f3a6..1ba650f6fd 100644 --- a/src/calibre/library/schema_upgrades.py +++ b/src/calibre/library/schema_upgrades.py @@ -291,4 +291,99 @@ class SchemaUpgrade(object): for field in self.field_metadata.itervalues(): if field['is_category'] and not field['is_custom'] and 'link_column' in field: - create_tag_browser_view(field['table'], field['link_column'], field['column']) + table = self.conn.get( + 'SELECT name FROM sqlite_master WHERE type="table" AND name=?', + ('books_%s_link'%field['table'],), all=False) + if table is not None: + create_tag_browser_view(field['table'], field['link_column'], field['column']) + + def upgrade_version_11(self): + 'Add average rating to tag browser views' + def create_std_tag_browser_view(table_name, column_name, + view_column_name, sort_column_name): + script = (''' + DROP VIEW IF EXISTS tag_browser_{tn}; + CREATE VIEW tag_browser_{tn} AS SELECT + id, + {vcn}, + (SELECT COUNT(id) FROM books_{tn}_link WHERE {cn}={tn}.id) count, + (SELECT AVG(ratings.rating) + FROM books_{tn}_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.{cn}={tn}.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0) avg_rating, + {scn} AS sort + FROM {tn}; + DROP VIEW IF EXISTS tag_browser_filtered_{tn}; + CREATE VIEW tag_browser_filtered_{tn} AS SELECT + id, + {vcn}, + (SELECT COUNT(books_{tn}_link.id) FROM books_{tn}_link WHERE + {cn}={tn}.id AND books_list_filter(book)) count, + (SELECT AVG(ratings.rating) + FROM books_{tn}_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.{cn}={tn}.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0 AND + books_list_filter(bl.book)) avg_rating, + {scn} AS sort + FROM {tn}; + + '''.format(tn=table_name, cn=column_name, + vcn=view_column_name, scn= sort_column_name)) + self.conn.executescript(script) + + def create_cust_tag_browser_view(table_name, link_table_name): + script = ''' + DROP VIEW IF EXISTS tag_browser_{table}; + CREATE VIEW tag_browser_{table} AS SELECT + id, + value, + (SELECT COUNT(id) FROM {lt} WHERE value={table}.id) count, + (SELECT AVG(r.rating) + FROM {lt}, + 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, + value AS sort + FROM {table}; + + DROP VIEW IF EXISTS tag_browser_filtered_{table}; + CREATE VIEW tag_browser_filtered_{table} AS SELECT + id, + value, + (SELECT COUNT({lt}.id) FROM {lt} WHERE value={table}.id AND + books_list_filter(book)) count, + (SELECT AVG(r.rating) + FROM {lt}, + 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 AND + books_list_filter(bl.book)) avg_rating, + value AS sort + FROM {table}; + '''.format(lt=link_table_name, table=table_name) + self.conn.executescript(script) + + for field in self.field_metadata.itervalues(): + if field['is_category'] and not field['is_custom'] and 'link_column' in field: + table = self.conn.get( + 'SELECT name FROM sqlite_master WHERE type="table" AND name=?', + ('books_%s_link'%field['table'],), all=False) + if table is not None: + create_std_tag_browser_view(field['table'], field['link_column'], + field['column'], field['category_sort']) + + db_tables = self.conn.get('''SELECT name FROM sqlite_master + WHERE type='table' + ORDER BY name'''); + tables = [] + for (table,) in db_tables: + tables.append(table) + for table in tables: + link_table = 'books_%s_link'%table + if table.startswith('custom_column_') and link_table in tables: + create_cust_tag_browser_view(table, link_table) + + self.conn.execute('UPDATE authors SET sort=author_to_author_sort(name)') + diff --git a/src/calibre/library/server/content.py b/src/calibre/library/server/content.py index 4dd32eb284..0e04fdfdb5 100644 --- a/src/calibre/library/server/content.py +++ b/src/calibre/library/server/content.py @@ -60,6 +60,7 @@ class ContentServer(object): items.sort(cmp=self.seriescmp, reverse=not order) else: lookup = 'sort' if field == 'title' else field + lookup = 'author_sort' if field == 'authors' else field field = self.db.FIELD_MAP[lookup] getter = operator.itemgetter(field) items.sort(cmp=lambda x, y: cmpf(getter(x), getter(y)), reverse=not order) diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index d396d73af2..7b8d609dda 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -99,17 +99,20 @@ def html_to_lxml(raw): raw = etree.tostring(root, encoding=None) return etree.fromstring(raw) -def CATALOG_ENTRY(item, base_href, version, updated): +def CATALOG_ENTRY(item, base_href, version, updated, ignore_count=False): id_ = 'calibre:category:'+item.name iid = 'N' + item.name if item.id is not None: iid = 'I' + str(item.id) link = NAVLINK(href = base_href + '/' + hexlify(iid)) + count = _('%d books')%item.count + if ignore_count: + count = '' return E.entry( TITLE(item.name), ID(id_), UPDATED(updated), - E.content(_('%d books')%item.count, type='text'), + E.content(count, type='text'), link ) @@ -265,8 +268,12 @@ class CategoryFeed(NavFeed): def __init__(self, items, which, id_, updated, version, offsets, page_url, up_url): NavFeed.__init__(self, id_, updated, version, offsets, page_url, up_url) base_href = self.base_href + '/category/' + hexlify(which) + ignore_count = False + if which == 'search': + ignore_count = True for item in items: - self.root.append(CATALOG_ENTRY(item, base_href, version, updated)) + self.root.append(CATALOG_ENTRY(item, base_href, version, updated, + ignore_count=ignore_count)) class CategoryGroupFeed(NavFeed): @@ -393,7 +400,7 @@ class OPDSServer(object): owhich = hexlify('N'+which) up_url = url_for('opdsnavcatalog', version, which=owhich) items = categories[category] - items = [x for x in items if x.name.startswith(which)] + items = [x for x in items if getattr(x, 'sort', x.name).startswith(which)] if not items: raise cherrypy.HTTPError(404, 'No items in group %r:%r'%(category, which)) @@ -458,11 +465,11 @@ class OPDSServer(object): def __init__(self, text, count): self.text, self.count = text, count - starts = set([x.name[0] for x in items]) + starts = set([getattr(x, 'sort', x.name)[0] for x in items]) category_groups = OrderedDict() for x in sorted(starts, cmp=lambda x,y:cmp(x.lower(), y.lower())): category_groups[x] = len([y for y in items if - y.name.startswith(x)]) + getattr(y, 'sort', y.name).startswith(x)]) items = [Group(x, y) for x, y in category_groups.items()] max_items = self.opts.max_opds_items offsets = OPDSOffsets(offset, max_items, len(items)) diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index adf6691671..85954f6e0f 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -14,7 +14,7 @@ from Queue import Queue from threading import RLock from datetime import datetime -from calibre.ebooks.metadata import title_sort +from calibre.ebooks.metadata import title_sort, author_to_author_sort from calibre.utils.config import tweaks from calibre.utils.date import parse_date, isoformat @@ -94,6 +94,9 @@ class Connection(sqlite.Connection): return ans[0] return ans.fetchall() +def _author_to_author_sort(x): + if not x: return '' + return author_to_author_sort(x.replace('|', ',')) class DBThread(Thread): @@ -116,10 +119,12 @@ class DBThread(Thread): self.conn.create_aggregate('concat', 1, Concatenate) self.conn.create_aggregate('sortconcat', 2, SortedConcatenate) self.conn.create_aggregate('sort_concat', 2, SafeSortedConcatenate) - if tweaks['title_series_sorting'] == 'library_order': - self.conn.create_function('title_sort', 1, title_sort) - else: + if tweaks['title_series_sorting'] == 'strictly_alphabetic': self.conn.create_function('title_sort', 1, lambda x:x) + else: + self.conn.create_function('title_sort', 1, title_sort) + self.conn.create_function('author_to_author_sort', 1, + _author_to_author_sort) self.conn.create_function('uuid4', 0, lambda : str(uuid.uuid4())) # Dummy functions for dynamically created filters self.conn.create_function('books_list_filter', 1, lambda x: 1) diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index d04e414717..663c918c6e 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -190,11 +190,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 ------------------ diff --git a/src/calibre/manual/news_recipe.rst b/src/calibre/manual/news_recipe.rst index 14cc41d436..7e5045ea47 100644 --- a/src/calibre/manual/news_recipe.rst +++ b/src/calibre/manual/news_recipe.rst @@ -111,7 +111,7 @@ Pre/post processing of downloaded HTML .. automember:: BasicNewsRecipe.remove_javascript -.. automethod:: BasicNewsRecipe.prepreprocess_html +.. automethod:: BasicNewsRecipe.skip_ad_pages .. automethod:: BasicNewsRecipe.preprocess_html diff --git a/src/calibre/translations/ar.po b/src/calibre/translations/ar.po index f3bd9dfa6f..e47f1761b4 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" +"POT-Creation-Date: 2010-06-18 17:57+0000\n" +"PO-Revision-Date: 2010-06-18 17:27+0000\n" "Last-Translator: Kovid Goyal \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-06-19 03:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -23,12 +23,12 @@ 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:432 +#: /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/ebooks/chm/metadata.py:56 @@ -40,22 +40,22 @@ msgstr "لا يفعل شيءً" #: /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:382 #: /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/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 @@ -101,44 +101,46 @@ 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/__init__.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:809 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:812 #: /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/device.py:866 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1159 #: /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/metadata_single.py:492 #: /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:351 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1037 +#: /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:330 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:342 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:916 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:985 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1586 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1588 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1710 #: /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/localization.py:115 #: /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 @@ -292,62 +294,62 @@ 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:301 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:331 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:342 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:355 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:367 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:375 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:388 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:399 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:434 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:447 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:461 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:475 msgid "This profile is intended for the B&N Nook." msgstr "ملف التعريف هذا يستخدم مع B&N Nook ." @@ -373,15 +375,15 @@ msgstr "" 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:292 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:310 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:319 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -389,7 +391,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:417 msgid "This profile is intended for the Amazon Kindle DX." msgstr "ملف التعريف هذا يستخدم مع Amazon Kindle DX" @@ -409,15 +411,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 +435,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 "تعطيل الملحق المسمى" @@ -465,59 +471,70 @@ msgid "" "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:70 msgid "Communicate with S60 phones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:46 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:78 msgid "Communicate with iBooks through iTunes." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:84 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:227 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:230 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:301 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:338 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:842 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:876 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:345 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:881 msgid "finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:452 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:519 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/apple/driver.py:742 #: /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/apple/driver.py:744 #: /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:813 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:2168 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:810 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:816 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 +#: /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:1470 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:128 +msgid "News" +msgstr "الأخبار" + #: /home/kovid/work/calibre/src/calibre/devices/binatone/driver.py:17 msgid "Communicate with the Binatone Readme eBook reader." msgstr "" @@ -540,6 +557,10 @@ msgstr "" msgid "Communicate with the EB600 eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى EB600 ." +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:207 +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 +573,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 +591,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 +631,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,15 +651,15 @@ 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 ." @@ -672,7 +703,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: " @@ -680,7 +711,7 @@ msgstr "" "ضع علامة الفاصلة للفصل بين مجموعة من البيانات الوصفية لكي تكون مجموعة في " "الجهاز . و تشمل الاحتمالات التالية: " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:140 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 msgid "Unnamed" msgstr "" @@ -701,61 +732,50 @@ 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:248 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:428 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:493 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:586 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:598 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:606 msgid "Unable to mount main memory (Error code: %d)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:742 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:743 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:745 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:747 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:776 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:778 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:780 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 "" @@ -765,57 +785,61 @@ 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 +#: /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:36 +msgid "Use author sort instead of author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:38 msgid "Template to control how books are saved" 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 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:41 +#: /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 +#: /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: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 +#: /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:224 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:242 +#: /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:246 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251 +#: /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:269 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:294 msgid "Sending metadata to device..." msgstr "يجري إرسال دليل المعلومات. إلى الجهاز..." @@ -1427,15 +1451,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 "" @@ -1754,84 +1778,88 @@ 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:381 #: /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/delete_matching_from_device.py:69 #: /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/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:866 +#: /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/ebooks/metadata/__init__.py:382 #: /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/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:867 msgid "Author(s)" msgstr "المؤلف أو المؤلفون" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:374 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:383 #: /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/gui2/library/models.py:62 msgid "Publisher" msgstr "الناشر" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:375 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:384 #: /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/ebooks/metadata/__init__.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:208 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 #: /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:307 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1056 msgid "Comments" msgstr "التعليقات" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:384 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393 +#: /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: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:63 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1052 +#: /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:395 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /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:64 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 +#: /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:396 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:398 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1044 msgid "Timestamp" msgstr "ختم التوقيت" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:400 #: /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/gui2/library/models.py:60 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 msgid "Rights" msgstr "" @@ -1839,7 +1867,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,6 +1966,10 @@ msgstr "تم حفظ الغلاف في" msgid "No cover found" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:41 +msgid "Downloads metadata from Douban.com" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:33 msgid "Metadata download" msgstr "" @@ -1976,6 +2008,10 @@ msgstr "" msgid "Downloads social metadata from amazon.com" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:205 +msgid "Downloads series information from librarything.com" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94 msgid "" "\n" @@ -2032,7 +2068,7 @@ msgid "" "Fetch a cover image 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/metadata/opf2.py:1222 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1371 msgid "Cover" msgstr "الغلاف" @@ -2316,6 +2352,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 +2559,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,23 +2636,416 @@ 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:153 #: /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:187 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:187 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:397 msgid "Choose Files" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:242 +msgid "Use library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:243 +msgid "User annotations generated from main library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:666 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:723 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1037 +msgid "No books selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:74 +msgid "No books selected to fetch annotations from" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:99 +msgid "Merging user annotations into database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:127 +msgid "%s
Last Page Read: %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:133 +msgid "%s
Last Page Read: Location %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:152 +msgid "Location %d • %s
%s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:161 +msgid "Page %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:166 +msgid "Location %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:288 +msgid "How many empty books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:289 +msgid "How many empty books should be added?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:388 +msgid "Uploading books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:139 +msgid "Books" +msgstr "كتب" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:349 +msgid "EPUB Books" +msgstr "كتب EPUB" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:350 +msgid "LRF Books" +msgstr "كتب LRF" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:351 +msgid "HTML Books" +msgstr "كتب HTML" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:352 +msgid "LIT Books" +msgstr "كتب LIT" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:353 +msgid "MOBI Books" +msgstr "كتب MOBI" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:354 +msgid "Topaz books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:355 +msgid "Text books" +msgstr "كتب نصّية" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:356 +msgid "PDF Books" +msgstr "كتب PDF" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:357 +msgid "Comics" +msgstr "الرسومات" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:358 +msgid "Archives" +msgstr "أرشيفات" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:362 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:397 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:398 +msgid "" +"Some duplicates were found and merged into the following existing books:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:407 +msgid "Failed to read metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:408 +msgid "Failed to read metadata from the following" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:432 +msgid "Add to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:457 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1214 +msgid "No book selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:432 +msgid "No book files found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:454 +msgid "Cannot delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:467 +msgid "Choose formats to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:485 +msgid "Choose formats not to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:505 +msgid "Cannot delete books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:506 +msgid "No device is connected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:516 +msgid "Main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:517 +#: /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/actions.py:518 +#: /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/actions.py:523 +msgid "No books to delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:524 +msgid "None of the selected books are on the device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:598 +msgid "Deleting books from device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:562 +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:583 +msgid "" +"The selected books will be permanently deleted from your device. Are " +"you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:608 +msgid "Cannot download metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:624 +msgid "social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:626 +msgid "covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:626 +msgid "metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:628 +msgid "Downloading %s for %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:650 +msgid "Failed to download some metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:651 +msgid "Failed to download metadata for the following:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:654 +msgid "Failed to download metadata:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:946 +#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 +msgid "Error" +msgstr "خطأ" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:665 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:703 +msgid "Cannot edit metadata" +msgstr "لا يمكن تحرير الميتاداتا" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:725 +msgid "Cannot merge books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:726 +msgid "At least two books must be selected for merging" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:730 +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:741 +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:753 +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:853 +msgid "Cannot save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:856 +msgid "Choose destination directory" +msgstr "إختيار دليل الوجهة" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:889 +msgid "Error while saving" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:890 +msgid "There was an error while saving." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:897 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:898 +msgid "Could not save some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:899 +msgid "Click the show details button to see which ones." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:920 +msgid "No books selected to generate catalog for" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:937 +msgid "Generating %s catalog..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:261 +msgid "No books found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:943 +msgid "" +"No books to catalog\n" +"Check exclude tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:953 +msgid "Catalog generated." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:956 +msgid "Export Catalog Directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:957 +msgid "Select destination for %s.%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:973 +msgid "Fetching news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:987 +msgid " fetched." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1036 +msgid "Cannot convert" +msgstr "لا يمكن تحويله" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1065 +msgid "Starting conversion of %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1250 +msgid "Cannot view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1195 +#: /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:1203 +msgid "Multiple Books Selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +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:1213 +msgid "Cannot open folder" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1251 +msgid "%s has no available formats." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/add.py:54 msgid "Searching in" msgstr "يتم البحث في" @@ -2636,15 +3067,10 @@ 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/device.py:809 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 msgid "Added" msgstr "" @@ -2763,17 +3189,17 @@ 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/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/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:551 +#: /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:566 +#: /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:586 +#: /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:590 +#: /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:628 #: /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 @@ -2792,17 +3218,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 +3250,58 @@ 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:53 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:302 +#: /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:1042 +msgid "Path" +msgstr "المسار" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /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: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:870 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1045 +msgid "Collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:55 +msgid "Click to open" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /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:1051 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1055 +#: /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 +msgid "None" +msgstr "بدون" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:301 +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 "" @@ -2883,7 +3361,7 @@ msgstr "" #: /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 +3379,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:1433 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1451 msgid "Catalog" msgstr "" @@ -3584,11 +4062,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 +4142,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:73 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:74 msgid "Invalid regular expression: %s" msgstr "" @@ -3882,11 +4355,19 @@ 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/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 +4388,290 @@ 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:357 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:378 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:383 msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:45 #: /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:145 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:250 msgid "Get device information" msgstr "احصل على معلومات الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:276 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:286 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:295 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:304 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:319 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:336 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:346 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:381 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: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 msgid "Email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:398 +msgid " and delete from library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 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:409 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:411 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:416 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:425 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:443 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:444 msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:483 msgid "Connect to folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 msgid "Disconnect from folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:496 msgid "Fetch annotations (experimental)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:606 +msgid "Error communicating with device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 +msgid "Select folder to open as device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:669 +msgid "Failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:675 +msgid "Error talking to device" +msgstr "خطأ في الاتصال بالجهاز" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:676 +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:717 +msgid "Device: " +msgstr "الجهاز: " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719 +msgid " detected." +msgstr " تم كشفه." + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:742 +msgid "Connected " +msgstr "متصل " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:810 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:815 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:823 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:614 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:824 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:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 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:828 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:832 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:873 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:667 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 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/device.py:877 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 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:891 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:921 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1020 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1200 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:922 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:929 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:947 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:948 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:952 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:770 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:979 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:782 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:991 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:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1082 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 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:1050 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:1113 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:1167 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:1208 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1256 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:1257 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" @@ -4324,165 +4817,165 @@ msgstr "" msgid "new email address" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:489 +msgid "Wide" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 +msgid "Narrow" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:500 msgid "System port selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:501 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:521 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:524 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:525 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:526 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:577 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:578 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:581 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:593 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:594 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:603 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:604 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:612 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:650 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:651 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:682 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:687 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:688 #: /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:689 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:756 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:763 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:791 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:343 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:815 #: /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:822 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:823 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:881 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:886 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:882 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:883 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:887 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:892 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:893 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:927 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:947 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:952 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:953 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 " @@ -4593,279 +5086,288 @@ msgstr "" 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:548 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /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:549 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:550 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:552 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:553 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:554 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:555 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:556 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:557 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:558 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:559 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:560 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:561 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:562 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:563 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:564 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:567 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:568 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:569 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:570 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:571 msgid "Show cover &browser in a separate window (needs restart)" 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:572 +msgid "Show &average ratings in the tags browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 msgid "Search as you type" 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:574 msgid "Automatically send downloaded &news to ebook reader" 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:575 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:576 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 msgid "Toolbar" 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:578 msgid "Large" 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:579 msgid "Medium" 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:580 msgid "Small" 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:581 msgid "&Button size in toolbar" 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:582 msgid "Show &text in toolbar buttons" 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:583 msgid "Select visible &columns in library view" 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:585 msgid "Remove a user-defined column" 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:587 msgid "Add a user-defined column" 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:589 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:592 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:593 +msgid "User Interface &layout (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594 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:595 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:596 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:597 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:598 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:599 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:600 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:601 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:602 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:603 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:604 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:605 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:606 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:607 #: /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:608 #: /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:609 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:610 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:611 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:612 #: /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:613 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:614 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:615 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:616 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:617 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:618 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:619 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:620 #: /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 +5378,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:622 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:623 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:624 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:625 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:626 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:627 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:629 msgid "&Add" msgstr "&إضافة" @@ -4939,10 +5441,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:28 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:868 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Date" msgstr "تاريخ" @@ -4958,68 +5461,69 @@ 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:30 msgid "Floating point numbers" msgstr "" -#: /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:32 msgid "Integers" msgstr "" -#: /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:34 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:37 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:61 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:62 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:66 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:97 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:99 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:108 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:114 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:124 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:126 msgid "" "The lookup name must be lower case and cannot contain \":\"s or spaces" msgstr "" @@ -5128,6 +5632,27 @@ msgstr "" msgid "ERROR" msgstr "خطأ" +#: /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:1041 +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:63 msgid "Author Sort" msgstr "ترتيب المؤلف" @@ -5334,11 +5859,6 @@ msgstr "" 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 msgid "No permission" msgstr "" @@ -5377,67 +5897,75 @@ msgstr "" 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:445 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:450 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:453 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:532 +msgid "Cannot use tag editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:533 +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 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: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:559 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:570 +#: /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:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:567 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:571 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:583 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:584 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:617 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:618 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:647 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:648 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:719 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:720 msgid "Could not open %s. Is it being used by another program?" msgstr "" @@ -5795,12 +6323,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 "الناشرون" @@ -5917,12 +6445,12 @@ 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/tag_view.py:500 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/tag_view.py:501 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -5954,25 +6482,25 @@ msgstr "" msgid "Are you certain you want to delete the following items?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py: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 +6742,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: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 msgid "No match" msgstr "" @@ -6254,54 +6782,203 @@ 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:60 +msgid "Download only metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:62 +msgid "Download only covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:65 +msgid "Download only social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:71 +msgid "Merge into first selected book - delete others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:74 +msgid "Merge into first selected book - keep others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:82 +msgid "Add books from a single directory" +msgstr "إضافة كتب من دليل واحد" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:84 +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:88 +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:91 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:101 +#: /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:103 +msgid "Save to disk in a single directory" +msgstr "حفظ إلى القرص في دليل واحد" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:405 +msgid "Save only %s format to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:408 +msgid "Save only %s format to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:289 +msgid "View" +msgstr "عرض" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:119 +msgid "View specific format" +msgstr "عرض تهيئة معينة" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125 +msgid "Remove selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:127 +msgid "Remove files of a specific format from selected books.." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:130 +msgid "Remove all formats from selected books, except..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:133 +msgid "Remove covers from selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:136 +msgid "Remove matching books from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:153 +msgid "Convert individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:155 +msgid "Bulk convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:159 +msgid "Create catalog of books in your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:167 +msgid "Run welcome wizard" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:199 +msgid "Similar books..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230 +msgid "Add books to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:309 +msgid "Cover Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:327 +msgid "Tag Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:384 +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 +6990,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:56 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:58 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:61 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:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 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:662 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:398 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:865 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:869 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:1108 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:1111 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:509 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:510 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -6514,282 +7169,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:84 +msgid "Choose a location for your calibre e-book library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +msgid "Failed to create library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +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 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:151 +msgid "Initializing user interface..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:176 +msgid "Repairing failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +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 msgid "Bad database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:192 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:205 msgid "Corrupted database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:206 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:212 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:225 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:236 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:281 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:283 msgid "Cannot Start " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:284 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:287 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:289 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:291 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:294 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:296 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:308 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 +7445,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:89 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:251 msgid "Search" msgstr "بحث" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:304 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:346 +msgid "Search (For Advanced Search click the button to the left)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:379 +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 +7534,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:190 +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:194 +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:199 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:202 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:206 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:213 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:217 +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:220 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:227 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:231 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:432 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:266 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:510 +msgid "Duplicate search name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 +msgid "The saved search name %s is already used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:726 +msgid "Sort by name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:726 +msgid "Sort by popularity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:727 +msgid "Sort by average rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:733 +msgid "Match all" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:733 +msgid "Match any" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:738 +msgid "Manage &user categories" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:63 @@ -7005,619 +7644,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:240 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:387 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:392 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2278 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:388 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:393 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:438 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:439 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:489 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:517 msgid "Conversion Error" msgstr "خطأ في التحويل" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2416 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:490 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:503 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2444 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:518 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2491 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:558 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:583 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:586 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:590 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2575 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:642 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 +8216,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:198 msgid "Copy Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:199 msgid "Paste Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:228 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:229 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:230 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:231 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:235 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:238 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:239 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:240 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:248 msgid "Books located at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:506 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:507 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:508 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:509 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:510 msgid "Title Case" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:932 +msgid "Drag to resize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:963 +msgid "Show" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:968 +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 +8564,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:275 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:273 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:278 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:276 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:281 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:284 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:285 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:435 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 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:435 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 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:438 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 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:438 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 msgid "empty" msgstr "" @@ -8842,7 +8986,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 "" @@ -8923,43 +9067,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:520 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:489 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:522 msgid "Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:491 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:524 msgid "Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1542 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1736 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:1765 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1588 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1782 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1681 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1875 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1720 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1916 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:1938 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 +9293,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 "" @@ -9324,34 +9472,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 +9560,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:606 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:703 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:705 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:711 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:713 msgid " from " msgstr " من " -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:704 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:715 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:828 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:849 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:854 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:860 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:862 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:943 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:959 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:969 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:981 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:1021 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:1211 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:1282 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:1293 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:1310 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:1457 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:1473 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." @@ -9519,55 +9671,55 @@ msgstr "تم جدولته" 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 +9728,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 +10166,9 @@ msgstr "" #~ msgstr "" #~ "حين يوجد، استخدم معلومات ترتيب المؤلف لإنشاء ميتاداتا المؤلف في Mobipocket." +#~ msgid "Sort by &popularity" +#~ msgstr "ترتيب حسب الش&هرة" + #~ msgid "Automatic &Table of Contents" #~ msgstr "قائمة المحتويات& المنشئة آلياً" @@ -10048,6 +10203,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..f0f08e4c2c 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" +"POT-Creation-Date: 2010-06-18 17:57+0000\n" +"PO-Revision-Date: 2010-06-18 17:06+0000\n" "Last-Translator: Kovid Goyal \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-06-19 03:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -26,13 +26,12 @@ 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:432 +#: /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/ebooks/chm/metadata.py:56 @@ -44,21 +43,22 @@ msgstr "No fa absolutament res" #: /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:382 +#: /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/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 +74,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: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/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,47 +100,50 @@ 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/__init__.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:809 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:812 #: /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/device.py:866 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1159 +#: /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: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/dialogs/metadata_single.py:492 +#: /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:861 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1037 +#: /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/library/database2.py:330 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:342 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:916 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:985 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1586 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1588 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1710 +#: /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:45 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 @@ -161,13 +164,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 "" @@ -285,7 +288,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:266 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -297,62 +300,62 @@ 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:301 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:331 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:342 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:355 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:367 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:375 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:388 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:399 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:434 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:447 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:461 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:475 msgid "This profile is intended for the B&N Nook." msgstr "Aquest perfil és adient per al B&N Nook." @@ -370,24 +373,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:254 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:279 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:292 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:310 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:319 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -395,7 +399,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:417 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Aquest perfil és adient per a l'Amazon Kindle DX." @@ -415,15 +419,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 "" + +#: /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 +443,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 +462,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" @@ -479,10 +487,75 @@ 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:70 msgid "Communicate with S60 phones." msgstr "Estableix comunicació amb els telèfons S60." +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:78 +msgid "Communicate with iBooks through iTunes." +msgstr "Comunicar-se amb els iBooks a través d'iTunes" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:84 +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:227 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:230 +msgid "Updating device metadata listing..." +msgstr "Actualitzant la llista de metadades del dispositiu..." + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:301 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:338 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:842 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:876 +msgid "%d of %d" +msgstr "%d de %d" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:345 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:881 +msgid "finished" +msgstr "finalitzat" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:519 +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:742 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:28 +msgid "settings for device drivers" +msgstr "paràmetres dels controladors de dispostius" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:744 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:30 +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/apple/driver.py:813 +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:2168 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:810 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:816 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 +#: /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:1470 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:128 +msgid "News" +msgstr "Notícies" + #: /home/kovid/work/calibre/src/calibre/devices/binatone/driver.py:17 msgid "Communicate with the Binatone Readme eBook reader." msgstr "" @@ -508,6 +581,10 @@ 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:207 +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" @@ -521,35 +598,59 @@ 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 "" + #: /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 +662,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 +687,29 @@ 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:14 +msgid "Communicate with the Kobo Reader" +msgstr "Comunica amb el lector Kobo Reader" + #: /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/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." @@ -639,27 +736,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 +748,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:143 +#: /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,31 +763,31 @@ 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:248 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "No s'ha pogut detectar la unitat de disc %s. Proveu a reiniciar." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:425 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:428 msgid "Unable to detect the %s mount point. Try rebooting." msgstr "No s'ha pogut detectar el punt de muntatge %s. Proveu a reiniciar." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:490 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:493 msgid "Unable to detect the %s disk drive." msgstr "No s'ha pogut detectar la unitat de disc %s." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:583 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:586 msgid "Could not find mount helper: %s." msgstr "No s'ha pogut trobar l'assistent de muntatge: %s" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:595 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:598 msgid "" "Unable to detect the %s disk drive. Your kernel is probably exporting a " "deprecated version of SYSFS." @@ -734,86 +795,95 @@ msgstr "" "No s'ha pogut detectar la unitat de disc %s. El kernel probablement utilitza " "una versió obsoleta de SYSFS." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:603 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:606 msgid "Unable to mount main memory (Error code: %d)" msgstr "No s'ha pogut muntar la memòria principal (Codi d'error: %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:743 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:745 msgid "The reader has no storage card in this slot." msgstr "El lector no té cap targeta de memòria en aquesta ranura." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:747 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:776 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:778 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:780 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 -msgid "settings for device drivers" -msgstr "paràmetres dels controladors de dispostius" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:30 -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 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/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 +msgid "Use author sort instead of author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:38 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:41 +#: /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 +#: /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/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:208 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:237 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:165 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:170 +#: /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 "S'estan suprimint els llibres del dispositiu..." + +#: /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 "S'estan suprimint llibres del llistat de metadades del dispositiu..." +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:294 +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" msgstr "%prog [opcions] mybook.chm" @@ -1480,6 +1550,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 +1578,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 +1598,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 +1614,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 +1628,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 +1678,47 @@ 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 " "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." -#: /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 +1726,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 @@ -1650,6 +1760,8 @@ 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 msgid "" @@ -1657,6 +1769,9 @@ msgid "" "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 msgid "" @@ -1703,7 +1818,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,11 +1826,11 @@ 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" @@ -1896,80 +2011,88 @@ 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:381 #: /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/delete_matching_from_device.py:69 #: /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/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:866 +#: /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/ebooks/metadata/__init__.py:382 #: /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/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:867 msgid "Author(s)" msgstr "Autor(s)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:383 #: /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/gui2/library/models.py:62 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:384 #: /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/ebooks/metadata/__init__.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:208 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 #: /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:307 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1056 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:393 +#: /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:63 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1052 +#: /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:395 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 +#: /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:1061 +#: /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:396 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:398 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1044 msgid "Timestamp" msgstr "Marca de temps" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:382 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:400 #: /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/gui2/library/models.py:60 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:402 msgid "Rights" msgstr "Drets" @@ -1977,7 +2100,7 @@ msgstr "Drets" 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." @@ -2076,44 +2199,52 @@ msgstr "Portada desada a" msgid "No cover found" msgstr "No s'ha trobat cap caràtula" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:41 +msgid "Downloads metadata from Douban.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:33 msgid "Metadata download" msgstr "Metadades baixades" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110 msgid "ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110 msgid "tags" msgstr "etiquetes" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111 msgid "description/reviews" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:113 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:112 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:136 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:152 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:180 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:188 msgid "Downloads social metadata from amazon.com" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:205 +msgid "Downloads series information from librarything.com" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94 msgid "" "\n" @@ -2170,8 +2301,8 @@ msgid "" "Fetch a cover image 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:1222 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1371 msgid "Cover" msgstr "" @@ -2210,74 +2341,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:1372 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:1373 #: /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:1374 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1376 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1375 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1377 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1376 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1378 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1377 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1379 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1378 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1380 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1379 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1381 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1380 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1382 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1381 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1383 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1382 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1384 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1383 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:1384 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:1385 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1387 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1386 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1388 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1387 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 +2425,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 +2448,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 +2456,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 +2585,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 +2664,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 +2720,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 +2763,778 @@ 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:153 +#: /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:187 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:187 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:397 msgid "Choose Files" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:242 +msgid "Use library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:243 +msgid "User annotations generated from main library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:666 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:723 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1037 +msgid "No books selected" +msgstr "Cap llibre seleccionat" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:74 +msgid "No books selected to fetch annotations from" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:99 +msgid "Merging user annotations into database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:127 +msgid "%s
Last Page Read: %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:133 +msgid "%s
Last Page Read: Location %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:152 +msgid "Location %d • %s
%s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:161 +msgid "Page %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:166 +msgid "Location %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:288 +msgid "How many empty books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:289 +msgid "How many empty books should be added?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:388 +msgid "Uploading books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:139 +msgid "Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:349 +msgid "EPUB Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:350 +msgid "LRF Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:351 +msgid "HTML Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:352 +msgid "LIT Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:353 +msgid "MOBI Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:354 +msgid "Topaz books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:355 +msgid "Text books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:356 +msgid "PDF Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:357 +msgid "Comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:358 +msgid "Archives" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:362 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:397 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:398 +msgid "" +"Some duplicates were found and merged into the following existing books:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:407 +msgid "Failed to read metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:408 +msgid "Failed to read metadata from the following" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:432 +msgid "Add to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:457 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1214 +msgid "No book selected" +msgstr "Cap llibre seleccionat" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:432 +msgid "No book files found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:454 +msgid "Cannot delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:467 +msgid "Choose formats to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:485 +msgid "Choose formats not to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:505 +msgid "Cannot delete books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:506 +msgid "No device is connected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:516 +msgid "Main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:517 +#: /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/actions.py:518 +#: /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/actions.py:523 +msgid "No books to delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:524 +msgid "None of the selected books are on the device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:598 +msgid "Deleting books from device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:562 +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:583 +msgid "" +"The selected books will be permanently deleted from your device. Are " +"you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:608 +msgid "Cannot download metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:624 +msgid "social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:626 +msgid "covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:626 +msgid "metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:628 +msgid "Downloading %s for %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:650 +msgid "Failed to download some metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:651 +msgid "Failed to download metadata for the following:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:654 +msgid "Failed to download metadata:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:946 +#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 +msgid "Error" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:665 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:703 +msgid "Cannot edit metadata" +msgstr "No puc editar les meta-dades" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:725 +msgid "Cannot merge books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:726 +msgid "At least two books must be selected for merging" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:730 +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:741 +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:753 +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:853 +msgid "Cannot save to disk" +msgstr "No puc desar al disc" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:856 +msgid "Choose destination directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:889 +msgid "Error while saving" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:890 +msgid "There was an error while saving." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:897 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:898 +msgid "Could not save some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:899 +msgid "Click the show details button to see which ones." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:920 +msgid "No books selected to generate catalog for" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:937 +msgid "Generating %s catalog..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:261 +msgid "No books found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:943 +msgid "" +"No books to catalog\n" +"Check exclude tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:953 +msgid "Catalog generated." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:956 +msgid "Export Catalog Directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:957 +msgid "Select destination for %s.%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:973 +msgid "Fetching news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:987 +msgid " fetched." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1036 +msgid "Cannot convert" +msgstr "No puc convertir-lo" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1065 +msgid "Starting conversion of %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1250 +msgid "Cannot view" +msgstr "No puc mostrar-lo" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1195 +#: /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:1203 +msgid "Multiple Books Selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +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:1213 +msgid "Cannot open folder" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1251 +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:229 msgid "Adding..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:242 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:255 msgid "Path error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:256 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:260 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:809 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:327 msgid "Added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:340 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:341 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:353 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:354 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:357 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:423 msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:472 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:476 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:551 +#: /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:566 +#: /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:586 +#: /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:590 +#: /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:628 +#: /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/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:22 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:302 +#: /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:1042 +msgid "Path" +msgstr "Camí" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /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:96 +msgid "Formats" +msgstr "Formats" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1045 +msgid "Collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:55 +msgid "Click to open" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /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:1051 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1055 +#: /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 +msgid "None" +msgstr "Cap" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:301 +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 "" @@ -2858,15 +3586,15 @@ msgstr "" #: /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:45 #: /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 +3611,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:1433 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1451 msgid "Catalog" msgstr "" @@ -3050,46 +3778,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 " @@ -3361,38 +4049,38 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:101 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:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:108 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/dialogs/metadata_single.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 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/dialogs/metadata_single.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 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/dialogs/metadata_single.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:118 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/dialogs/metadata_single.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 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/dialogs/metadata_single_ui.py:405 msgid "Book Cover" msgstr "Coberta" @@ -3401,28 +4089,28 @@ 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:406 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:407 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 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/dialogs/metadata_single_ui.py:367 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/dialogs/metadata_bulk_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "&Author(s): " msgstr "&Autor(s): " @@ -3438,19 +4126,19 @@ 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/dialogs/metadata_bulk_ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 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/dialogs/metadata_single_ui.py:380 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/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." @@ -3459,22 +4147,22 @@ msgstr "" "

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/dialogs/metadata_bulk_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "&Series:" msgstr "&Sèries:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py: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/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 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/dialogs/metadata_single_ui.py:391 msgid "Book " msgstr "Llibre " @@ -3559,12 +4247,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:46 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:47 msgid "Assume print formatting" msgstr "" @@ -3592,32 +4280,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 +4376,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:73 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:74 msgid "Invalid regular expression: %s" msgstr "" @@ -3778,21 +4465,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:48 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:49 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:50 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 +msgid "Preserve &spaces" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:16 msgid "TXT Output" msgstr "" @@ -3898,246 +4589,325 @@ 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/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:357 +msgid "Remove all tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:378 +msgid "tags to add" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:383 +msgid "tags to remove" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:45 #: /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:145 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:250 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:276 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:286 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:295 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:304 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:319 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:336 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:346 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:381 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: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 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:398 +msgid " and delete from library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 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:409 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:411 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:416 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:425 +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:443 +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:444 +msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:483 +msgid "Connect to folder" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 +msgid "Disconnect from folder" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:496 msgid "Fetch annotations (experimental)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:606 +msgid "Error communicating with device" +msgstr "Error en la comunicació amb el dispositiu" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 +msgid "Select folder to open as device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:669 +msgid "Failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:675 +msgid "Error talking to device" +msgstr "Error comunicant amb el dispositiu" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:676 +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:717 +msgid "Device: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719 +msgid " detected." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:742 +msgid "Connected " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:810 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:815 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:823 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:824 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:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 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:828 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:832 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:873 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:584 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 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:877 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:586 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 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:891 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:921 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1020 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1200 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:922 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:929 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:947 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:948 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:952 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:687 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:979 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:688 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:699 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:991 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:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1082 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 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:1050 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:1113 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:1167 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:1208 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:960 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1256 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:1257 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 +4955,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 +4975,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:173 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:174 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:183 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:199 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:199 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:199 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:200 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:200 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:201 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:201 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:201 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:219 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:219 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:224 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:225 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:299 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:489 +msgid "Wide" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 +msgid "Narrow" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:500 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:501 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:521 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:524 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:525 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:526 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:577 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:578 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:581 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:593 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:594 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:603 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:604 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:612 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:650 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:651 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:682 +msgid "You must select a column to delete it" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:687 +msgid "The selected column is not a custom column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:688 +#: /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:689 +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:756 msgid "Error log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:663 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:763 msgid "Access log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:691 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:701 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:791 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:343 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:815 +#: /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:822 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:823 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:881 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:886 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:882 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:883 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:887 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:892 +msgid "Must restart" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:893 +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:927 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:947 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:952 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:953 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 " @@ -4519,259 +5320,288 @@ msgstr "" 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:548 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /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:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:549 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:550 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:552 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:553 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:554 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:555 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:556 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:557 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:558 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:559 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:560 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:561 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:562 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:563 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:564 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:567 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:568 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:569 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:570 +msgid "Show &splash screen at startup" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571 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:572 +msgid "Show &average ratings in the tags browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 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:574 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:575 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:576 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:577 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:578 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:579 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:580 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:581 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:582 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:583 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:585 +msgid "Remove a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:587 +msgid "Add a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:589 +msgid "Edit settings of a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:592 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:593 +msgid "User Interface &layout (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594 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:595 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:596 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:597 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:598 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:599 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:600 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:601 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:602 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:603 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:604 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:605 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:606 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:607 #: /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:608 #: /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:609 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:610 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:611 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:612 #: /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:613 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:614 +msgid "Max. OPDS &ungrouped items:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 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:616 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:617 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:618 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:619 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:620 #: /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 +5612,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:622 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:623 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:624 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:625 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:626 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:627 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:629 msgid "&Add" msgstr "" @@ -4836,16 +5666,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 +5675,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:28 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:868 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Date" msgstr "Data" @@ -4872,6 +5695,128 @@ 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:30 +msgid "Floating point numbers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:32 +msgid "Integers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:34 +msgid "Ratings, shown with stars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:37 +msgid "Yes/No" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:61 +msgid "No column selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:62 +msgid "No column has been selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:66 +msgid "Selected column is not a user-defined column" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:97 +msgid "No lookup name was provided" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:99 +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 +msgid "No column heading was provided" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:114 +msgid "The lookup name %s is already used" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:124 +msgid "The heading %s is already used" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:126 +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 +5858,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,6 +5866,27 @@ msgstr "" msgid "ERROR" msgstr "ERROR" +#: /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:1041 +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:63 msgid "Author Sort" msgstr "" @@ -5019,29 +5981,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:372 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -5049,55 +6006,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:375 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:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 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:378 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:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py: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,196 +6062,224 @@ 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 +#: /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_single.py:123 +#: /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:412 +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 +msgid "&Custom metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 msgid "Not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:138 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:167 msgid "No permission" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:168 msgid "You do not have permission to read the following files:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:193 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:196 msgid "No format selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:207 msgid "Could not read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:208 msgid "Could not read metadata from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:254 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:262 msgid "Could not read cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:257 msgid "Could not read cover from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:263 msgid "The cover in the %s format is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:300 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:445 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:450 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:453 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:532 +msgid "Cannot use tag editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:533 +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 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: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 "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:566 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:577 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:567 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:571 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:583 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:584 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:617 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:618 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:647 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:648 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:719 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:720 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:364 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:365 +msgid "Meta information" +msgstr "Meta-informació" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 msgid "Swap the author and title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 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:373 msgid "" "Automatically create the author sort entry based on the current author entry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 msgid "Publishe&d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 msgid "dd MMM yyyy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 msgid "&Date:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "&Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 msgid "&Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "Available Formats" msgstr "Formats disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "Add a new format for this book to the database" msgstr "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:400 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:402 msgid "Set the cover for the book from the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "Update metadata from the metadata in the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 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:411 msgid "Download &cover" msgstr "" @@ -5306,48 +6291,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 +6558,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 "" + +#: /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 "" + +#: /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:93 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 +6676,66 @@ 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:500 +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:501 +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 +msgid "No item selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:80 +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 +msgid "No items selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:90 +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 +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,11 +6974,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: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 msgid "No match" msgstr "" @@ -5868,98 +7014,303 @@ 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:60 +msgid "Download only metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:62 +msgid "Download only covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:65 +msgid "Download only social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:71 +msgid "Merge into first selected book - delete others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:74 +msgid "Merge into first selected book - keep others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:82 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:84 +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:88 +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:91 +msgid "Add Empty book. (Book entry with no formats)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:101 +#: /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:103 +msgid "Save to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:405 +msgid "Save only %s format to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:408 +msgid "Save only %s format to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:289 +msgid "View" +msgstr "Mostra" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:119 +msgid "View specific format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125 +msgid "Remove selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:127 +msgid "Remove files of a specific format from selected books.." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:130 +msgid "Remove all formats from selected books, except..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:133 +msgid "Remove covers from selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:136 +msgid "Remove matching books from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:153 +msgid "Convert individually" +msgstr "Converteix individualment" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:155 +msgid "Bulk convert" +msgstr "Converteix tots" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:159 +msgid "Create catalog of books in your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:167 +msgid "Run welcome wizard" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:199 +msgid "Similar books..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230 +msgid "Add books to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:309 +msgid "Cover Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:327 +msgid "Tag Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:384 +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:56 +msgid "On Device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:58 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:61 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:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 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:662 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:398 +msgid "The lookup/search name is \"{0}\"" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:865 +msgid "In Library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:869 +msgid "Size" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1108 +msgid "Marked for deletion" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1111 +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:509 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:510 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 +7385,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:84 +msgid "Choose a location for your calibre e-book library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +msgid "Failed to create library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +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 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:151 +msgid "Initializing user interface..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:176 +msgid "Repairing failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +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 msgid "Bad database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:192 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:205 msgid "Corrupted database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:206 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:212 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:225 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:236 +msgid "Starting %s: Loading books..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:281 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:283 msgid "Cannot Start " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:284 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:287 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:289 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:291 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:294 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:296 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:308 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 "" + +#: /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 "" @@ -6330,11 +7677,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:89 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:251 msgid "Search" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:304 +msgid "The selected search will be permanently deleted. Are you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:346 +msgid "Search (For Advanced Search click the button to the left)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:379 +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 "" @@ -6395,44 +7766,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:190 +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:194 +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:199 +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:202 +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:206 +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:213 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:217 +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:220 +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:227 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:231 +msgid "Manage User Categories" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:432 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:266 msgid "Searches" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:510 +msgid "Duplicate search name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 +msgid "The saved search name %s is already used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:726 +msgid "Sort by name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:726 +msgid "Sort by popularity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:727 +msgid "Sort by average rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:733 +msgid "Match all" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:733 +msgid "Match any" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:738 +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 +7876,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:240 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:387 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:392 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:388 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:393 +msgid "Cannot configure before calibre is restarted." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:438 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:439 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:489 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:517 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2282 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:490 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:503 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2310 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:518 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2358 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:558 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:583 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:586 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:590 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2442 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:642 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 +8448,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:198 msgid "Copy Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:199 msgid "Paste Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:228 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:229 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:230 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:231 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:235 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:238 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:239 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:240 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:248 +msgid "Books located at" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:506 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:507 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:508 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:509 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:510 msgid "Title Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:932 +msgid "Drag to resize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:963 +msgid "Show" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:968 +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 +8614,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 +8796,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:275 +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:278 +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:281 +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:284 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:285 +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:435 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 +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:435 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 +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:438 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 +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:438 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 +msgid "yes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 +msgid "blank" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 +msgid "empty" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:41 @@ -7916,14 +8858,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 +8874,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 +8890,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 +8920,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 +8930,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 +8959,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 +9016,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 +9061,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 +9074,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 +9092,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 +9106,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 +9127,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 +9142,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 +9173,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 +9200,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:688 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -8299,17 +9235,17 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:797 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:699 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:710 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:729 msgid "" "\n" " %prog custom_columns [options]\n" @@ -8318,19 +9254,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:834 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:736 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:748 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:750 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:854 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:756 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -8340,15 +9276,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:862 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:764 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:774 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:787 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -8360,30 +9296,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:520 +msgid "Main" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:522 +msgid "Card A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:524 +msgid "Card B" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1736 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:1765 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1307 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1782 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1400 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1875 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1438 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1916 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:1938 msgid "Checked id" msgstr "" +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 +msgid "Ratings" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:24 msgid "The title" msgstr "" @@ -8506,25 +9462,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 +9576,62 @@ 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/ipc/job.py:43 msgid "Waiting..." msgstr "" @@ -8660,34 +9701,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 +9756,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 +9789,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:606 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:703 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:705 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:711 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:713 msgid " from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:666 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:715 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:828 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:849 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:854 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:860 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:862 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:943 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:959 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:969 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:981 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:1021 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:1211 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:1282 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:1293 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:1310 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:1457 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:1473 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." @@ -8855,55 +9900,55 @@ msgstr "" 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 +9957,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 +10328,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 +10347,8 @@ 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." diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index 3e1ee35289..256bad7b7d 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-11 16:03+MDT\n" -"PO-Revision-Date: 2010-06-11 16:03+MDT\n" +"Project-Id-Version: calibre 0.7.4\n" +"POT-Creation-Date: 2010-06-19 18:08+MDT\n" +"PO-Revision-Date: 2010-06-19 18:08+MDT\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -21,11 +21,11 @@ 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/prs505/sony_cache.py:432 #: /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 @@ -38,12 +38,12 @@ msgstr "" #: /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:382 #: /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 @@ -52,8 +52,8 @@ msgstr "" #: /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 @@ -99,44 +99,46 @@ 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/__init__.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:809 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:812 #: /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:665 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:674 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:955 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:866 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1159 #: /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:491 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:492 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:348 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:368 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:843 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1015 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1300 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1303 +#: /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:861 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1037 +#: /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:330 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:342 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:916 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:985 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1586 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1588 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1710 #: /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/localization.py:115 #: /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 @@ -257,62 +259,62 @@ 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:301 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:331 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:342 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:355 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:367 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:375 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:388 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:399 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:434 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:447 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:461 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:475 msgid "This profile is intended for the B&N Nook." msgstr "" @@ -332,19 +334,19 @@ msgstr "" 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:292 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:310 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:319 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:417 msgid "This profile is intended for the Amazon Kindle DX." msgstr "" @@ -364,15 +366,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 "" -#: /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" @@ -380,27 +386,27 @@ msgid "" " " msgstr "" -#: /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 "" -#: /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 "" @@ -412,59 +418,70 @@ msgstr "" 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:70 msgid "Communicate with S60 phones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:75 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:77 msgid "Communicate with iBooks through iTunes." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:81 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:83 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:226 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:229 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:921 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:947 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:300 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:337 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:841 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:875 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:952 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:344 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:880 msgid "finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:499 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:518 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/apple/driver.py:741 #: /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/apple/driver.py:743 #: /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:812 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:2178 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:810 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:816 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 +#: /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:1470 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:128 +msgid "News" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/binatone/driver.py:17 msgid "Communicate with the Binatone Readme eBook reader." msgstr "" @@ -487,6 +504,10 @@ msgstr "" msgid "Communicate with the EB600 eBook reader." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:207 +msgid "Communicate with the PocketBook 301 reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" msgstr "" @@ -499,6 +520,10 @@ msgstr "" msgid "Communicate with the ESlick eBook reader." msgstr "" +#: /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." @@ -513,14 +538,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: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 "" @@ -567,15 +596,15 @@ 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 "" @@ -619,11 +648,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:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 msgid "Unnamed" msgstr "" @@ -644,59 +673,48 @@ 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:248 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:428 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:493 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:586 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:598 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:606 msgid "Unable to mount main memory (Error code: %d)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:742 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:743 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:745 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:747 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:776 msgid "There is insufficient free space in main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:777 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:779 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:778 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:780 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 "" @@ -706,16 +724,20 @@ 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 +#: /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:36 +msgid "Use author sort instead of author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:38 msgid "Template to control how books are saved" 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 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 msgid "Extra customization" msgstr "" @@ -1247,7 +1269,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 @@ -1491,84 +1513,88 @@ 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:381 #: /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/delete_matching_from_device.py:69 #: /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:345 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:848 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:866 +#: /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/ebooks/metadata/__init__.py:382 #: /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:350 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:849 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:867 msgid "Author(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:374 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:383 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:62 msgid "Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:375 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:384 #: /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/ebooks/metadata/__init__.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:215 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 #: /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:306 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1034 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1056 msgid "Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:384 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393 +#: /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:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:295 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1030 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:103 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1052 +#: /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:395 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /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:311 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1039 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:102 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 +#: /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:396 msgid "Language" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:389 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1022 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1044 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:400 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:60 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 msgid "Rights" msgstr "" @@ -1576,7 +1602,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 "" @@ -1662,6 +1688,10 @@ msgstr "" msgid "No cover found" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:41 +msgid "Downloads metadata from Douban.com" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:33 msgid "Metadata download" msgstr "" @@ -1698,6 +1728,10 @@ msgstr "" msgid "Downloads social metadata from amazon.com" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:205 +msgid "Downloads series information from librarything.com" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94 msgid "" "\n" @@ -1751,7 +1785,7 @@ msgid "" "Fetch a cover image 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/metadata/opf2.py:1222 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1371 msgid "Cover" msgstr "" @@ -2017,6 +2051,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 "" @@ -2193,7 +2229,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 @@ -2272,23 +2308,391 @@ 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:153 #: /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:187 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:187 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:397 msgid "Choose Files" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:242 +msgid "Use library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:243 +msgid "User annotations generated from main library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:666 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:723 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1037 +msgid "No books selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:74 +msgid "No books selected to fetch annotations from" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:99 +msgid "Merging user annotations into database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:127 +msgid "%s
Last Page Read: %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:133 +msgid "%s
Last Page Read: Location %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:152 +msgid "Location %d • %s
%s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:161 +msgid "Page %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:166 +msgid "Location %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:288 +msgid "How many empty books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:289 +msgid "How many empty books should be added?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:388 +msgid "Uploading books to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:139 +msgid "Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:349 +msgid "EPUB Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:350 +msgid "LRF Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:351 +msgid "HTML Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:352 +msgid "LIT Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:353 +msgid "MOBI Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:354 +msgid "Topaz books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:355 +msgid "Text books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:356 +msgid "PDF Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:357 +msgid "Comics" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:358 +msgid "Archives" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:362 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:397 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:398 +msgid "Some duplicates were found and merged into the following existing books:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:407 +msgid "Failed to read metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:408 +msgid "Failed to read metadata from the following" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:432 +msgid "Add to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:457 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1214 +msgid "No book selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:432 +msgid "No book files found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:454 +msgid "Cannot delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:467 +msgid "Choose formats to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:485 +msgid "Choose formats not to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:505 +msgid "Cannot delete books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:506 +msgid "No device is connected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:516 +msgid "Main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:517 +#: /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/actions.py:518 +#: /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/actions.py:523 +msgid "No books to delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:524 +msgid "None of the selected books are on the device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:598 +msgid "Deleting books from device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:562 +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:583 +msgid "The selected books will be permanently deleted from your device. Are you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:608 +msgid "Cannot download metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:624 +msgid "social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:626 +msgid "covers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:626 +msgid "metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:628 +msgid "Downloading %s for %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:650 +msgid "Failed to download some metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:651 +msgid "Failed to download metadata for the following:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:654 +msgid "Failed to download metadata:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:946 +#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 +msgid "Error" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:665 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:703 +msgid "Cannot edit metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:725 +msgid "Cannot merge books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:726 +msgid "At least two books must be selected for merging" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:730 +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:741 +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:753 +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:853 +msgid "Cannot save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:856 +msgid "Choose destination directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:889 +msgid "Error while saving" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:890 +msgid "There was an error while saving." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:897 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:898 +msgid "Could not save some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:899 +msgid "Click the show details button to see which ones." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:920 +msgid "No books selected to generate catalog for" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:937 +msgid "Generating %s catalog..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:261 +msgid "No books found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:943 +msgid "" +"No books to catalog\n" +"Check exclude tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:953 +msgid "Catalog generated." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:956 +msgid "Export Catalog Directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:957 +msgid "Select destination for %s.%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:973 +msgid "Fetching news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:987 +msgid " fetched." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1036 +msgid "Cannot convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1065 +msgid "Starting conversion of %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1250 +msgid "Cannot view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1195 +#: /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:1203 +msgid "Multiple Books Selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +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:1213 +msgid "Cannot open folder" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1251 +msgid "%s has no available formats." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/add.py:54 msgid "Searching in" msgstr "" @@ -2310,15 +2714,10 @@ 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:608 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:809 msgid "No books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1432 -msgid "No books found" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/add.py:327 msgid "Added" msgstr "" @@ -2426,17 +2825,17 @@ 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/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/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:551 +#: /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:566 +#: /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:586 +#: /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:590 +#: /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:628 #: /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 @@ -2455,8 +2854,8 @@ 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 @@ -2484,6 +2883,58 @@ 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:53 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:309 +#: /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:1042 +msgid "Path" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /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: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:870 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1045 +msgid "Collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:55 +msgid "Click to open" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /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:1051 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1055 +#: /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 +msgid "None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:308 +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 "" @@ -2543,7 +2994,7 @@ msgstr "" #: /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 @@ -2561,8 +3012,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:1433 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1451 msgid "Catalog" msgstr "" @@ -3221,11 +3672,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:1677 -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 "" @@ -3515,11 +3961,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:120 +#: /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:172 +#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:171 msgid "Browse by covers" msgstr "" @@ -3568,262 +4014,269 @@ msgstr "" msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:45 #: /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:143 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:145 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:250 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:276 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:286 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:295 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:304 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:319 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:336 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:381 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:392 +#: /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 msgid "Email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:398 msgid " and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:409 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:411 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:414 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:423 -msgid "Main Memory" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:425 -msgid "Storage Card A" +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 B" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:443 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:483 msgid "Connect to folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 msgid "Disconnect from folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:494 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:496 msgid "Fetch annotations (experimental)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:609 -msgid "selected to send" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:614 -msgid "Choose format to send to device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:622 -msgid "No device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:623 -msgid "Cannot send: No device is connected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:626 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:630 -msgid "No card" +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:606 +msgid "Error communicating with device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:631 -msgid "Cannot send: Device has no storage card" +msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:672 -msgid "E-book:" +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:669 +msgid "Failed" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:675 -msgid "Attached, you will find the e-book" +msgid "Error talking to device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:676 +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:717 +msgid "Device: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719 +msgid " detected." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:742 +msgid "Connected " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:810 +msgid "selected to send" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:815 +msgid "Choose format to send to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 +msgid "No device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:824 +msgid "Cannot send: No device is connected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 +msgid "No card" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:828 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:832 +msgid "Cannot send: Device has no storage card" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:873 +msgid "E-book:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +msgid "Attached, you will find the e-book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:677 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:690 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:891 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:727 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:819 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:999 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1006 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1020 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1200 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:721 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:922 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:728 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:929 msgid "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:746 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:747 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:948 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:778 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:979 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:779 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:790 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:991 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:820 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1000 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1082 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:849 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1113 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1167 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1208 msgid "Could not upload the following books to the device, as no suitable formats were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1055 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1256 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1056 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1257 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 "" -#: /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:1020 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:99 -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:301 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:100 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:91 -msgid "Formats" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68 msgid "Fit &cover to view" msgstr "" @@ -3963,159 +4416,159 @@ msgstr "" msgid "new email address" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:489 +msgid "Wide" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 +msgid "Narrow" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:500 msgid "System port selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:501 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:171 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1144 -#: /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:521 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:524 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:525 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:526 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:577 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:578 msgid "%s is not a valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:581 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:593 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:594 msgid "The plugin: %s cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:603 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:604 msgid "Plugin: %s does not need customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:612 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:650 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:651 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:682 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:687 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:688 #: /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:689 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:756 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:763 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:419 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:791 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:343 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:815 #: /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:822 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:823 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:881 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:886 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:882 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:883 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:887 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:892 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:893 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:927 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:947 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:952 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:953 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 "" @@ -4207,296 +4660,305 @@ msgstr "" 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/dialogs/config/config_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 #: /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:549 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:550 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:552 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:553 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:554 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:555 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:556 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:557 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:558 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:559 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:560 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:561 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:562 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:563 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:564 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:567 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:568 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:569 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:570 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:571 msgid "Show cover &browser in a separate window (needs restart)" 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:572 +msgid "Show &average ratings in the tags browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 msgid "Search as you type" 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:574 msgid "Automatically send downloaded &news to ebook reader" 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:575 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:576 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 msgid "Toolbar" 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:578 msgid "Large" 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:579 msgid "Medium" 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:580 msgid "Small" 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:581 msgid "&Button size in toolbar" 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:582 msgid "Show &text in toolbar buttons" 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:583 msgid "Select visible &columns in library view" 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:585 msgid "Remove a user-defined column" 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:587 msgid "Add a user-defined column" 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:589 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:592 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:593 +msgid "User Interface &layout (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594 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:595 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:596 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:597 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:598 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:599 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:600 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:601 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:602 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:603 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:604 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:605 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:606 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:607 #: /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:608 #: /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:609 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:610 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:611 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:612 #: /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:613 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:614 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:615 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:616 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:617 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:618 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:619 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:620 #: /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:608 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 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:623 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:624 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:625 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:626 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:627 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:629 msgid "&Add" msgstr "" @@ -4543,9 +5005,10 @@ 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/dialogs/delete_matching_from_device.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:850 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:535 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:868 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Date" msgstr "" @@ -4755,6 +5218,31 @@ msgstr "" msgid "ERROR" msgstr "" +#: +#: /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:1041 +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:63 msgid "Author Sort" msgstr "" @@ -4953,11 +5441,6 @@ msgstr "" 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:876 -msgid "Books" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:167 msgid "No permission" msgstr "" @@ -4996,67 +5479,75 @@ msgstr "" msgid "Abort the editing of all remaining books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:444 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:450 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:453 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532 +msgid "Cannot use tag editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:533 +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 msgid "Downloading 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:565 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 +#: /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:561 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:572 +#: /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:562 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:567 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:566 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 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:578 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:583 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:579 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:584 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:617 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:618 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:642 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:647 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:648 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:714 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:719 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:720 msgid "Could not open %s. Is it being used by another program?" msgstr "" @@ -5409,12 +5900,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 "" @@ -5520,12 +6011,12 @@ 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/tag_view.py:500 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/tag_view.py:501 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -5557,23 +6048,23 @@ msgstr "" msgid "Are you certain you want to delete the following items?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py: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 "" @@ -5834,135 +6325,140 @@ msgstr "" msgid "Regular expression (?P)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:33 +#: /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:49 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:52 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:52 +#: /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:55 +#: /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:57 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:60 msgid "Download only metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:62 msgid "Download only covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:65 msgid "Download only social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:71 msgid "Merge into first selected book - delete others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:74 msgid "Merge into first selected book - keep others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:82 msgid "Add books from a single directory" 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 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:85 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:88 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:88 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:91 msgid "Add Empty book. (Book entry with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:101 #: /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:100 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:103 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1782 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:405 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1785 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:408 msgid "Save only %s format to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:289 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:119 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125 msgid "Remove selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:127 msgid "Remove files of a specific format from selected books.." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:130 msgid "Remove all formats from selected books, except..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:133 msgid "Remove covers from selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:136 +msgid "Remove matching books from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:153 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:155 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:159 msgid "Create catalog of books in your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:167 msgid "Run welcome wizard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:199 msgid "Similar books..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230 +msgid "Add books to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:309 msgid "Cover Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:327 msgid "Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:336 -msgid "Side bar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:384 msgid "Book Details" msgstr "" @@ -6013,15 +6509,15 @@ msgstr "" msgid "Unavailable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:280 msgid "Jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 +#: /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:354 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:358 msgid " - Jobs" msgstr "" @@ -6045,52 +6541,30 @@ msgstr "" msgid "Rating" msgstr "" -#: /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:305 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1029 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1033 -#: /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 -msgid "None" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:311 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1039 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:656 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1097 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:398 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:847 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:865 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:851 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:869 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:852 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1023 -#: /home/kovid/work/calibre/src/calibre/gui2/status.py:101 -msgid "Collections" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1019 -msgid "Format" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1079 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1108 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1082 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1111 msgid "Double click to edit me

" msgstr "" @@ -6134,11 +6608,11 @@ msgstr "" msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:509 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:510 msgid "Dropping onto a device is not supported. First add the book to the calibre library." msgstr "" @@ -6498,20 +6972,20 @@ 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:89 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:251 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:304 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:346 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:379 msgid "Saved Searches" msgstr "" @@ -6587,61 +7061,74 @@ 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:190 +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:194 +msgid "Edit sort for '%s'" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:199 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:202 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:206 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:213 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:217 +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:220 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:227 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:231 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:432 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:266 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:510 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:511 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:726 +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:726 +msgid "Sort by popularity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:727 +msgid "Sort by average rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:733 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:733 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:738 msgid "Manage &user categories" msgstr "" @@ -6680,449 +7167,104 @@ msgstr "" 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:172 -msgid "Error communicating with device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:162 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:191 +#: /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:194 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:172 msgid "&Restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:240 +#: /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:246 +#: /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:283 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:240 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:347 -msgid "Select folder to open as device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:485 -msgid "Device: " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:487 -msgid " detected." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:519 -msgid "Connected " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:531 -msgid "Device database corrupted" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:532 -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:595 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:772 -msgid "Use library only" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:596 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:773 -msgid "User annotations generated from main library only" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:603 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1098 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1155 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1193 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1214 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1344 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1409 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1527 -msgid "No books selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:604 -msgid "No books selected to fetch annotations from" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:629 -msgid "Merging user annotations into database" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:657 -msgid "%s
Last Page Read: %d (%d%%)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:663 -msgid "%s
Last Page Read: Location %d (%d%%)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:682 -msgid "Location %d • %s
%s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:691 -msgid "Page %d • %s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:696 -msgid "Location %d • %s
" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:816 -msgid "How many empty books?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:817 -msgid "How many empty books should be added?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:865 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:916 -msgid "Uploading books to device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:877 -msgid "EPUB Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:878 -msgid "LRF Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:879 -msgid "HTML Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:880 -msgid "LIT Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:881 -msgid "MOBI Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:882 -msgid "Topaz books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:883 -msgid "Text books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:884 -msgid "PDF Books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:885 -msgid "Comics" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:886 -msgid "Archives" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:890 -msgid "Supported books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:925 -msgid "Merged some books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:926 -msgid "Some duplicates were found and merged into the following existing books:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:935 -msgid "Failed to read metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:936 -msgid "Failed to read metadata from the following" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:956 -msgid "Cannot delete" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:959 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1671 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1696 -msgid "No book selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:969 -msgid "Choose formats to be deleted" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:987 -msgid "Choose formats not to be deleted" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1025 -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:1046 -msgid "The selected books will be permanently deleted from your device. Are you sure?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1061 -msgid "Deleting books from device." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1097 -msgid "Cannot download metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1113 -msgid "social metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1115 -msgid "covers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1115 -msgid "metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1117 -msgid "Downloading %s for %d book(s)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1139 -msgid "Failed to download some metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1140 -msgid "Failed to download metadata for the following:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1143 -msgid "Failed to download metadata:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1154 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1192 -msgid "Cannot edit metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1213 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1216 -msgid "Cannot merge books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1217 -msgid "At least two books must be selected for merging" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1221 -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:1232 -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:1244 -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:1343 -msgid "Cannot save to disk" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1346 -msgid "Choose destination directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1379 -msgid "Error while saving" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1380 -msgid "There was an error while saving." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1387 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1388 -msgid "Could not save some books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1389 -msgid "Click the show details button to see which ones." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1410 -msgid "No books selected to generate catalog for" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1427 -msgid "Generating %s catalog..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1433 -msgid "" -"No books to catalog\n" -"Check exclude tags" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1443 -msgid "Catalog generated." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1446 -msgid "Export Catalog Directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1447 -msgid "Select destination for %s.%s" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1461 -msgid "Fetching news from " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1475 -msgid " fetched." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1526 -msgid "Cannot convert" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1555 -msgid "Starting conversion of %d book(s)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1671 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1729 -msgid "Cannot view" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1685 -msgid "Multiple Books Selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1686 -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:1695 -msgid "Cannot open folder" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1730 -msgid "%s has no available formats." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1764 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1769 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:392 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1765 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:388 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1770 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:393 msgid "Cannot configure before calibre is restarted." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1817 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:438 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1818 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:439 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1870 -msgid "Failed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1876 -msgid "Error talking to device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1877 -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:1900 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1928 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:517 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1901 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:490 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:1914 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:503 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1929 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:518 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1969 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:558 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:1994 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1997 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:586 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:2001 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:590 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2053 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:642 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:2072 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:52 msgid "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2080 +#: /home/kovid/work/calibre/src/calibre/gui2/update.py:60 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2081 +#: /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 "" @@ -7889,48 +8031,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:275 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:273 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:278 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:276 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:281 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:284 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:285 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:435 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 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:435 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 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:438 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 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:438 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 msgid "empty" msgstr "" @@ -8264,7 +8406,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 "" @@ -8343,43 +8485,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:520 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:489 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:522 msgid "Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:491 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:524 msgid "Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1665 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1736 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:1765 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1711 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1782 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1804 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1875 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1845 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1916 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:1938 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 "" @@ -8534,43 +8680,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 "" @@ -8712,34 +8858,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 "" @@ -8797,91 +8947,91 @@ msgstr "" msgid "Unknown News Source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:605 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:606 msgid "The \"%s\" recipe needs a username and password." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:703 msgid "Download finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:704 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:705 msgid "Failed to download the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:710 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:711 msgid "Failed to download parts of the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:712 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:713 msgid " from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:714 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:715 msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:831 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:828 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:852 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:849 msgid "Fetching feeds..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:857 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:854 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:863 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:860 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:865 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:862 msgid "Generating masthead..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:946 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:943 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:962 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:959 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:972 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:969 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:984 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:981 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1024 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1021 msgid "Masthead image downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1220 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1211 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1291 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1282 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1302 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1293 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1319 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1310 msgid "Fetching feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1466 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1457 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:1482 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1473 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 "" @@ -8900,46 +9050,46 @@ msgstr "" 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 a link, it will be ignored.By default, no links are ignored. If both --filter-regexp and --match-regexp are specified, then --filter-regexp is 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 "" diff --git a/src/calibre/translations/cs.po b/src/calibre/translations/cs.po index 46a575ebe3..65d3cfe0a7 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-06-18 17:57+0000\n" +"PO-Revision-Date: 2010-06-18 17:14+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-06-19 03:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -23,12 +23,12 @@ 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:432 +#: /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/ebooks/chm/metadata.py:56 @@ -40,22 +40,22 @@ msgstr "Nedělá vůbec nic" #: /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:382 #: /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/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 @@ -101,44 +101,46 @@ 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/__init__.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:809 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:812 #: /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/device.py:866 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1159 #: /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/metadata_single.py:492 #: /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:351 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1037 +#: /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:330 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:342 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:916 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:985 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1586 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1588 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1710 #: /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/localization.py:115 #: /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 @@ -292,62 +294,62 @@ 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:301 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:331 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:342 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:355 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:367 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:375 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:388 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:399 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:434 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:447 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:461 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:475 msgid "This profile is intended for the B&N Nook." msgstr "Tento profil je určen pro B&N Nook." @@ -374,15 +376,15 @@ msgstr "" 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:292 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:310 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:319 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -390,7 +392,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:417 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Tento profil je určený pro Amazon Kindle DX." @@ -410,15 +412,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 +436,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" @@ -469,59 +475,70 @@ 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:70 msgid "Communicate with S60 phones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:46 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:78 msgid "Communicate with iBooks through iTunes." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:84 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:227 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:230 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:301 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:338 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:842 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:876 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:345 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:881 msgid "finished" -msgstr "" +msgstr "hotovo" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:452 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:519 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/apple/driver.py:742 #: /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/apple/driver.py:744 #: /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:813 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:2168 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:810 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:816 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 +#: /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:1470 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:128 +msgid "News" +msgstr "Zprávy" + #: /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 +561,10 @@ 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:207 +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 +577,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 +595,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 +635,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,15 +655,15 @@ 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." @@ -676,7 +707,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: " @@ -684,7 +715,7 @@ msgstr "" "Čárkami oddělený seznam metadata polí ze kterých se má vytvořït Sbírka na " "zařízeni. Možnosti zahrnují: " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:140 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 msgid "Unnamed" msgstr "Nepojmenovaný" @@ -705,23 +736,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:248 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:428 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:493 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:586 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:598 msgid "" "Unable to detect the %s disk drive. Your kernel is probably exporting a " "deprecated version of SYSFS." @@ -729,39 +760,28 @@ 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:606 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:742 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:743 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:745 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:747 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:776 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:778 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:780 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í" @@ -771,57 +791,61 @@ 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/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 +msgid "Use author sort instead of author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:38 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:41 +#: /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 +#: /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/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 +#: /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 "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 +#: /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 "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 +#: /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 "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:294 msgid "Sending metadata to device..." msgstr "Odesílám metadata do zařízení..." @@ -1365,6 +1389,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 +1558,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" @@ -1878,84 +1905,88 @@ 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:381 #: /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/delete_matching_from_device.py:69 #: /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/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:866 +#: /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/ebooks/metadata/__init__.py:382 #: /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/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:867 msgid "Author(s)" msgstr "Autor(ři)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:374 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:383 #: /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/gui2/library/models.py:62 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:384 #: /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/ebooks/metadata/__init__.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:208 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 #: /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:307 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1056 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:393 +#: /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: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:63 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1052 +#: /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:395 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /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:64 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 +#: /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:396 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:398 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1044 msgid "Timestamp" msgstr "Časová značka" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:400 #: /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/gui2/library/models.py:60 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:402 msgid "Rights" msgstr "Práva" @@ -1963,7 +1994,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,6 +2095,10 @@ msgstr "Obálka uložena do" msgid "No cover found" msgstr "Obálka nenalezena" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:41 +msgid "Downloads metadata from Douban.com" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:33 msgid "Metadata download" msgstr "Stáhnutí metadat" @@ -2104,6 +2139,10 @@ msgstr "" msgid "Downloads social metadata from amazon.com" msgstr "Stáhnout sociální metadata z amazon.com" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:205 +msgid "Downloads series information from librarything.com" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94 msgid "" "\n" @@ -2166,7 +2205,7 @@ msgstr "" "\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/metadata/opf2.py:1222 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1371 msgid "Cover" msgstr "Obálka" @@ -2453,6 +2492,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 +2701,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,23 +2779,418 @@ 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:153 #: /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:187 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:187 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:397 msgid "Choose Files" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:242 +msgid "Use library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:243 +msgid "User annotations generated from main library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:666 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:723 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1037 +msgid "No books selected" +msgstr "Nejsou označeny žádné knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:74 +msgid "No books selected to fetch annotations from" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:99 +msgid "Merging user annotations into database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:127 +msgid "%s
Last Page Read: %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:133 +msgid "%s
Last Page Read: Location %d (%d%%)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:152 +msgid "Location %d • %s
%s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:161 +msgid "Page %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:166 +msgid "Location %d • %s
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:288 +msgid "How many empty books?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:289 +msgid "How many empty books should be added?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:388 +msgid "Uploading books to device." +msgstr "Odesílám knihy do zařízení" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:139 +msgid "Books" +msgstr "Knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:349 +msgid "EPUB Books" +msgstr "EPUB knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:350 +msgid "LRF Books" +msgstr "LRF knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:351 +msgid "HTML Books" +msgstr "HTML knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:352 +msgid "LIT Books" +msgstr "LIT knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:353 +msgid "MOBI Books" +msgstr "MOBI knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:354 +msgid "Topaz books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:355 +msgid "Text books" +msgstr "TXT knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:356 +msgid "PDF Books" +msgstr "PDF knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:357 +msgid "Comics" +msgstr "Komiksy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:358 +msgid "Archives" +msgstr "Archívy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:362 +msgid "Supported books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:397 +msgid "Merged some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:398 +msgid "" +"Some duplicates were found and merged into the following existing books:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:407 +msgid "Failed to read metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:408 +msgid "Failed to read metadata from the following" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:432 +msgid "Add to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:457 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1214 +msgid "No book selected" +msgstr "Není označena žádná kniha" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:432 +msgid "No book files found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:454 +msgid "Cannot delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:467 +msgid "Choose formats to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:485 +msgid "Choose formats not to be deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:505 +msgid "Cannot delete books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:506 +msgid "No device is connected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:516 +msgid "Main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:517 +#: /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/actions.py:518 +#: /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/actions.py:523 +msgid "No books to delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:524 +msgid "None of the selected books are on the device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:598 +msgid "Deleting books from device." +msgstr "Mažu knihy ze zařízení." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:562 +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:583 +msgid "" +"The selected books will be permanently deleted from your device. Are " +"you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:608 +msgid "Cannot download metadata" +msgstr "Nemůžu stáhnout metadata." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:624 +msgid "social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:626 +msgid "covers" +msgstr "obálky" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:626 +msgid "metadata" +msgstr "metadata" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:628 +msgid "Downloading %s for %d book(s)" +msgstr "Stahuji %s pro %d knihu(y)" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:650 +msgid "Failed to download some metadata" +msgstr "Selhalo stahování některých metadat" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:651 +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:654 +msgid "Failed to download metadata:" +msgstr "Selhalo stahování metadat:" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:946 +#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 +msgid "Error" +msgstr "Chyba" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:665 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:703 +msgid "Cannot edit metadata" +msgstr "Nemůžu upravit metadata" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:725 +msgid "Cannot merge books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:726 +msgid "At least two books must be selected for merging" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:730 +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:741 +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:753 +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:853 +msgid "Cannot save to disk" +msgstr "Chyba zápisu na disk" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:856 +msgid "Choose destination directory" +msgstr "Zvolte cílový adresář" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:889 +msgid "Error while saving" +msgstr "Chyba při ukládání" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:890 +msgid "There was an error while saving." +msgstr "Při ukládání nastala chyba." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:897 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:898 +msgid "Could not save some books" +msgstr "Nemohu uložit některé knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:899 +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:920 +msgid "No books selected to generate catalog for" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:937 +msgid "Generating %s catalog..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:261 +msgid "No books found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:943 +msgid "" +"No books to catalog\n" +"Check exclude tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:953 +msgid "Catalog generated." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:956 +msgid "Export Catalog Directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:957 +msgid "Select destination for %s.%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:973 +msgid "Fetching news from " +msgstr "Získávám zprávy z " + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:987 +msgid " fetched." +msgstr " získány." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1036 +msgid "Cannot convert" +msgstr "Nemůžu převást" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1065 +msgid "Starting conversion of %d book(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1250 +msgid "Cannot view" +msgstr "Nemůžu zobrazit" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1195 +#: /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:1203 +msgid "Multiple Books Selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +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:1213 +msgid "Cannot open folder" +msgstr "Nemohu otevřít adresář" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1251 +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" @@ -2776,15 +3212,10 @@ 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/device.py:809 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 msgid "Added" msgstr "" @@ -2904,17 +3335,17 @@ 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/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/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:551 +#: /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:566 +#: /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:586 +#: /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:590 +#: /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:628 #: /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 @@ -2933,17 +3364,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 +3396,58 @@ 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:53 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:302 +#: /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:1042 +msgid "Path" +msgstr "Cesta" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /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:96 +msgid "Formats" +msgstr "Formáty" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1045 +msgid "Collections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:55 +msgid "Click to open" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /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:1051 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1055 +#: /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 +msgid "None" +msgstr "Žádné" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:301 +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 "" @@ -3024,7 +3507,7 @@ msgstr "výstup" #: /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 +3525,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:1433 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1451 msgid "Catalog" msgstr "Katalog" @@ -3385,6 +3868,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" @@ -3725,11 +4211,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 +4291,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:73 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:74 msgid "Invalid regular expression: %s" msgstr "" @@ -3835,7 +4316,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 +4328,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 "" @@ -4023,11 +4504,19 @@ 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/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 +4537,294 @@ 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:357 msgid "Remove all tags" -msgstr "" +msgstr "Odstranit všechny tagy" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:378 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:383 msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:45 #: /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:145 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:250 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:276 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:286 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:295 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:304 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:319 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:336 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:346 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:381 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: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 msgid "Email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:398 +msgid " and delete from library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 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:409 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:411 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:416 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:425 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:443 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:444 msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:483 msgid "Connect to folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 msgid "Disconnect from folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:496 msgid "Fetch annotations (experimental)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:606 +msgid "Error communicating with device" +msgstr "Cyba komunikace se zařízením" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 +msgid "Select folder to open as device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:669 +msgid "Failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:675 +msgid "Error talking to device" +msgstr "Chyba komunikace se zařízením" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:676 +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:717 +msgid "Device: " +msgstr "Zařízení: " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719 +msgid " detected." +msgstr " nalezeno." + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:742 +msgid "Connected " +msgstr "Připojeno " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:810 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:815 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:823 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:824 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:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 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:828 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:832 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:873 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:667 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 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/device.py:877 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 msgid "by" msgstr "od" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 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:891 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:921 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1020 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1200 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 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:922 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:929 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:947 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:948 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:952 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:770 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:979 msgid "News:" msgstr "Zprávy:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:782 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:991 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:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1082 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 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:1050 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:1113 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:1167 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:1208 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1256 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:1257 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" @@ -4467,167 +4970,167 @@ msgstr "" msgid "new email address" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:489 +msgid "Wide" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 +msgid "Narrow" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:500 msgid "System port selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:501 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:521 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:524 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:525 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:526 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:577 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:578 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:581 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:593 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:594 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:603 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:604 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:612 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:650 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:651 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:682 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:687 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:688 #: /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:689 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:756 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:763 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:791 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:343 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:815 #: /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:822 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:823 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:881 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:886 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:882 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:883 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:887 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:892 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:893 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:927 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:947 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:952 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:953 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 " @@ -4738,13 +5241,14 @@ msgstr "" 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:548 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /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:549 msgid "" "&Location of ebooks (The ebooks are stored in folders sorted by author and " "metadata is stored in the file metadata.db)" @@ -4752,27 +5256,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:550 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:552 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:553 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:554 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:555 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:556 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" @@ -4780,166 +5284,174 @@ 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:557 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:558 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:559 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:560 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:561 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:562 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:563 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:564 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:567 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:568 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:569 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:570 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:571 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572 +msgid "Show &average ratings in the tags browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:576 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577 msgid "Toolbar" msgstr "Panel nástrojů" -#: /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:578 msgid "Large" msgstr "Velké" -#: /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:579 msgid "Medium" msgstr "Střední" -#: /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:580 msgid "Small" msgstr "Malé" -#: /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:581 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:582 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:583 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:585 msgid "Remove a user-defined column" 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:587 msgid "Add a user-defined column" 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:589 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:592 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:593 +msgid "User Interface &layout (needs restart):" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594 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:595 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:596 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:597 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:598 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:599 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:600 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:601 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:602 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:603 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:604 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:605 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 +5461,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:606 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:607 #: /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:608 #: /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:609 msgid "" "If you leave the password blank, anyone will be able to access your book " "collection using the web interface." @@ -4975,7 +5487,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:610 msgid "" "The maximum size (widthxheight) for displayed covers. Larger covers are " "resized. " @@ -4983,45 +5495,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:611 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:612 #: /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:613 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:614 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:615 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:616 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:617 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:618 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:619 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:620 #: /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 +5544,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:622 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:623 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:624 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:625 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:626 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:627 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:629 msgid "&Add" msgstr "Přid&at" @@ -5096,10 +5608,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:28 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:868 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Date" msgstr "Datum" @@ -5115,68 +5628,69 @@ 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:30 msgid "Floating point numbers" msgstr "" -#: /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:32 msgid "Integers" msgstr "" -#: /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:34 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:37 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:61 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:62 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:66 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:97 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:99 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:108 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:114 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:124 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:126 msgid "" "The lookup name must be lower case and cannot contain \":\"s or spaces" msgstr "" @@ -5285,6 +5799,27 @@ msgstr "&Znovu zobrazit toto upozornění" msgid "ERROR" msgstr "CHYBA" +#: /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:1041 +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:63 msgid "Author Sort" msgstr "Autor (seřadit jako)" @@ -5491,11 +6026,6 @@ msgstr "" 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 msgid "No permission" msgstr "" @@ -5534,67 +6064,75 @@ msgstr "" 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:445 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:450 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:453 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:532 +msgid "Cannot use tag editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:533 +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 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: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:559 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:570 +#: /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:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:567 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:571 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:583 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:584 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:617 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:618 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:647 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:648 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:719 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:720 msgid "Could not open %s. Is it being used by another program?" msgstr "" @@ -5951,12 +6489,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é" @@ -6071,12 +6609,12 @@ 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/tag_view.py:500 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/tag_view.py:501 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -6108,25 +6646,25 @@ msgstr "" msgid "Are you certain you want to delete the following items?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py: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 +6918,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: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 msgid "No match" msgstr "Žádná shoda" @@ -6420,54 +6958,209 @@ 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:60 +msgid "Download only metadata" +msgstr "Stáhnout pouze metadata" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:62 +msgid "Download only covers" +msgstr "Stáhnout pouze obálky" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:65 +msgid "Download only social metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:71 +msgid "Merge into first selected book - delete others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:74 +msgid "Merge into first selected book - keep others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:82 +msgid "Add books from a single directory" +msgstr "Přidat Knihy z jednoho adresáře" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:84 +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:88 +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:91 +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:101 +#: /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:103 +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:105 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:405 +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:109 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:408 +msgid "Save only %s format to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:289 +msgid "View" +msgstr "Zobrazit" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:119 +msgid "View specific format" +msgstr "Zobrazit určitý formát" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125 +msgid "Remove selected books" +msgstr "Smazat vybrané knihy" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:127 +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:130 +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:133 +msgid "Remove covers from selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:136 +msgid "Remove matching books from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:153 +msgid "Convert individually" +msgstr "Převést Individuálně" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:155 +msgid "Bulk convert" +msgstr "Převést dávkově" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:159 +msgid "Create catalog of books in your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:167 +msgid "Run welcome wizard" +msgstr "Spustit uvítacího průvodce" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:199 +msgid "Similar books..." +msgstr "Podobné knihy..." + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230 +msgid "Add books to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:309 +msgid "Cover Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:327 +msgid "Tag Browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:384 +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 +7172,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:56 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:58 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:61 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:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 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:662 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:398 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:865 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:869 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:1108 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:1111 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:509 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:510 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -6682,282 +7353,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:84 +msgid "Choose a location for your calibre e-book library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +msgid "Failed to create library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94 +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 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:151 +msgid "Initializing user interface..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:176 +msgid "Repairing failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:177 +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 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:192 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:205 msgid "Corrupted database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:206 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:212 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:225 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:236 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:281 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:283 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:284 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:287 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:289 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:291 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:294 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:296 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:308 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 +7631,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:89 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:251 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:304 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:346 +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:379 +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 +7720,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:190 +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:194 +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:199 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:202 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:206 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:213 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:217 +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:220 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:227 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:231 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:432 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:266 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:510 +msgid "Duplicate search name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 +msgid "The saved search name %s is already used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:726 +msgid "Sort by name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:726 +msgid "Sort by popularity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:727 +msgid "Sort by average rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:733 +msgid "Match all" +msgstr "Porovnat vše" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:733 +msgid "Match any" +msgstr "Najít kterékoliv" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:738 +msgid "Manage &user categories" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:63 @@ -7175,631 +7830,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:240 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:387 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:392 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:388 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:393 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:438 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:439 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:489 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:517 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:490 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:503 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:518 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2491 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:558 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:583 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:586 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:590 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:642 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,11 +7935,11 @@ 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?" @@ -8280,82 +8408,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:198 msgid "Copy Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:199 msgid "Paste Image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:228 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:229 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:230 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:231 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:235 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:238 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:239 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:240 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:248 msgid "Books located at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:506 msgid "Change Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:507 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:508 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:509 msgid "Swap Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:510 msgid "Title Case" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:932 +msgid "Drag to resize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:963 +msgid "Show" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:968 +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 +8758,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:275 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:273 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:278 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:276 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:281 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:284 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:285 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:435 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 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:435 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 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:438 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 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:438 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 msgid "empty" msgstr "" @@ -8885,7 +9025,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 +9177,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" @@ -9119,43 +9259,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:520 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:489 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:522 msgid "Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:491 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:524 msgid "Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1542 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1736 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:1765 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1588 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1782 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1681 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1875 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1720 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1916 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:1938 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 +9485,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 "" @@ -9520,34 +9664,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 +9752,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:606 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:703 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:705 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:711 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:713 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:715 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:828 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:849 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:854 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:860 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:862 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:943 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:959 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:969 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:981 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:1021 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:1211 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:1282 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:1293 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:1310 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:1457 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:1473 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." @@ -9715,7 +9863,7 @@ msgstr "Naplánováno" 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 +9873,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 +9892,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 +9900,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 +9914,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 +9925,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 +9939,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 +10765,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 +11033,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,6 +11060,33 @@ 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." diff --git a/src/calibre/translations/de.po b/src/calibre/translations/de.po index 7e61589c11..09c2e17eda 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-06-18 17:57+0000\n" +"PO-Revision-Date: 2010-06-18 17:13+0000\n" +"Last-Translator: Kovid Goyal \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-06-19 03:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -24,12 +24,12 @@ 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:432 +#: /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/ebooks/chm/metadata.py:56 @@ -41,22 +41,22 @@ msgstr "Macht absolut gar nichts" #: /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:382 #: /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/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 @@ -102,44 +102,46 @@ 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/__init__.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:809 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:812 #: /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/device.py:866 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1159 #: /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/metadata_single.py:492 #: /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:351 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1037 +#: /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:330 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:342 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:916 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:985 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1586 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1588 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1710 #: /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/localization.py:115 #: /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 @@ -295,62 +297,62 @@ 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:301 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:331 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:342 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:355 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:367 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:375 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:388 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:399 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:434 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:447 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:461 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:475 msgid "This profile is intended for the B&N Nook." msgstr "Dieses Profil ist geeignet für den B&N Nook." @@ -378,15 +380,15 @@ msgstr "" 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:292 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:310 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:319 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -394,7 +396,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:417 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Dieses Profil ist geeignet für den Amazon Kindle DX." @@ -414,15 +416,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 "" + +#: /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 +440,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 +460,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" @@ -478,37 +484,36 @@ 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:70 msgid "Communicate with S60 phones." msgstr "Kommunikation mit S60-Telefonen." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:46 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:78 msgid "Communicate with iBooks through iTunes." msgstr "Kommunikation mit iBooks über iTunes." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:84 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:227 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:230 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:301 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:338 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:842 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:876 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:345 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:881 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:519 msgid "" "Some books not found in iTunes database.\n" "Delete using the iBooks app.\n" @@ -518,17 +523,17 @@ 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/apple/driver.py:742 #: /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/apple/driver.py:744 #: /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:813 msgid "" "Some cover art could not be converted.\n" "Click 'Show Details' for a list." @@ -536,6 +541,18 @@ 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:2168 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:810 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:816 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:844 +#: /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:1470 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:128 +msgid "News" +msgstr "Nachrichten" + #: /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 +575,10 @@ 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:207 +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 +591,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 +609,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 +649,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,15 +669,15 @@ 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." @@ -690,7 +721,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: " @@ -698,7 +729,7 @@ msgstr "" "Mit Kommata getrennte Liste von Metadatenfeldern um Büchersammlungen auf dem " "Gerät zu erstellen. Möglichkeiten sind: " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:140 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 msgid "Unnamed" msgstr "Unbenannt" @@ -719,25 +750,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:248 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:428 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:493 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:586 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:598 msgid "" "Unable to detect the %s disk drive. Your kernel is probably exporting a " "deprecated version of SYSFS." @@ -745,39 +776,28 @@ 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:606 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:742 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:743 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:745 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:747 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:776 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:778 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:780 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" @@ -788,57 +808,61 @@ 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/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 +msgid "Use author sort instead of author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:38 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:41 +#: /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 +#: /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/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 +#: /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 "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 +#: /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 "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 +#: /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 "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:294 msgid "Sending metadata to device..." msgstr "Metadaten ans Gerät senden ..." @@ -1613,15 +1637,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" @@ -2000,84 +2024,88 @@ 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:381 #: /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/delete_matching_from_device.py:69 #: /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/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:866 +#: /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/ebooks/metadata/__init__.py:382 #: /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/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:867 msgid "Author(s)" msgstr "Autor(en)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:374 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:383 #: /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/gui2/library/models.py:62 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:384 #: /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/ebooks/metadata/__init__.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:208 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 #: /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:307 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1056 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:393 +#: /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: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:63 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1052 +#: /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:395 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /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:64 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 +#: /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:396 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:398 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1044 msgid "Timestamp" msgstr "Zeitstempel" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:400 #: /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/gui2/library/models.py:60 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:402 msgid "Rights" msgstr "Rechte" @@ -2085,7 +2113,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,6 +2240,10 @@ msgstr "Umschlagbild gespeichert unter" msgid "No cover found" msgstr "Kein Umschlagbild gefunden" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:41 +msgid "Downloads metadata from Douban.com" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:33 msgid "Metadata download" msgstr "Metadaten laden" @@ -2252,6 +2284,10 @@ msgstr "" msgid "Downloads social metadata from amazon.com" msgstr "Lädt soziale Metadaten von amazon.com" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:205 +msgid "Downloads series information from librarything.com" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94 msgid "" "\n" @@ -2326,7 +2362,7 @@ msgstr "" "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/metadata/opf2.py:1222 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1371 msgid "Cover" msgstr "Umschlagbild" @@ -2660,6 +2696,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 +2967,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,23 +3051,439 @@ 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:153 #: /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:187 msgid "Copy" msgstr "Kopieren" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:187 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:397 msgid "Choose Files" msgstr "Dateien wählen" +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:242 +msgid "Use library only" +msgstr "Nur Bibliothek verwenden" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:243 +msgid "User annotations generated from main library only" +msgstr "Nur aus der Hauptbibliothek erstellte Benutzeranmerkungen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:666 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:723 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:854 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1037 +msgid "No books selected" +msgstr "Keine Bücher ausgewählt" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:74 +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:99 +msgid "Merging user annotations into database" +msgstr "Füge Benutzeranmerkungen zur Datenbank hinzu" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:127 +msgid "%s
Last Page Read: %d (%d%%)" +msgstr "%s
Letzte gelesene Seite: %d (%d%%)" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:133 +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:152 +msgid "Location %d • %s
%s
" +msgstr "Position %d • %s
%s
" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:161 +msgid "Page %d • %s
" +msgstr "Seite %d • %s
" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:166 +msgid "Location %d • %s
" +msgstr "Position %d • %s
" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:288 +msgid "How many empty books?" +msgstr "Wie viele leere Bücher?" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:289 +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:337 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:388 +msgid "Uploading books to device." +msgstr "Lade Bücher auf das Gerät." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:139 +msgid "Books" +msgstr "Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:349 +msgid "EPUB Books" +msgstr "EPUB Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:350 +msgid "LRF Books" +msgstr "LRF Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:351 +msgid "HTML Books" +msgstr "HTML Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:352 +msgid "LIT Books" +msgstr "LIT Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:353 +msgid "MOBI Books" +msgstr "MOBI Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:354 +msgid "Topaz books" +msgstr "Topaz Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:355 +msgid "Text books" +msgstr "Text Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:356 +msgid "PDF Books" +msgstr "PDF Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:357 +msgid "Comics" +msgstr "Comics" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:358 +msgid "Archives" +msgstr "Archive" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:362 +msgid "Supported books" +msgstr "Unterstützte Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:397 +msgid "Merged some books" +msgstr "Einige Bücher zusammenfügen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:398 +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:407 +msgid "Failed to read metadata" +msgstr "Lesen der Metadaten schlug fehl" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:408 +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:427 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:432 +msgid "Add to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:457 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1214 +msgid "No book selected" +msgstr "Kein Buch ausgewählt" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:432 +msgid "No book files found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:454 +msgid "Cannot delete" +msgstr "Löschen nicht möglich" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:467 +msgid "Choose formats to be deleted" +msgstr "Zu löschende Formate auswählen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:485 +msgid "Choose formats not to be deleted" +msgstr "Nicht zu löschende Formate auswählen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:505 +msgid "Cannot delete books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:506 +msgid "No device is connected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:516 +msgid "Main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:517 +#: /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 "Speicherkarte A" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:518 +#: /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 "Speicherkarte B" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:523 +msgid "No books to delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:524 +msgid "None of the selected books are on the device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:598 +msgid "Deleting books from device." +msgstr "Lösche Bücher vom Gerät." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:562 +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:583 +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:608 +msgid "Cannot download metadata" +msgstr "Konnte Metadaten nicht laden" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:624 +msgid "social metadata" +msgstr "soziale Metadaten" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:626 +msgid "covers" +msgstr "Umschlagbilder" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:626 +msgid "metadata" +msgstr "Metadaten" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:628 +msgid "Downloading %s for %d book(s)" +msgstr "Lade %s für %d Bücher" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:650 +msgid "Failed to download some metadata" +msgstr "Das Laden der Metadaten schlug teilweise fehl" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:651 +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:654 +msgid "Failed to download metadata:" +msgstr "Laden der Metadaten schlug fehl:" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:946 +#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 +msgid "Error" +msgstr "Fehler" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:665 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:703 +msgid "Cannot edit metadata" +msgstr "Kann Metadaten nicht bearbeiten" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:722 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:725 +msgid "Cannot merge books" +msgstr "Konnte Bücher nicht zusammenfügen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:726 +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:730 +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:741 +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:753 +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:853 +msgid "Cannot save to disk" +msgstr "Speichern auf Festplatte nicht möglich" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:856 +msgid "Choose destination directory" +msgstr "Zielverzeichnis auswählen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:889 +msgid "Error while saving" +msgstr "Fehler während des Speicherns" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:890 +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:897 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:898 +msgid "Could not save some books" +msgstr "Konnte einige Bücher nicht speichern" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:899 +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:920 +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:937 +msgid "Generating %s catalog..." +msgstr "Erstelle %s Katalog..." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:261 +msgid "No books found" +msgstr "Keine Bücher gefunden" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:943 +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:953 +msgid "Catalog generated." +msgstr "Katalog erstellt." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:956 +msgid "Export Catalog Directory" +msgstr "Katalog-Verzeichnis exportieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:957 +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:973 +msgid "Fetching news from " +msgstr "Rufe Nachrichten ab von " + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:987 +msgid " fetched." +msgstr " abgerufen." + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1036 +msgid "Cannot convert" +msgstr "Konvertierung nicht möglich" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1065 +msgid "Starting conversion of %d book(s)" +msgstr "Starte Konvertierung von %d Büchern" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1250 +msgid "Cannot view" +msgstr "Ansehen nicht möglich" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1195 +#: /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:1203 +msgid "Multiple Books Selected" +msgstr "Mehrere Bücher ausgewählt" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1204 +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:1213 +msgid "Cannot open folder" +msgstr "Konnte Verzeichnis nicht öffnen" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions.py:1251 +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" @@ -3051,15 +3505,10 @@ 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/device.py:809 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 msgid "Added" msgstr "Hinzugefügt" @@ -3166,6 +3615,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,17 +3642,17 @@ 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/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/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:551 +#: /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:566 +#: /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:586 +#: /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:590 +#: /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:628 #: /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 @@ -3214,17 +3671,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 +3707,58 @@ msgstr "" "&Mehrere Bücher pro Verzeichnis, wobei jede Buch-Datei ein anderes Buch " "darstellt" +#: /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:53 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:302 +#: /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:1042 +msgid "Path" +msgstr "Pfad" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /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:96 +msgid "Formats" +msgstr "Formate" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1045 +msgid "Collections" +msgstr "Sammlungen" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:55 +msgid "Click to open" +msgstr "Zum Öffnen klicken" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /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:1051 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1055 +#: /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 +msgid "None" +msgstr "Keine" + +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:301 +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" @@ -3309,7 +3818,7 @@ msgstr "Ausgabe" #: /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 +3836,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:1433 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1451 msgid "Catalog" msgstr "Katalog" @@ -4053,11 +4562,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 +4649,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:73 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:74 msgid "Invalid regular expression: %s" msgstr "Ungültiger regulärer Ausdruck: %s" @@ -4374,11 +4878,19 @@ 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/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 +4911,266 @@ 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:357 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:378 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:383 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:45 #: /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:145 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:250 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:276 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:286 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:295 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:304 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:319 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:336 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:346 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:381 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: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 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:398 +msgid " and delete from library" +msgstr " und aus der Bibliothek löschen" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 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:409 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:411 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:416 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:425 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:443 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:444 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:483 msgid "Connect to folder" msgstr "Mit Verzeichnis verbinden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:488 msgid "Disconnect from folder" msgstr "Von Verzeichnis trennen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:496 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:606 +msgid "Error communicating with device" +msgstr "Fehler bei der Kommunikation mit dem Gerät" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:627 +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:669 +msgid "Failed" +msgstr "Fehlgeschlagen" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:675 +msgid "Error talking to device" +msgstr "Fehler in der Kommunikation zum Gerät" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:676 +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:717 +msgid "Device: " +msgstr "Gerät: " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719 +msgid " detected." +msgstr " gefunden." + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:742 +msgid "Connected " +msgstr "Angeschlossen: " + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:810 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:815 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:823 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:824 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:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 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:828 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:832 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:873 msgid "E-book:" msgstr "eBook:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:667 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 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/device.py:877 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 msgid "by" msgstr "von" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 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:891 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:921 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1020 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1200 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 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:922 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:929 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:947 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:948 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:952 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:979 msgid "News:" msgstr "Nachrichten:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 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:991 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:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1082 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 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:1050 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:1113 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:1167 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:1208 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." @@ -4637,49 +5179,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:1256 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:1257 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" @@ -4833,152 +5359,156 @@ msgstr "" msgid "new email address" msgstr "Neue eMail-Adresse" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:489 +msgid "Wide" +msgstr "Breit" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490 +msgid "Narrow" +msgstr "Schmal" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:500 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:501 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:521 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:524 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:525 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:526 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:577 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:578 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:581 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:593 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:594 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:603 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:604 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:612 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:650 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:651 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:682 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:687 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:688 #: /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:689 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:756 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:763 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:791 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:343 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:815 #: /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:822 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:823 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:881 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:886 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:882 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:883 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:887 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:892 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:893 msgid "" "The changes you made require that Calibre be restarted. Please restart as " "soon as practical." @@ -4986,19 +5516,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:927 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:947 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:952 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:953 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 " @@ -5134,13 +5664,14 @@ msgstr "" 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:548 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 +#: /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:549 msgid "" "&Location of ebooks (The ebooks are stored in folders sorted by author and " "metadata is stored in the file metadata.db)" @@ -5149,29 +5680,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:550 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:552 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:553 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:554 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:555 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:556 msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" @@ -5179,140 +5710,148 @@ 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:557 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:558 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:559 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:560 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:561 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:562 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:563 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:564 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:567 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:568 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:569 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:570 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:571 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:572 +msgid "Show &average ratings in the tags browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573 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:574 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:575 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:576 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:577 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:578 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:579 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:580 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:581 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:582 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:583 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:585 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:587 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:589 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:592 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:593 +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:594 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:595 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:596 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:597 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:598 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 +5861,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:599 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:600 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:601 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:602 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:603 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:604 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:605 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 +5899,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:606 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:607 #: /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:608 #: /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:609 msgid "" "If you leave the password blank, anyone will be able to access your book " "collection using the web interface." @@ -5386,7 +5925,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:610 msgid "" "The maximum size (widthxheight) for displayed covers. Larger covers are " "resized. " @@ -5394,45 +5933,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:611 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:612 #: /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:613 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:614 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:615 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:616 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:617 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:618 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:619 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:620 #: /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 +5989,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:622 msgid "" "Here you can customize the behavior of Calibre by controlling what plugins " "it uses." @@ -5458,27 +5997,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:623 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:624 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:625 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:626 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:627 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:629 msgid "&Add" msgstr "&Hinzufügen" @@ -5515,10 +6054,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:28 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:868 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:542 msgid "Date" msgstr "Datum" @@ -5534,69 +6074,72 @@ 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:30 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:32 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:34 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:37 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:61 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:62 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:66 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:97 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:99 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:108 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:114 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:124 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:126 msgid "" "The lookup name must be lower case and cannot contain \":\"s or spaces" msgstr "" @@ -5621,11 +6164,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 +6180,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 +6192,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,6 +6267,27 @@ msgstr "&Warnung erneut anzeigen" msgid "ERROR" msgstr "FEHLER" +#: /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:1041 +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:63 msgid "Author Sort" msgstr "Sortierung nach Autor" @@ -5917,20 +6492,26 @@ msgid "" "\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 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 msgid "&Custom metadata" -msgstr "" +msgstr "Ben&utzerdefinierte Metadaten" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 msgid "Not a valid picture" @@ -5940,11 +6521,6 @@ msgstr "Kein gültiges Bild." 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 msgid "No permission" msgstr "Zugriff verweigert" @@ -5983,69 +6559,79 @@ msgstr "Das Umschlagbild im Format %s ist ungültig" 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:445 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:450 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:453 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:532 +msgid "Cannot use tag editor" +msgstr "Kann Etiketteneditor nicht verwenden" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:533 +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:553 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: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 "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:566 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:577 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:567 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:571 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:583 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:584 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:617 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:618 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:647 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:648 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:719 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:720 msgid "Could not open %s. Is it being used by another program?" msgstr "" "Konnte %s nicht öffnen. Wird es von einem anderen Programm verwendet?" @@ -6141,14 +6727,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 +6748,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,71 +7012,73 @@ 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 @@ -6550,22 +7140,24 @@ msgstr "" "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/tag_view.py:500 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/tag_view.py:501 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 "" +msgstr "Element wird schon verwendet" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:67 msgid "The item %s is already used." -msgstr "" +msgstr "Das Element %s wird schon verwendet." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:79 msgid "No item selected" @@ -6574,6 +7166,7 @@ msgstr "Kein Eintrag ausgewählt" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:80 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 msgid "No items selected" @@ -6581,31 +7174,33 @@ msgstr "Keine Einträge ausgewählt" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:90 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 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 +7479,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: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 msgid "No match" msgstr "Kein Treffer" @@ -6924,54 +7519,209 @@ 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:60 +msgid "Download only metadata" +msgstr "Nur Metadaten laden" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:62 +msgid "Download only covers" +msgstr "Nur Umschlagbilder laden" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:65 +msgid "Download only social metadata" +msgstr "Nur soziale Metadaten laden" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:71 +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:74 +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:82 +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:84 +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:88 +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:91 +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:101 +#: /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:103 +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:105 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:405 +msgid "Save only %s format to disk" +msgstr "Nur das %s Format auf Festplatte speichern" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:408 +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:118 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:289 +msgid "View" +msgstr "Vorschau" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:119 +msgid "View specific format" +msgstr "Spezielles Format ansehen" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125 +msgid "Remove selected books" +msgstr "Gewählte Bücher entfernen" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:127 +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:130 +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:133 +msgid "Remove covers from selected books" +msgstr "Umschlagbilder der gewählten Bücher entfernen" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:136 +msgid "Remove matching books from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:153 +msgid "Convert individually" +msgstr "Einzeln konvertieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:155 +msgid "Bulk convert" +msgstr "Auf einmal konvertieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:159 +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:167 +msgid "Run welcome wizard" +msgstr "Willkommens-Assistenten ausführen" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:199 +msgid "Similar books..." +msgstr "Ähnliche Bücher..." + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230 +msgid "Add books to library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:309 +msgid "Cover Browser" +msgstr "Cover-Browser" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:327 +msgid "Tag Browser" +msgstr "Etiketten-Browser" + +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:384 +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 +7733,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:56 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:58 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:61 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:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1061 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:662 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1128 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:398 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:865 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:869 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:1108 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:1111 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:509 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:510 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -7186,55 +7914,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:84 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:93 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:94 +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:97 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:182 +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:151 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:176 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:177 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:191 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:224 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:192 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:205 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:206 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 +7973,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:212 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:225 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:236 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:281 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:283 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:284 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:287 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:289 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:291 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:294 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:296 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:308 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 +8065,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 +8208,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:89 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:251 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:304 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:346 +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:379 +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 +8297,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:190 +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:194 +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:199 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:202 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:206 msgid "Show all categories" +msgstr "Alle Kategorien anzeigen" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:217 +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:220 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:227 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:231 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:432 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:266 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:510 +msgid "Duplicate search name" +msgstr "Such-Name duplizieren" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 +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:726 +msgid "Sort by name" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:726 +msgid "Sort by popularity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:727 +msgid "Sort by average rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:733 +msgid "Match all" +msgstr "Übereinstimmung mit allen" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:733 +msgid "Match any" +msgstr "Übereinstimmung mit irgendeinem" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:738 +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 +8411,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:240 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:387 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:392 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:388 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:393 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:438 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:439 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:489 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:517 msgid "Conversion Error" msgstr "Konvertierungsfehler" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2416 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:490 msgid "" "

    Could not convert: %s

    It is a DRMed book. You must " "first remove the DRM using third party tools." @@ -8312,15 +8476,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:503 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:518 msgid "Failed" msgstr "Misslungen" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2491 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:558 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 +8493,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:583 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:586 msgid "" " is communicating with the device!
    \n" " Quitting may cause corruption on the device.
    \n" @@ -8345,11 +8509,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:590 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:642 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -8357,7 +8521,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 +8529,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 +9016,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:198 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:199 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:228 msgid "" "Library\n" "%d\n" @@ -8870,7 +9034,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:229 msgid "" "Reader\n" "%s\n" @@ -8880,7 +9044,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:230 msgid "" "Card A\n" "%s\n" @@ -8890,7 +9054,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:231 msgid "" "Card B\n" "%s\n" @@ -8900,49 +9064,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:235 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:238 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:239 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:240 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:248 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:506 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:507 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:508 msgid "Lower Case" msgstr "Kleinschreibung" -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:509 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:510 msgid "Title Case" msgstr "Wortanfänge groß schreiben" +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:932 +msgid "Drag to resize" +msgstr "Zur Größenänderung ziehen" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:963 +msgid "Show" +msgstr "Anzeigen" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:968 +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 +9427,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:275 msgid "today" msgstr "heute" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:273 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:278 msgid "yesterday" msgstr "gestern" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:276 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:281 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:284 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:285 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:435 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 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:435 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:445 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:438 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 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:438 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:448 msgid "yes" msgstr "ja" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 msgid "blank" msgstr "leer" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:437 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:442 msgid "empty" msgstr "leer" @@ -9824,7 +10000,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." @@ -9939,43 +10115,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 "" + +#: /home/kovid/work/calibre/src/calibre/library/database2.py:520 msgid "Main" msgstr "Haupt" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:489 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:522 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:524 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:1736 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:1765 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:1782 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:1875 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:1916 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:1938 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 +10355,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 +10384,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,7 +10496,7 @@ msgstr "Liste der benannten gespeicherten Suchen" #: /home/kovid/work/calibre/src/calibre/utils/config.py:700 msgid "User-created tag browser categories" -msgstr "" +msgstr "Benutzererstellte Etiketten-Browser Kategorieen" #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43 msgid "Waiting..." @@ -10383,34 +10567,38 @@ msgid "English (Pakistan)" msgstr "Englisch (Pakistan)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:106 +msgid "English (Israel)" +msgstr "" + +#: /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 +10661,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:606 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:703 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:705 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:711 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:713 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:715 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:828 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:849 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:854 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:860 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:862 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:943 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:959 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:969 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:981 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:1021 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:1211 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:1282 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:1293 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:1310 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:1457 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." @@ -10567,7 +10755,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:1473 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." @@ -10591,7 +10779,7 @@ msgstr "Geplant" 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 +10789,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 +10803,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 +10811,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 +10819,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 +10827,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 +10835,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 +10846,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 +10860,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." @@ -11169,6 +11357,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?