From 806f6d742535988a805e206c03722173aff5eb88 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 8 Feb 2011 16:11:51 -0700 Subject: [PATCH 01/30] When automatically sending news to device, send to main memory preferentially, if it has enough space. Fixes #8877 (Nook magazine default will not reset to main memory after setting to Card A) --- src/calibre/gui2/device.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 8efa7f154c..735eb7782b 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -1026,6 +1026,17 @@ class DeviceMixin(object): # {{{ self.location_manager.free[1] : 'carda', self.location_manager.free[2] : 'cardb' } on_card = space.get(sorted(space.keys(), reverse=True)[0], None) + try: + total_size = sum([os.stat(f).st_size for f in files]) + except: + try: + traceback.print_exc() + except: + pass + total_size = self.location_manager.free[0] + if self.location_manager.free[0] > total_size + (1024**2): + # Send news to main memory if enough space available + on_card = None self.upload_books(files, names, metadata, on_card=on_card, memory=[files, remove]) From f461783a37efc3f4edd2aca2739b8b1714eabb54 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 8 Feb 2011 16:21:18 -0700 Subject: [PATCH 02/30] LIT Input: Workaround LIT files generated by some broken software that sets the OPF namespace to http://openebook.org/namespaces/oeb-package/1.0. Fixes #8875 (OEBError: Invalid namespace, when opening LIT eBook in Ebookreader from Calibre) --- src/calibre/ebooks/oeb/reader.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/ebooks/oeb/reader.py b/src/calibre/ebooks/oeb/reader.py index d08a68c0bc..4a09e0b1d4 100644 --- a/src/calibre/ebooks/oeb/reader.py +++ b/src/calibre/ebooks/oeb/reader.py @@ -103,6 +103,8 @@ class OEBReader(object): data = self.oeb.container.read(None) data = self.oeb.decode(data) data = XMLDECL_RE.sub('', data) + data = data.replace('http://openebook.org/namespaces/oeb-package/1.0', + OPF1_NS) try: opf = etree.fromstring(data) except etree.XMLSyntaxError: From a4e8f8b8b5cb04d749f97ab7f270efeeb3091d1c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 8 Feb 2011 16:25:44 -0700 Subject: [PATCH 03/30] ... --- src/calibre/gui2/device.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 735eb7782b..ea86885484 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -1036,6 +1036,8 @@ class DeviceMixin(object): # {{{ total_size = self.location_manager.free[0] if self.location_manager.free[0] > total_size + (1024**2): # Send news to main memory if enough space available + # as some devices like the Nook Color cannot handle + # periodicals on SD cards properly on_card = None self.upload_books(files, names, metadata, on_card=on_card, From 761631a49b3259284a21db8ea342cc12db059047 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 8 Feb 2011 16:26:44 -0700 Subject: [PATCH 04/30] ... --- src/calibre/gui2/device.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index ea86885484..3540575f81 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -1030,6 +1030,7 @@ class DeviceMixin(object): # {{{ total_size = sum([os.stat(f).st_size for f in files]) except: try: + import traceback traceback.print_exc() except: pass From 2988b28a8f81c8af6f8d5c3607c9dba6be8ce2a4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 8 Feb 2011 16:36:43 -0700 Subject: [PATCH 05/30] ... --- src/calibre/gui2/complete.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/complete.py b/src/calibre/gui2/complete.py index 2eb97b128d..226fe8b9c7 100644 --- a/src/calibre/gui2/complete.py +++ b/src/calibre/gui2/complete.py @@ -11,7 +11,7 @@ from PyQt4.Qt import QLineEdit, QAbstractListModel, Qt, \ from calibre.utils.icu import sort_key, lower from calibre.gui2 import NONE -from calibre.gui2.widgets import EnComboBox +from calibre.gui2.widgets import EnComboBox, LineEditECM class CompleteModel(QAbstractListModel): @@ -38,7 +38,7 @@ class CompleteModel(QAbstractListModel): return NONE -class MultiCompleteLineEdit(QLineEdit): +class MultiCompleteLineEdit(QLineEdit, LineEditECM): ''' A line edit that completes on multiple items separated by a separator. Use the :meth:`update_items_cache` to set the list of From 251b1f8aa47adc91b23cb4b0d45f80b232ca201c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 09:02:02 -0700 Subject: [PATCH 06/30] Fix #8882 (ERROR: Unhandled exception: TypeError: index() takes exactly 4 arguments (3 given)) --- src/calibre/gui2/preferences/plugins.py | 4 +--- src/calibre/manual/faq.rst | 22 +++++----------------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/src/calibre/gui2/preferences/plugins.py b/src/calibre/gui2/preferences/plugins.py index 4b83df71c7..acf42fee16 100644 --- a/src/calibre/gui2/preferences/plugins.py +++ b/src/calibre/gui2/preferences/plugins.py @@ -109,7 +109,7 @@ class PluginModel(QAbstractItemModel, SearchQueryParser): # {{{ return self.index(ans[0], 0, QModelIndex()) if ans[1] < 0 else \ self.index(ans[1], 0, self.index(ans[0], 0, QModelIndex())) - def index(self, row, column, parent): + def index(self, row, column, parent=QModelIndex()): if not self.hasIndex(row, column, parent): return QModelIndex() @@ -165,8 +165,6 @@ class PluginModel(QAbstractItemModel, SearchQueryParser): # {{{ def flags(self, index): if not index.isValid(): return 0 - if index.internalId() == 0: - return Qt.ItemIsEnabled flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled return flags diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index cdae20ea3b..cb7f4d62ff 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -182,11 +182,6 @@ If you don't want to uninstall it altogether, there are a couple of tricks you c simplest is to simply re-name the executable file that launches the library program. More detail `in the forums `_. -Can I use the collections feature of the SONY reader? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -|app| has full support for collections. When you add tags to a book's metadata, those tags are turned into collections when you upload the book to the SONY reader. Also, the series information is automatically -turned into a collection on the reader. Note that the PRS-500 does not support collections for books stored on the SD card. The PRS-505 does. - How do I use |app| with my iPad/iPhone/iTouch? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -375,13 +370,6 @@ Content From The Web :depth: 1 :local: -My downloaded news content causes the reader to reset. -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -This is a bug in the SONY firmware. The problem can be mitigated by switching the output format to EPUB -in the configuration dialog. Alternatively, you can use the LRF output format and use the SONY software -to transfer the files to the reader. The SONY software pre-paginates the LRF file, -thereby reducing the number of resets. - I obtained a recipe for a news site as a .py file from somewhere, how do I use it? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Start the :guilabel:`Add custom news sources` dialog (from the :guilabel:`Fetch news` menu) and click the :guilabel:`Switch to advanced mode` button. Delete everything in the box with the recipe source code and copy paste the contents of your .py file into the box. Click :guilabel:`Add/update recipe`. @@ -391,7 +379,7 @@ I want |app| to download news from my favorite news website. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you are reasonably proficient with computers, you can teach |app| to download news from any website of your choosing. To learn how to do this see :ref:`news`. -Otherwise, you can register a request for a particular news site by adding a comment `to this ticket `_. +Otherwise, you can request a particular news site by posting in the `calibre Recipes forum `_. Can I use web2disk to download an arbitrary website? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -480,7 +468,7 @@ How do I backup |app|? The most important thing to backup is the |app| library folder, that contains all your books and metadata. This is the folder you chose for your |app| library when you ran |app| for the first time. You can get the path to the library folder by clicking the |app| icon on the main toolbar. You must backup this complete folder with all its files and sub-folders. -You can switch |app| to using a backed up library folder by simply clicking the |app| icon on the toolbar and choosing your backup library folder. +You can switch |app| to using a backed up library folder by simply clicking the |app| icon on the toolbar and choosing your backup library folder. A backed up library folder backs up your custom columns and saved searches as well as all your books and metadata. If you want to backup the |app| configuration/plugins, you have to backup the config directory. You can find this config directory via :guilabel:`Preferences->Miscellaneous`. Note that restoring configuration directories is not officially supported, but should work in most cases. Just copy the contents of the backup directory into the current configuration directory to restore. @@ -491,7 +479,7 @@ Most purchased EPUB books have `DRM `_. Thi I am getting a "Permission Denied" error? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -A permission denied error can occur because of many possible reasons, none of them having anything to do with |app|. You can get permission denied errors if you are using an SD card with write protect enabled. Or if you, or some program you used changed the file permissions of the files in question to read only. Or if there is a filesystem error on the device which caused your operating system to mount the filesystem in read only mode or mark a particular file as read only pending recovery. Or if the files have their owner set to a user other than you. You will need to fix the underlying cause of the permissions error before resuming to use |app|. Read the error message carefully, see what file it points to and fix the permissions on that file. +A permission denied error can occur because of many possible reasons, none of them having anything to do with |app|. You can get permission denied errors if you are using an SD card with write protect enabled. Or if you, or some program you used changed the file permissions of the files in question to read only. Or if there is a filesystem error on the device which caused your operating system to mount the filesystem in read only mode or mark a particular file as read only pending recovery. Or if the files have their owner set to a user other than you. Or if your file is open in another program. You will need to fix the underlying cause of the permissions error before resuming to use |app|. Read the error message carefully, see what file it points to and fix the permissions on that file. Can I have the comment metadata show up on my reader? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -504,7 +492,7 @@ I want some feature added to |app|. What can I do? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You have two choices: 1. Create a patch by hacking on |app| and send it to me for review and inclusion. See `Development `_. - 2. `Open a ticket `_ (you have to register and login first) and hopefully I will find the time to implement your feature. + 2. `Open a ticket `_ (you have to register and login first). Remember that |app| development is done by volunteers, so if you get no response to your feature request, it means no one feels like implementing it. Can I include |app| on a CD to be distributed with my product/magazine? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -522,7 +510,7 @@ Why are there so many calibre-parallel processes on my system? In addition to this some conversion plugins run tasks in their own pool of processes, so for example if you bulk convert comics, each comic conversion will use three separate processes to render the images. The job manager knows this so it will run only a single comic conversion simultaneously. -And since I'm sure someone will ask: The reason adding/saving books are in separate processes is because of PDF. PDF processing libraries can crash on reading PDFs and I dont want the crash to take down all of calibre. Also when adding EPUB books, in order to extract the cover you have to sometimes render the HTML of the first page, which means that it either has to run the GUI thread of the main process or in a separate process. +And since I'm sure someone will ask: The reason adding/saving books are in separate processes is because of PDF. PDF processing libraries can crash on reading PDFs and I dont want the crash to take down all of calibre. Also when adding EPUB books, in order to extract the cover you have to sometimes render the HTML of the first page, which means that it either has to run in the GUI thread of the main process or in a separate process. Finally, the reason calibre keep workers alive and idle instead of launching on demand is to workaround the slow startup time of python processes. From 50e482dc73efd18b30f631741a4ef496f6d4db20 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 09:04:02 -0700 Subject: [PATCH 07/30] Fix #8884 (taz Digiabo: Download server changed) --- resources/recipes/taz.recipe | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/recipes/taz.recipe b/resources/recipes/taz.recipe index 93ce5fded0..b777d7ad51 100644 --- a/resources/recipes/taz.recipe +++ b/resources/recipes/taz.recipe @@ -27,7 +27,7 @@ class TazDigiabo(BasicNewsRecipe): } def build_index(self): - domain = "http://www.taz.de" + domain = "http://dl.taz.de" url = domain + "/epub/" From 87c484e9c0020ca157c88cfff9074b82a7654e94 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 09:05:00 -0700 Subject: [PATCH 08/30] Fix #8887 (Updated recipe for B92) --- resources/recipes/b92.recipe | 52 +++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/resources/recipes/b92.recipe b/resources/recipes/b92.recipe index 20b844b57d..7181419682 100644 --- a/resources/recipes/b92.recipe +++ b/resources/recipes/b92.recipe @@ -1,6 +1,6 @@ __license__ = 'GPL v3' -__copyright__ = '2008-2010, Darko Miletic ' +__copyright__ = '2008-2011, Darko Miletic ' ''' b92.net ''' @@ -10,7 +10,7 @@ from calibre.web.feeds.news import BasicNewsRecipe class B92(BasicNewsRecipe): title = 'B92' __author__ = 'Darko Miletic' - description = 'B92 info, najnovije vesti iz Srbije, regiona i sveta' + description = 'Najnovije vesti iz Srbije, regiona i sveta, aktuelne teme iz sveta politike, ekonomije, drustva, foto galerija, kolumne' publisher = 'B92' category = 'news, politics, Serbia' oldest_article = 2 @@ -20,34 +20,44 @@ class B92(BasicNewsRecipe): encoding = 'cp1250' language = 'sr' publication_type = 'newsportal' - extra_css = ' @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif} ' + masthead_url = 'http://www.b92.net/images/fp/logo.gif' + 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)} + body{font-family: Arial,Helvetica,sans1,sans-serif} + .articledescription{font-family: serif1, serif} + .article-info2,.article-info1{text-transform: uppercase; font-size: small} + """ conversion_options = { - 'comment' : description - , 'tags' : category - , 'publisher' : publisher - , 'language' : language + 'comment' : description + , 'tags' : category + , 'publisher': publisher + , 'language' : language , 'linearize_tables' : True } preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')] - keep_only_tags = [dict(name='table', attrs={'class':'maindocument'})] - - remove_tags = [ - dict(name='ul', attrs={'class':'comment-nav'}) - ,dict(name=['embed','link','base'] ) - ,dict(name='div', attrs={'class':'udokum'} ) - ] + keep_only_tags = [dict(attrs={'class':['article-info1','article-text']})] + remove_attributes = ['width','height','align','hspace','vspace','border'] + remove_tags = [dict(name=['embed','link','base','meta'])] feeds = [ - (u'Vesti', u'http://www.b92.net/info/rss/vesti.xml') - ,(u'Biz' , u'http://www.b92.net/info/rss/biz.xml' ) + (u'Vesti' , u'http://www.b92.net/info/rss/vesti.xml' ) + ,(u'Biz' , u'http://www.b92.net/info/rss/biz.xml' ) + ,(u'Sport' , u'http://www.b92.net/info/rss/sport.xml' ) + ,(u'Zivot' , u'http://www.b92.net/info/rss/zivot.xml' ) + ,(u'Kultura' , u'http://www.b92.net/info/rss/kultura.xml' ) + ,(u'Automobili' , u'http://www.b92.net/info/rss/automobili.xml') + ,(u'Tehnopolis' , u'http://www.b92.net/info/rss/tehnopolis.xml') ] - def print_version(self, url): - return url + '&version=print' - def preprocess_html(self, soup): - return self.adeify_images(soup) - + for item in soup.findAll(style=True): + del item['style'] + for alink in soup.findAll('a'): + if alink.string is not None: + tstr = alink.string + alink.replaceWith(tstr) + return soup From 0379b914e7d0592f503818b76901bb005642581d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 09:06:50 -0700 Subject: [PATCH 09/30] Fix #8889 (New recipe for njuz.net website) --- resources/images/news/njuz_net.png | Bin 0 -> 914 bytes resources/recipes/njuz_net.recipe | 61 +++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 resources/images/news/njuz_net.png create mode 100644 resources/recipes/njuz_net.recipe diff --git a/resources/images/news/njuz_net.png b/resources/images/news/njuz_net.png new file mode 100644 index 0000000000000000000000000000000000000000..86f2f77e17f3a01fd3820538ad5b83b2f242551e GIT binary patch literal 914 zcmV;D18w|?P)lu%$(WNI}t7O+y<^1rs3=QW7HxFTC*NgBt%BA9>Ix zV}9}Gl@&_XOrw{-g}TX(zn=iC{;S$*QwN#H6MXwQqaM?p70e{}%WN&%cRbh;6`K};})I98aQ8Ambv1KW*7Fd^vNg|pmPyO5-M zv{LE2CGa~jK>s(}trl!PS(d>Ps5HX8XC6t{zZ%1lX$76J-<&u~n2k|o z8d_`b>JK-*K6qgC_~C=&pa1#rG1~18qA*4n1nlbXCH#2LpJI%kO;d$br5jF%E_9|@ z94AyMwIsNCc3Av4;rFpMmt(j=LI zJN5eVhr$skFTdma622#q z_gr{h4xGAXM@9&Wjd5x-;i;88PEuyWa;3C+y7l_fwo&OLt;yF;A3k*8OWUPVsi3FcJmwV({@ae= zu$IThMpl?C4pH)qCNG14B4&ep-p9wETtK<63{76w*EY}8pRSyXqWA>a9oAWj>Okf8 z2dCyP^IjmmP&j#G|9uhD3(E%OP*5ZL_Iy{X4X%@tVS>TS$?o~{=Pn&RI&p_T|GVrQ zl*<)V2ZtcYj$r>njM4U%2-)4a_hzOhjvTpfi#X2{C>ommW8>JpyMic+dS{Y|$oI{> oD?7DX|CK_q@Yv$)`bU5P0DvuQWND}bivR!s07*qoM6N<$f{#$RCIA2c literal 0 HcmV?d00001 diff --git a/resources/recipes/njuz_net.recipe b/resources/recipes/njuz_net.recipe new file mode 100644 index 0000000000..23069d7604 --- /dev/null +++ b/resources/recipes/njuz_net.recipe @@ -0,0 +1,61 @@ + +__license__ = 'GPL v3' +__copyright__ = '2011, Darko Miletic ' +''' +njuz.net +''' +import re +from calibre.web.feeds.news import BasicNewsRecipe + +class NjuzNet(BasicNewsRecipe): + title = 'Njuz.net' + __author__ = 'Darko Miletic' + description = 'Iscasene vesti iz Srbije, regiona i sveta' + publisher = 'njuz.net' + category = 'news, politics, humor, Serbia' + oldest_article = 2 + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + encoding = 'utf8' + language = 'sr' + publication_type = 'newsportal' + masthead_url = 'http://www.njuz.net/njuznet.jpg' + extra_css = """ + @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} + body{font-family: serif1, serif} + .articledescription{font-family: serif1, serif} + .wp-caption-text{font-size: x-small} + """ + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + + preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')] + + keep_only_tags = [ + dict(attrs={'id':'entryMeta'}) + ,dict(attrs={'class':'post'}) + ] + + remove_tags = [ + dict(name=['embed','link','base','iframe','object','meta','fb:like']) + ,dict(name='div', attrs={'id':'tagsandcats'}) + ] + remove_tags_after= dict(name='div', attrs={'id':'tagsandcats'}) + remove_attributes= ['lang'] + feeds = [(u'Clanci', u'http://www.njuz.net/feed/')] + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + for alink in soup.findAll('a'): + if alink.string is not None: + tstr = alink.string + alink.replaceWith(tstr) + return soup + From 3d385196fd68033842195249e4d9b42d8341e1a5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 09:13:18 -0700 Subject: [PATCH 10/30] Fix #8888 (Request support for T-mobile MyTouch 4g) --- src/calibre/devices/android/driver.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index e9021461eb..e6ad786cac 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -65,6 +65,9 @@ class ANDROID(USBMS): # Huawei 0x45e : { 0x00e1 : [0x007], }, + # T-Mobile + 0x0408 : { 0x03ba : [0x0109], }, + } EBOOK_DIR_MAIN = ['eBooks/import', 'wordplayer/calibretransfer', 'Books'] EXTRA_CUSTOMIZATION_MESSAGE = _('Comma separated list of directories to ' @@ -74,13 +77,13 @@ class ANDROID(USBMS): VENDOR_NAME = ['HTC', 'MOTOROLA', 'GOOGLE_', 'ANDROID', 'ACER', 'GT-I5700', 'SAMSUNG', 'DELL', 'LINUX', 'GOOGLE', 'ARCHOS', - 'TELECHIP', 'HUAWEI', ] + 'TELECHIP', 'HUAWEI', 'T-MOBILE', ] WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE', '__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD', 'SGH-I897', 'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', 'SCH-I500_CARD', 'SPH-D700_CARD', 'MB810', 'GT-P1000', 'DESIRE', 'SGH-T849', '_MB300', 'A70S', 'S_ANDROID', 'A101IT', 'A70H', - 'IDEOS_TABLET'] + 'IDEOS_TABLET', 'MYTOUCH_4G'] WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'GT-I9000_CARD', 'SGH-I897', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', 'GT-P1000_CARD', 'A70S', 'A101IT'] From db6ff017b35f89917050ede229ab103f8e818466 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 9 Feb 2011 17:09:34 +0000 Subject: [PATCH 11/30] Have db2.get_metadata put the current value of a composite field into its value --- src/calibre/ebooks/metadata/book/base.py | 5 +---- src/calibre/library/database2.py | 5 ++++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 799bdef8e6..4cca94a6c6 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -129,10 +129,7 @@ class Metadata(object): val = NULL_VALUES.get(field, None) _data[field] = val elif field in _data['user_metadata'].iterkeys(): - if _data['user_metadata'][field]['datatype'] == 'composite': - _data['user_metadata'][field]['#value#'] = None - else: - _data['user_metadata'][field]['#value#'] = val + _data['user_metadata'][field]['#value#'] = val _data['user_metadata'][field]['#extra#'] = extra else: # You are allowed to stick arbitrary attributes onto this object as diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 5702b75317..b0497eb53e 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -787,7 +787,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.id = id for key, meta in self.field_metadata.custom_iteritems(): mi.set_user_metadata(key, meta) - mi.set(key, val=self.get_custom(idx, label=meta['label'], + if meta['datatype'] == 'composite': + mi.set(key, val=row[meta['rec_index']]) + else: + mi.set(key, val=self.get_custom(idx, label=meta['label'], index_is_id=index_is_id), extra=self.get_custom_extra(idx, label=meta['label'], index_is_id=index_is_id)) From 08de895a672de10e5b0397bd93574f8b050eba95 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 10:20:13 -0700 Subject: [PATCH 12/30] Add tweak to remove yellow lines from edges of book list --- resources/default_tweaks.py | 70 ++++++++++++++++++++++++++----------- src/calibre/gui2/widgets.py | 4 +-- 2 files changed, 52 insertions(+), 22 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 81088da520..ae96fc6a94 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -10,7 +10,7 @@ you know what you are doing. If you delete this file, it will be recreated from defaults. ''' - +#: Auto increment series index # The algorithm used to assign a new book in an existing series a series number. # New series numbers assigned using this tweak are always integer values, except # if a constant non-integer is specified. @@ -29,7 +29,7 @@ defaults. # series_index_auto_increment = 16.5 series_index_auto_increment = 'next' - +#: Add separator after completing an author name # Should the completion separator be append # to the end of the completed text to # automatically begin a new completion operation @@ -38,6 +38,7 @@ series_index_auto_increment = 'next' authors_completer_append_separator = False +#: Author sort name algorithm # The algorithm used to copy author to author_sort # Possible values are: # invert: use "fn ln" -> "ln, fn" (the default algorithm) @@ -49,6 +50,7 @@ authors_completer_append_separator = False # selecting 'manage authors', and pressing 'Recalculate all author sort values'. author_sort_copy_method = 'invert' +#: Use author sort in Tag Browser # Set which author field to display in the tags pane (the list of authors, # series, publishers etc on the left hand side). The choices are author and # author_sort. This tweak affects only what is displayed under the authors @@ -63,6 +65,7 @@ author_sort_copy_method = 'invert' # categories_use_field_for_author_name = 'author_sort' categories_use_field_for_author_name = 'author' +#: Control partitioning of Tag Browser # When partitioning the tags browser, the format of the subcategory label is # controlled by a template: categories_collapsed_name_template if sorting by # name, categories_collapsed_rating_template if sorting by average rating, and @@ -85,13 +88,14 @@ categories_collapsed_rating_template = r'{first.avg_rating:4.2f:ifempty(0)} - {l categories_collapsed_popularity_template = r'{first.count:d} - {last.count:d}' +#: Set boolean custom columns to be tristate # Set whether boolean custom columns are two- or three-valued. # Two-values for true booleans # three-values for yes/no/unknown # Set to 'yes' for three-values, 'no' for two-values bool_custom_columns_are_tristate = 'yes' - +#: Specify columns to sort the booklist by on startup # Provide a set of columns to be sorted on when calibre starts # The argument is None if saved sort history is to be used # otherwise it is a list of column,order pairs. Column is the @@ -101,6 +105,7 @@ bool_custom_columns_are_tristate = 'yes' # title within authors. sort_columns_at_startup = None +#; Control how dates are displayed # Format to be used for publication date and the timestamp (date). # A string controlling how the publication date is displayed in the GUI # d the day as number without a leading zero (1 to 31) @@ -121,6 +126,7 @@ sort_columns_at_startup = None gui_pubdate_display_format = 'MMM yyyy' gui_timestamp_display_format = 'dd MMM yyyy' +#: Control sorting of titles and series in the display # Control title and series sorting in the library view. # If set to 'library_order', Leading articles such as The and A will be ignored. # If set to 'strictly_alphabetic', the titles will be sorted without processing @@ -132,6 +138,7 @@ gui_timestamp_display_format = 'dd MMM yyyy' # without changing anything is sufficient to change the sort. title_series_sorting = 'library_order' +#: Control formatting of title and series when used in templates # Control how title and series names are formatted when saving to disk/sending # to device. If set to library_order, leading articles such as The and A will # be put at the end @@ -140,6 +147,7 @@ title_series_sorting = 'library_order' # strictly_alphabetic, it would remain "The Client". save_template_title_series_sorting = 'library_order' +#: Set the list of words considered to be "articles" for sort strings # Set the list of words that are to be considered 'articles' when computing the # title sort strings. The list is a regular expression, with the articles # separated by 'or' bars. Comparisons are case insensitive, and that cannot be @@ -149,7 +157,7 @@ save_template_title_series_sorting = 'library_order' # Default: '^(A|The|An)\s+' title_sort_articles=r'^(A|The|An)\s+' - +#: Specify a folder calibre should connect to at startup # Specify a folder that calibre should connect to at startup using # connect_to_folder. This must be a full path to the folder. If the folder does # not exist when calibre starts, it is ignored. If there are '\' characters in @@ -159,7 +167,7 @@ title_sort_articles=r'^(A|The|An)\s+' # auto_connect_to_folder = '/home/dropbox/My Dropbox/someone/library' auto_connect_to_folder = '' - +#: Specify renaming rules for SONY collections # Specify renaming rules for sony collections. This tweak is only applicable if # metadata management is set to automatic. Collections on Sonys are named # depending upon whether the field is standard or custom. A collection derived @@ -212,7 +220,7 @@ auto_connect_to_folder = '' sony_collection_renaming_rules={} sony_collection_name_template='{value}{category:| (|)}' - +#: Specify how SONY collections are sorted # Specify how sony collections are sorted. This tweak is only applicable if # metadata management is set to automatic. You can indicate which metadata is to # be used to sort on a collection-by-collection basis. The format of the tweak @@ -231,7 +239,7 @@ sony_collection_name_template='{value}{category:| (|)}' sony_collection_sorting_rules = [] -# Create search terms to apply a query across several built-in search terms. +#: Create search terms to apply a query across several built-in search terms. # Syntax: {'new term':['existing term 1', 'term 2', ...], 'new':['old'...] ...} # Example: create the term 'myseries' that when used as myseries:foo would # search all of the search categories 'series', '#myseries', and '#myseries2': @@ -244,15 +252,17 @@ sony_collection_sorting_rules = [] grouped_search_terms = {} -# Set this to True (not 'True') to ensure that tags in 'Tags to add when adding +#: Control how tags are applied when copying books to another library +# Set this to True to ensure that tags in 'Tags to add when adding # a book' are added when copying books to another library add_new_book_tags_when_importing_books = False -# Set the maximum number of tags to show per book in the content server +#: Set the maximum number of tags to show per book in the content server max_content_server_tags_shown=5 -# Set custom metadata fields that the content server will or will not display. + +#: Set custom metadata fields that the content server will or will not display. # content_server_will_display is a list of custom fields to be displayed. # content_server_wont_display is a list of custom fields not to be displayed. # wont_display has priority over will_display. @@ -270,13 +280,27 @@ max_content_server_tags_shown=5 content_server_will_display = ['*'] content_server_wont_display = [] -# Same as above (content server) but for the book details pane. Same syntax. +#: Set custom metadata fields that the book details panel will or will not display. +# book_details_will_display is a list of custom fields to be displayed. +# book_details_wont_display is a list of custom fields not to be displayed. +# wont_display has priority over will_display. +# The special value '*' means all custom fields. The value [] means no entries. +# Defaults: +# book_details_will_display = ['*'] +# book_details_wont_display = [] +# Examples: +# To display only the custom fields #mytags and #genre: +# book_details_will_display = ['#mytags', '#genre'] +# book_details_wont_display = [] +# To display all fields except #mycomments: +# book_details_will_display = ['*'] +# book_details_wont_display['#mycomments'] # As above, this tweak affects only display of custom fields. The standard # fields are not affected book_details_will_display = ['*'] book_details_wont_display = [] - +#: # Set the maximum number of sort 'levels' # Set the maximum number of sort 'levels' that calibre will use to resort the # library after certain operations such as searches or device insertion. Each # sort level adds a performance penalty. If the database is large (thousands of @@ -284,16 +308,14 @@ book_details_wont_display = [] # level sorts, and if you are seeing a slowdown, reduce the value of this tweak. maximum_resort_levels = 5 -# Absolute path to a TTF font file to use as the font for the title and author -# when generating a default cover. Useful if the default font (Liberation +#: Specify which font to use when generating a default cover +# Absolute path to .ttf font files to use as the fonts for the title, author +# and footer when generating a default cover. Useful if the default font (Liberation # Serif) does not contain glyphs for the language of the books in your library. generate_cover_title_font = None - -# Absolute path to a TTF font file to use as the font for the footer in the -# default cover generate_cover_foot_font = None - +#: Control behavior of double clicks on the book list # Behavior of doubleclick on the books list. Choices: open_viewer, do_nothing, # edit_cell, edit_metadata. Selecting edit_metadata has the side effect of # disabling editing a field using a single click. @@ -302,7 +324,8 @@ generate_cover_foot_font = None doubleclick_on_library_view = 'open_viewer' -# Language to use when sorting. Setting this tweak will force sorting to use the +#: Language to use when sorting. +# Setting this tweak will force sorting to use the # collating order for the specified language. This might be useful if you run # calibre in English but want sorting to work in the language where you live. # Set the tweak to the desired ISO 639-1 language code, in lower case. @@ -313,12 +336,13 @@ doubleclick_on_library_view = 'open_viewer' # Example: locale_for_sorting = 'nb' -- sort using Norwegian rules. locale_for_sorting = '' - +#: Use one or two columns for custom metadata fields in the edit metadata dialog # Set whether to use one or two columns for custom metadata when editing # metadata one book at a time. If True, then the fields are laid out using two # columns. If False, one column is used. metadata_single_use_2_cols_for_custom_fields = True +#: The number of seconds to wait before sending emails # The number of seconds to wait before sending emails when using a # public email server like gmail or hotmail. Default is: 5 minutes # Setting it to lower may cause the server's SPAM controls to kick in, @@ -326,3 +350,9 @@ metadata_single_use_2_cols_for_custom_fields = True # calibre. public_smtp_relay_delay = 301 +#: Remove the bright yellow lines at the edges of the book list +# Control whether the bright yellow lines at the edges of book list are drawn +# when a section of the user interface is hidden. Changes will take effect +# after a restart of calibre. +draw_hidden_section_indicators = True + diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index 68e78cb6a6..f6c4cce3ef 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -20,7 +20,7 @@ from calibre.gui2.filename_pattern_ui import Ui_Form from calibre import fit_image from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata.meta import metadata_from_filename -from calibre.utils.config import prefs, XMLConfig +from calibre.utils.config import prefs, XMLConfig, tweaks from calibre.gui2.progress_indicator import ProgressIndicator as _ProgressIndicator history = XMLConfig('history') @@ -932,7 +932,7 @@ class SplitterHandle(QSplitterHandle): def paintEvent(self, ev): QSplitterHandle.paintEvent(self, ev) - if self.highlight: + if self.highlight and tweaks['draw_hidden_section_indicators']: painter = QPainter(self) painter.setClipRect(ev.rect()) painter.fillRect(self.rect(), Qt.yellow) From aa19276219b8cdcbcf9a02b899c520461f102ad7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 14:54:50 -0700 Subject: [PATCH 13/30] ... --- resources/default_tweaks.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index ae96fc6a94..55b8f82c48 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -77,13 +77,13 @@ categories_use_field_for_author_name = 'author' # author category will be the name of the author. The sub-values available are: # name: the printable name of the item # count: the number of books that references this item -# avg_rating: the averate rating of all the books referencing this item +# avg_rating: the average rating of all the books referencing this item # sort: the sort value. For authors, this is the author_sort for that author # category: the category (e.g., authors, series) that the item is in. # Note that the "r'" in front of the { is necessary if there are backslashes # (\ characters) in the template. It doesn't hurt anything to leave it there # even if there aren't any backslashes. -categories_collapsed_name_template = r'{first.sort:shorten(4,'',0)} - {last.sort:shorten(4,'',0)}' +categories_collapsed_name_template = r'{first.sort:shorten(4,"",0)} - {last.sort:shorten(4,"",0)}' categories_collapsed_rating_template = r'{first.avg_rating:4.2f:ifempty(0)} - {last.avg_rating:4.2f:ifempty(0)}' categories_collapsed_popularity_template = r'{first.count:d} - {last.count:d}' @@ -300,7 +300,7 @@ content_server_wont_display = [] book_details_will_display = ['*'] book_details_wont_display = [] -#: # Set the maximum number of sort 'levels' +#: Set the maximum number of sort 'levels' # Set the maximum number of sort 'levels' that calibre will use to resort the # library after certain operations such as searches or device insertion. Each # sort level adds a performance penalty. If the database is large (thousands of From 588e92348cf5153641180903c1dc0700d09a9fbe Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 15:13:13 -0700 Subject: [PATCH 14/30] Nicer interface for editing tweaks --- src/calibre/gui2/preferences/tweaks.py | 296 ++++++++++++++++++++++++- src/calibre/gui2/preferences/tweaks.ui | 109 +++++++-- 2 files changed, 372 insertions(+), 33 deletions(-) diff --git a/src/calibre/gui2/preferences/tweaks.py b/src/calibre/gui2/preferences/tweaks.py index 2bd765986d..fc3eb5a626 100644 --- a/src/calibre/gui2/preferences/tweaks.py +++ b/src/calibre/gui2/preferences/tweaks.py @@ -5,37 +5,311 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' +import textwrap + from calibre.gui2.preferences import ConfigWidgetBase, test_widget, AbortCommit from calibre.gui2.preferences.tweaks_ui import Ui_Form -from calibre.gui2 import error_dialog +from calibre.gui2 import error_dialog, NONE from calibre.utils.config import read_raw_tweaks, write_tweaks +from calibre.gui2.widgets import PythonHighlighter +from calibre import isbytestring +from PyQt4.Qt import QAbstractListModel, Qt, QStyledItemDelegate, QStyle, \ + QStyleOptionViewItem, QFont, QDialogButtonBox, QDialog, \ + QVBoxLayout, QPlainTextEdit, QLabel + +class Delegate(QStyledItemDelegate): # {{{ + def __init__(self, view): + QStyledItemDelegate.__init__(self, view) + self.view = view + + def paint(self, p, opt, idx): + copy = QStyleOptionViewItem(opt) + copy.showDecorationSelected = True + if self.view.currentIndex() == idx: + copy.state |= QStyle.State_HasFocus + QStyledItemDelegate.paint(self, p, copy, idx) + +# }}} + +class Tweak(object): # {{{ + + def __init__(self, name, doc, var_names, defaults, custom): + self.name = name + self.doc = doc.strip() + self.var_names = var_names + self.default_values = {} + for x in var_names: + self.default_values[x] = defaults[x] + self.custom_values = {} + for x in var_names: + if x in custom: + self.custom_values[x] = custom[x] + + def __str__(self): + ans = ['#: ' + self.name] + for line in self.doc.splitlines(): + if line: + ans.append('# ' + line) + for key, val in self.default_values.iteritems(): + val = self.custom_values.get(key, val) + ans.append('%s = %r'%(key, val)) + ans = '\n'.join(ans) + if isinstance(ans, unicode): + ans = ans.encode('utf-8') + return ans + + def __cmp__(self, other): + return cmp(self.is_customized, getattr(other, 'is_customized', False)) + + @property + def is_customized(self): + for x, val in self.default_values.iteritems(): + if self.custom_values.get(x, val) != val: + return True + return False + + @property + def edit_text(self): + ans = ['# %s'%self.name] + for x, val in self.default_values.iteritems(): + val = self.custom_values.get(x, val) + ans.append('%s = %r'%(x, val)) + return '\n\n'.join(ans) + + def restore_to_default(self): + self.custom_values.clear() + + def update(self, varmap): + self.custom_values.update(varmap) + +# }}} + +class Tweaks(QAbstractListModel): # {{{ + + def __init__(self, parent=None): + QAbstractListModel.__init__(self, parent) + raw_defaults, raw_custom = read_raw_tweaks() + + self.parse_tweaks(raw_defaults, raw_custom) + + def rowCount(self, *args): + return len(self.tweaks) + + def data(self, index, role): + row = index.row() + try: + tweak = self.tweaks[row] + except: + return NONE + if role == Qt.DisplayRole: + return textwrap.fill(tweak.name, 40) + if role == Qt.FontRole and tweak.is_customized: + ans = QFont() + ans.setBold(True) + return ans + if role == Qt.ToolTipRole: + tt = _('This tweak has it default value') + if tweak.is_customized: + tt = _('This tweak has been customized') + return tt + if role == Qt.UserRole: + return tweak + return NONE + + def parse_tweaks(self, defaults, custom): + l, g = {}, {} + try: + exec custom in g, l + except: + print 'Failed to load custom tweaks file' + import traceback + traceback.print_exc() + dl, dg = {}, {} + exec defaults in dg, dl + lines = defaults.splitlines() + pos = 0 + self.tweaks = [] + while pos < len(lines): + line = lines[pos] + if line.startswith('#:'): + pos = self.read_tweak(lines, pos, dl, l) + pos += 1 + + default_keys = set(dl.iterkeys()) + custom_keys = set(l.iterkeys()) + + self.plugin_tweaks = {} + for key in custom_keys - default_keys: + self.plugin_tweaks[key] = l[key] + + def read_tweak(self, lines, pos, defaults, custom): + name = lines[pos][2:].strip() + doc, var_names = [], [] + while True: + pos += 1 + line = lines[pos] + if not line.startswith('#'): + break + doc.append(line[1:].strip()) + doc = '\n'.join(doc) + while True: + line = lines[pos] + if not line.strip(): + break + spidx1 = line.find(' ') + spidx2 = line.find('=') + spidx = spidx1 if spidx1 > 0 and (spidx2 == 0 or spidx2 > spidx1) else spidx2 + if spidx > 0: + var = line[:spidx] + if var not in defaults: + raise ValueError('%r not in default tweaks dict'%var) + var_names.append(var) + pos += 1 + if not var_names: + raise ValueError('Failed to find any variables for %r'%name) + self.tweaks.append(Tweak(name, doc, var_names, defaults, custom)) + #print '\n\n', self.tweaks[-1] + return pos + + def restore_to_default(self, idx): + tweak = self.data(idx, Qt.UserRole) + if tweak is not NONE: + tweak.restore_to_default() + self.dataChanged.emit(idx, idx) + + def restore_to_defaults(self): + for r in range(self.rowCount()): + self.restore_to_default(self.index(r)) + + def update_tweak(self, idx, varmap): + tweak = self.data(idx, Qt.UserRole) + if tweak is not NONE: + tweak.update(varmap) + self.dataChanged.emit(idx, idx) + + def to_string(self): + ans = ['#!/usr/bin/env python', + '# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai', '', + '# This file was automatically generated by calibre, do not' + ' edit it unless you know what you are doing.', '', + ] + for tweak in self.tweaks: + ans.extend(['', str(tweak), '']) + + if self.plugin_tweaks: + ans.extend(['', '', + '# The following are tweaks for installed plugins', '']) + for key, val in self.plugin_tweaks.iteritems(): + ans.extend(['%s = %r'%(key, val), '', '']) + return '\n'.join(ans) + + @property + def plugin_tweaks_string(self): + ans = [] + for key, val in self.plugin_tweaks.iteritems(): + ans.extend(['%s = %r'%(key, val), '', '']) + ans = '\n'.join(ans) + if isbytestring(ans): + ans = ans.decode('utf-8') + return ans + + def set_plugin_tweaks(self, d): + self.plugin_tweaks = d + +# }}} + +class PluginTweaks(QDialog): # {{{ + + def __init__(self, raw, parent=None): + QDialog.__init__(self, parent) + self.edit = QPlainTextEdit(self) + self.highlighter = PythonHighlighter(self.edit.document()) + self.l = QVBoxLayout() + self.setLayout(self.l) + self.l.addWidget(QLabel( + _('Add/edit tweaks for any custom plugins you have installed.'))) + self.l.addWidget(self.edit) + self.edit.setPlainText(raw) + self.bb = QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel, + Qt.Horizontal, self) + self.bb.accepted.connect(self.accept) + self.bb.rejected.connect(self.reject) + self.l.addWidget(self.bb) + +# }}} class ConfigWidget(ConfigWidgetBase, Ui_Form): def genesis(self, gui): self.gui = gui - self.current_tweaks.textChanged.connect(self.changed) + self.delegate = Delegate(self.tweaks_view) + self.tweaks_view.setItemDelegate(self.delegate) + self.tweaks_view.currentChanged = self.current_changed + self.highlighter = PythonHighlighter(self.edit_tweak.document()) + self.restore_default_button.clicked.connect(self.restore_to_default) + self.apply_button.clicked.connect(self.apply_tweak) + self.plugin_tweaks_button.clicked.connect(self.plugin_tweaks) + + def plugin_tweaks(self): + raw = self.tweaks.plugin_tweaks_string + d = PluginTweaks(raw, self) + if d.exec_() == d.Accepted: + g, l = {}, {} + try: + exec unicode(d.edit.toPlainText()) in g, l + except: + import traceback + return error_dialog(self, _('Failed'), + _('There was a syntax error in your tweak. Click ' + 'the show details button for details.'), show=True, + det_msg=traceback.format_exc()) + self.tweaks.set_plugin_tweaks(l) + self.changed() + + def current_changed(self, current, previous): + tweak = self.tweaks.data(current, Qt.UserRole) + self.help.setPlainText(tweak.doc) + self.edit_tweak.setPlainText(tweak.edit_text) def changed(self, *args): self.changed_signal.emit() def initialize(self): - deft, curt = read_raw_tweaks() - self.current_tweaks.blockSignals(True) - self.current_tweaks.setPlainText(curt.decode('utf-8')) - self.current_tweaks.blockSignals(False) + self.tweaks = Tweaks() + self.tweaks_view.setModel(self.tweaks) - self.default_tweaks.setPlainText(deft.decode('utf-8')) + def restore_to_default(self, *args): + idx = self.tweaks_view.currentIndex() + if idx.isValid(): + self.tweaks.restore_to_default(idx) + tweak = self.tweaks.data(idx, Qt.UserRole) + self.edit_tweak.setPlainText(tweak.edit_text) + self.changed() def restore_defaults(self): ConfigWidgetBase.restore_defaults(self) - deft, curt = read_raw_tweaks() - self.current_tweaks.setPlainText(deft.decode('utf-8')) + self.tweaks.restore_to_defaults() + self.changed() + def apply_tweak(self): + idx = self.tweaks_view.currentIndex() + if idx.isValid(): + l, g = {}, {} + try: + exec unicode(self.edit_tweak.toPlainText()) in g, l + except: + import traceback + error_dialog(self.gui, _('Failed'), + _('There was a syntax error in your tweak. Click ' + 'the show details button for details.'), + det_msg=traceback.format_exc(), show=True) + return + self.tweaks.update_tweak(idx, l) + self.changed() def commit(self): - raw = unicode(self.current_tweaks.toPlainText()).encode('utf-8') + raw = self.tweaks.to_string() try: exec raw except: @@ -54,5 +328,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): if __name__ == '__main__': from PyQt4.Qt import QApplication app = QApplication([]) + #Tweaks() + #test_widget test_widget('Advanced', 'Tweaks') diff --git a/src/calibre/gui2/preferences/tweaks.ui b/src/calibre/gui2/preferences/tweaks.ui index 8546873552..7194cce2f9 100644 --- a/src/calibre/gui2/preferences/tweaks.ui +++ b/src/calibre/gui2/preferences/tweaks.ui @@ -7,31 +7,70 @@ 0 0 660 - 351 + 531 Form - - - - - Values for the tweaks are shown below. Edit them to change the behavior of calibre. Your changes will only take effect after a restart of calibre. - - - true - - + + + + + + + Values for the tweaks are shown below. Edit them to change the behavior of calibre. Your changes will only take effect <b>after a restart</b> of calibre. + + + true + + + + + + + + 0 + 0 + + + + + 300 + 0 + + + + true + + + 5 + + + + + + + Edit tweaks for any custom plugins you have installed + + + &Plugin tweaks + + + + - - + + - All available tweaks + Help - - - + + + + + QPlainTextEdit::NoWrap + true @@ -40,14 +79,38 @@ - - + + - &Current tweaks + Edit tweak - - - + + + + + QPlainTextEdit::NoWrap + + + + + + + Restore this tweak to its default value + + + Restore &default + + + + + + + Apply any changes you made to this tweak + + + &Apply + + From 18adcba82f5f935ffc9259f7bd64bdcb9eecdb6f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 15:46:05 -0700 Subject: [PATCH 15/30] ... --- src/calibre/gui2/preferences/tweaks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/gui2/preferences/tweaks.py b/src/calibre/gui2/preferences/tweaks.py index fc3eb5a626..a0f9d1aab0 100644 --- a/src/calibre/gui2/preferences/tweaks.py +++ b/src/calibre/gui2/preferences/tweaks.py @@ -236,6 +236,7 @@ class PluginTweaks(QDialog): # {{{ self.bb.accepted.connect(self.accept) self.bb.rejected.connect(self.reject) self.l.addWidget(self.bb) + self.resize(550, 300) # }}} From a97ff28c343795b735d143571821d96074cf9e34 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 15:50:28 -0700 Subject: [PATCH 16/30] Fix #8822 (Calibre does not recognise my device) --- src/calibre/customize/builtins.py | 5 ++--- src/calibre/devices/teclast/driver.py | 12 ++++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index bd8e07fb58..ce964e0104 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -497,7 +497,7 @@ from calibre.devices.binatone.driver import README from calibre.devices.hanvon.driver import N516, EB511, ALEX, AZBOOKA, THEBOOK from calibre.devices.edge.driver import EDGE from calibre.devices.teclast.driver import TECLAST_K3, NEWSMY, IPAPYRUS, \ - SOVOS, PICO, SUNSTECH_EB700, ARCHOS7O + SOVOS, PICO, SUNSTECH_EB700, ARCHOS7O, STASH from calibre.devices.sne.driver import SNE from calibre.devices.misc import PALMPRE, AVANT, SWEEX, PDNOVEL, KOGAN, \ GEMEI, VELOCITYMICRO, PDNOVEL_KOBO, Q600, LUMIREAD, ALURATEK_COLOR, \ @@ -605,9 +605,8 @@ plugins += [ ELONEX, TECLAST_K3, NEWSMY, - PICO, SUNSTECH_EB700, ARCHOS7O, + PICO, SUNSTECH_EB700, ARCHOS7O, SOVOS, STASH, IPAPYRUS, - SOVOS, EDGE, SNE, ALEX, diff --git a/src/calibre/devices/teclast/driver.py b/src/calibre/devices/teclast/driver.py index 078e59da5b..2cca0085d7 100644 --- a/src/calibre/devices/teclast/driver.py +++ b/src/calibre/devices/teclast/driver.py @@ -92,3 +92,15 @@ class SUNSTECH_EB700(TECLAST_K3): VENDOR_NAME = 'SUNEB700' WINDOWS_MAIN_MEM = 'USB-MSC' +class STASH(TECLAST_K3): + + name = 'Stash device interface' + gui_name = 'Stash' + description = _('Communicate with the Stash W950 reader.') + + FORMATS = ['epub', 'fb2', 'lrc', 'pdb', 'html', 'fb2', 'wtxt', + 'txt', 'pdf'] + + VENDOR_NAME = 'STASH' + WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'W950' + From bdf5e0c3b1dbb02a0fd0b2614fbf8c9ac42277a5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 17:15:18 -0700 Subject: [PATCH 17/30] Fix #8897 (Calibre does not recognize Nexus S) --- src/calibre/devices/android/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index e6ad786cac..dea9725894 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -83,7 +83,7 @@ class ANDROID(USBMS): 'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', 'SCH-I500_CARD', 'SPH-D700_CARD', 'MB810', 'GT-P1000', 'DESIRE', 'SGH-T849', '_MB300', 'A70S', 'S_ANDROID', 'A101IT', 'A70H', - 'IDEOS_TABLET', 'MYTOUCH_4G'] + 'IDEOS_TABLET', 'MYTOUCH_4G', 'UMS_COMPOSITE'] WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'GT-I9000_CARD', 'SGH-I897', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', 'GT-P1000_CARD', 'A70S', 'A101IT'] From dfcfc697d54ed6c38b8a0679af3f7d51c854bee3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 18:06:15 -0700 Subject: [PATCH 18/30] ... --- resources/default_tweaks.py | 2 +- src/calibre/gui2/preferences/tweaks.ui | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 55b8f82c48..01a6e8bd75 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -336,7 +336,7 @@ doubleclick_on_library_view = 'open_viewer' # Example: locale_for_sorting = 'nb' -- sort using Norwegian rules. locale_for_sorting = '' -#: Use one or two columns for custom metadata fields in the edit metadata dialog +#: Number of columns for custom metadata in the edit metadata dialog # Set whether to use one or two columns for custom metadata when editing # metadata one book at a time. If True, then the fields are laid out using two # columns. If False, one column is used. diff --git a/src/calibre/gui2/preferences/tweaks.ui b/src/calibre/gui2/preferences/tweaks.ui index 7194cce2f9..139f9563ad 100644 --- a/src/calibre/gui2/preferences/tweaks.ui +++ b/src/calibre/gui2/preferences/tweaks.ui @@ -46,6 +46,9 @@ 5 + + true + From 7a6634d405739675d1dfd25cc55ed32912c701da Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Feb 2011 21:15:20 -0700 Subject: [PATCH 19/30] Kompas and Jakarta Post by Adrian Gunawan --- resources/recipes/jakarta_post.recipe | 67 +++++++++++++++++++++++ resources/recipes/kompas.recipe | 77 +++++++++++++++++++++++++++ src/calibre/utils/localization.py | 1 + 3 files changed, 145 insertions(+) create mode 100644 resources/recipes/jakarta_post.recipe create mode 100644 resources/recipes/kompas.recipe diff --git a/resources/recipes/jakarta_post.recipe b/resources/recipes/jakarta_post.recipe new file mode 100644 index 0000000000..d8d609469d --- /dev/null +++ b/resources/recipes/jakarta_post.recipe @@ -0,0 +1,67 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2011, Adrian Gunawan ' +__author__ = 'Adrian Gunawan' +__version__ = 'v1.0' +__date__ = '02 February 2011' + +''' +http://www.thejakartapost.com/ +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class JakartaPost(BasicNewsRecipe): + title = u'Jakarta Post' + masthead_url = 'http://www.thejakartapost.com/images/jakartapost_logo.jpg' + cover_url = 'http://www.thejakartapost.com/images/jakartapost_logo.jpg' + + __author__ = u'Adrian Gunawan' + description = u'Indonesian Newspaper in English from Jakarta Post Online Edition' + category = 'breaking news, national, business, international, Indonesia' + language = 'en_ID' + oldest_article = 2 + max_articles_per_feed = 100 + + no_stylesheets = True + use_embedded_content = False + no_javascript = True + remove_empty_feeds = True + + timefmt = ' [%A, %d %B, %Y]' + encoding = 'utf-8' + + keep_only_tags = [dict(name='div', attrs ={'id':'news-main'})] + + extra_css = ''' + h1{font-family:Georgia,"Times New Roman",Times,serif; font-weight:bold; font-size:large;} + .cT-storyDetails{font-family:Arial,Helvetica,sans-serif; color:#666666;font-size:x-small;} + .articleBody{font-family:Arial,Helvetica,sans-serif; color:black;font-size:small;} + .cT-imageLandscape{font-family:Arial,Helvetica,sans-serif; color:#333333 ;font-size:x-small;} + .source{font-family:Arial,Helvetica,sans-serif; color:#333333 ;font-size:xx-small;} + #content{font-family:Arial,Helvetica,sans-serif;font-size:x-small;} + .pageprint{font-family:Arial,Helvetica,sans-serif;font-size:small;} + #bylineDetails{font-family:Arial,Helvetica,sans-serif; color:#666666;font-size:x-small;} + .featurePic-wide{font-family:Arial,Helvetica,sans-serif;font-size:x-small;} + #idfeaturepic{font-family:Arial,Helvetica,sans-serif;font-size:x-small;} + h3{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;} + h2{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;} + h4{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;} + h5{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;} + body{font-family:Arial,Helvetica,sans-serif; font-size:x-small;} + ''' + + remove_tags = [ + dict(name='div', attrs ={'class':['text-size']}), + ] + + feeds = [ + + (u'Breaking News', u'http://www.thejakartapost.com/breaking/feed'), + (u'National', u'http://www.thejakartapost.com/channel/national/feed'), + (u'Archipelago', u'http://www.thejakartapost.com/channel/archipelago/feed'), + (u'Business', u'http://www.thejakartapost.com/channel/business/feed'), + (u'Jakarta', u'http://www.thejakartapost.com/channel/jakarta/feed'), + (u'World', u'http://www.thejakartapost.com/channel/world/feed'), + (u'Sports', u'http://www.thejakartapost.com/channel/sports/feed'), + ] diff --git a/resources/recipes/kompas.recipe b/resources/recipes/kompas.recipe new file mode 100644 index 0000000000..2f2804d59a --- /dev/null +++ b/resources/recipes/kompas.recipe @@ -0,0 +1,77 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2011, Adrian Gunawan ' +__author__ = 'Adrian Gunawan' +__version__ = 'v1.0' +__date__ = '02 February 2011' + +''' +http://www.kompas.com/ +''' + +import re +from calibre.web.feeds.news import BasicNewsRecipe + +class Kompas(BasicNewsRecipe): + title = u'Kompas' + masthead_url = 'http://stat.k.kidsklik.com/data/2k10/kompascom2011/images/logo_kompas.png' + cover_url = 'http://stat.k.kidsklik.com/data/2k10/kompascom2011/images/logo_kompas.png' + + __author__ = u'Adrian Gunawan' + description = u'Indonesian News from Kompas Online Edition' + category = 'local news, international, business, Indonesia' + language = 'id' + oldest_article = 5 + max_articles_per_feed = 100 + + no_stylesheets = True + use_embedded_content = False + no_javascript = True + remove_empty_feeds = True + + timefmt = ' [%A, %d %B, %Y]' + encoding = 'utf-8' + + keep_only_tags = [dict(name='div', attrs ={'class':'content_kiri_detail'})] + + extra_css = ''' + h1{font-family:Georgia,"Times New Roman",Times,serif; font-weight:bold; font-size:large;} + .cT-storyDetails{font-family:Arial,Helvetica,sans-serif; color:#666666;font-size:x-small;} + .articleBody{font-family:Arial,Helvetica,sans-serif; color:black;font-size:small;} + .cT-imageLandscape{font-family:Arial,Helvetica,sans-serif; color:#333333 ;font-size:x-small;} + .source{font-family:Arial,Helvetica,sans-serif; color:#333333 ;font-size:xx-small;} + #content{font-family:Arial,Helvetica,sans-serif;font-size:x-small;} + .pageprint{font-family:Arial,Helvetica,sans-serif;font-size:small;} + #bylineDetails{font-family:Arial,Helvetica,sans-serif; color:#666666;font-size:x-small;} + .featurePic-wide{font-family:Arial,Helvetica,sans-serif;font-size:x-small;} + #idfeaturepic{font-family:Arial,Helvetica,sans-serif;font-size:x-small;} + h3{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;} + h2{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;} + h4{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;} + h5{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;} + body{font-family:Arial,Helvetica,sans-serif; font-size:x-small;} + ''' + + remove_tags = [ + dict(name='div', attrs ={'class':['c_biru_kompas2011', 'c_abu01_kompas2011', 'c_abu_01_kompas2011', 'right', 'clearit']}), + dict(name='div', attrs ={'id':['comment_list', 'comment_paging', 'share']}), + dict(name='form'), + dict(name='ul'), + ] + + preprocess_regexps = [ + (re.compile(r'.*', re.DOTALL|re.IGNORECASE),lambda match: ''), + (re.compile(r'Sent Using.*', re.DOTALL|re.IGNORECASE),lambda match: ''), + (re.compile(r'Kirim Komentar Anda', re.DOTALL|re.IGNORECASE),lambda match: ''), + (re.compile(r']*>Kembali ke Index Topik Pilihan', re.DOTALL|re.IGNORECASE),lambda match: ''), + ] + + feeds = [ + (u'Nasional', u'http://www.kompas.com/getrss/nasional'), + (u'Regional', u'http://www.kompas.com/getrss/regional'), + (u'Internasional', u'http://www.kompas.com/getrss/internasional'), + (u'Megapolitan', u'http://www.kompas.com/getrss/megapolitan'), + (u'Bisnis Keuangan', u'http://www.kompas.com/getrss/bisniskeuangan'), + (u'Kesehatan', u'http://www.kompas.com/getrss/kesehatan'), + (u'Olahraga', u'http://www.kompas.com/getrss/olahraga'), + ] diff --git a/src/calibre/utils/localization.py b/src/calibre/utils/localization.py index 97356df081..1f869a6475 100644 --- a/src/calibre/utils/localization.py +++ b/src/calibre/utils/localization.py @@ -107,6 +107,7 @@ _extra_lang_codes = { 'en_CZ' : _('English (Czechoslovakia)'), 'en_PK' : _('English (Pakistan)'), 'en_HR' : _('English (Croatia)'), + 'en_ID' : _('English (Indonesia)'), 'en_IL' : _('English (Israel)'), 'en_SG' : _('English (Singapore)'), 'en_YE' : _('English (Yemen)'), From 740e8555478f0fe3d74a02d93ee786648eb1ba98 Mon Sep 17 00:00:00 2001 From: ldolse Date: Thu, 10 Feb 2011 22:32:39 +0800 Subject: [PATCH 20/30] convert entities for lit files going through txt processing --- src/calibre/ebooks/conversion/utils.py | 6 +++--- src/calibre/ebooks/lit/input.py | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py index a87392b54f..359915bdf0 100644 --- a/src/calibre/ebooks/conversion/utils.py +++ b/src/calibre/ebooks/conversion/utils.py @@ -338,11 +338,9 @@ class HeuristicProcessor(object): return content def txt_process(self, match): - from calibre.ebooks.txt.processor import convert_basic, preserve_spaces, \ - separate_paragraphs_single_line + from calibre.ebooks.txt.processor import convert_basic, separate_paragraphs_single_line content = match.group('text') content = separate_paragraphs_single_line(content) - content = preserve_spaces(content) content = convert_basic(content, epub_split_size_kb=0) return content @@ -352,6 +350,8 @@ class HeuristicProcessor(object): self.log.debug("Running Text Processing") outerhtml = re.compile(r'.*?(?<=
)(?P.*?)
', re.IGNORECASE|re.DOTALL) html = outerhtml.sub(self.txt_process, html) + from calibre.ebooks.conversion.preprocess import convert_entities + html = re.sub(r'&(\S+?);', convert_entities, html) else: # Add markup naively # TODO - find out if there are cases where there are more than one
 tag or
diff --git a/src/calibre/ebooks/lit/input.py b/src/calibre/ebooks/lit/input.py
index 9ccbba543f..4008f15d53 100644
--- a/src/calibre/ebooks/lit/input.py
+++ b/src/calibre/ebooks/lit/input.py
@@ -37,13 +37,12 @@ class LITInput(InputFormatPlugin):
                 body = body[0]
                 if len(body) == 1 and body[0].tag == XHTML('pre'):
                     pre = body[0]
-                    from calibre.ebooks.txt.processor import convert_basic, preserve_spaces, \
+                    from calibre.ebooks.txt.processor import convert_basic, \
                         separate_paragraphs_single_line
                     from calibre.ebooks.chardet import xml_to_unicode
                     from lxml import etree
                     import copy
                     html = separate_paragraphs_single_line(pre.text)
-                    html = preserve_spaces(html)
                     html = convert_basic(html).replace('',
                             ''%XHTML_NS)
                     html = xml_to_unicode(html, strip_encoding_pats=True,

From 0ac0fe5bcd02cfc1923b02ad2de459a378d169a7 Mon Sep 17 00:00:00 2001
From: Kovid Goyal 
Date: Thu, 10 Feb 2011 10:28:15 -0700
Subject: [PATCH 21/30] Fix regression that caused a spurious error message
 after moving a library. Also ensure that the entries in the Copy to Library
 menu are upadted after a library is moved/renamed/deleted. Fixes #8905 (After
 moving Library, the "Open in Containing Folder" option points to the old
 location)

---
 src/calibre/gui2/actions/choose_library.py | 16 +++++++++++++++-
 src/calibre/gui2/dialogs/choose_library.py |  2 ++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/calibre/gui2/actions/choose_library.py b/src/calibre/gui2/actions/choose_library.py
index 7034380a56..f3a7f1742d 100644
--- a/src/calibre/gui2/actions/choose_library.py
+++ b/src/calibre/gui2/actions/choose_library.py
@@ -237,6 +237,7 @@ class ChooseLibraryAction(InterfaceAction):
             return
         self.stats.rename(location, newloc)
         self.build_menus()
+        self.gui.iactions['Copy To Library'].build_menus()
 
     def delete_requested(self, name, location):
         loc = location.replace('/', os.sep)
@@ -253,6 +254,7 @@ class ChooseLibraryAction(InterfaceAction):
                 pass
         self.stats.remove(location)
         self.build_menus()
+        self.gui.iactions['Copy To Library'].build_menus()
 
     def backup_status(self, location):
         dirty_text = 'no'
@@ -329,6 +331,7 @@ class ChooseLibraryAction(InterfaceAction):
                     ' libraries.')%loc, show=True)
             self.stats.remove(location)
             self.build_menus()
+            self.gui.iactions['Copy To Library'].build_menus()
             return
 
         prefs['library_path'] = loc
@@ -371,9 +374,20 @@ class ChooseLibraryAction(InterfaceAction):
         if not self.change_library_allowed():
             return
         from calibre.gui2.dialogs.choose_library import ChooseLibrary
+        self.gui.library_view.save_state()
         db = self.gui.library_view.model().db
-        c = ChooseLibrary(db, self.gui.library_moved, self.gui)
+        location = self.stats.canonicalize_path(db.library_path)
+        self.pre_choose_dialog_location = location
+        c = ChooseLibrary(db, self.choose_library_callback, self.gui)
         c.exec_()
+        self.choose_dialog_library_renamed = getattr(c, 'library_renamed', False)
+
+    def choose_library_callback(self, newloc, copy_structure=False):
+        self.gui.library_moved(newloc, copy_structure=copy_structure)
+        if getattr(self, 'choose_dialog_library_renamed', False):
+            self.stats.rename(self.pre_choose_dialog_location, prefs['library_path'])
+        self.build_menus()
+        self.gui.iactions['Copy To Library'].build_menus()
 
     def change_library_allowed(self):
         if os.environ.get('CALIBRE_OVERRIDE_DATABASE_PATH', None):
diff --git a/src/calibre/gui2/dialogs/choose_library.py b/src/calibre/gui2/dialogs/choose_library.py
index 033b038b65..24bd6591c6 100644
--- a/src/calibre/gui2/dialogs/choose_library.py
+++ b/src/calibre/gui2/dialogs/choose_library.py
@@ -71,6 +71,8 @@ class ChooseLibrary(QDialog, Ui_Dialog):
             prefs['library_path'] = loc
             self.callback(loc, copy_structure=self.copy_structure.isChecked())
         else:
+            self.db.prefs.disable_setting = True
+            self.library_renamed = True
             move_library(self.db.library_path, loc, self.parent(),
                     self.callback)
 

From ad8d2f8889d47ce2717d9c4b2028791846c5b64c Mon Sep 17 00:00:00 2001
From: Kovid Goyal 
Date: Thu, 10 Feb 2011 10:55:30 -0700
Subject: [PATCH 22/30] EPUB Output: Cleanup zipfile code

---
 src/calibre/ebooks/epub/output.py | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/calibre/ebooks/epub/output.py b/src/calibre/ebooks/epub/output.py
index 2e254e99cc..0ed6d7e222 100644
--- a/src/calibre/ebooks/epub/output.py
+++ b/src/calibre/ebooks/epub/output.py
@@ -216,21 +216,22 @@ class EPUBOutput(OutputFormatPlugin):
                 encryption = self.encrypt_fonts(encrypted_fonts, tdir, uuid)
 
             from calibre.ebooks.epub import initialize_container
-            epub = initialize_container(output_path, os.path.basename(opf),
-                    extra_entries=extra_entries)
-            epub.add_dir(tdir)
-            if encryption is not None:
-                epub.writestr('META-INF/encryption.xml', encryption)
-            if metadata_xml is not None:
-                epub.writestr('META-INF/metadata.xml',
-                        metadata_xml.encode('utf-8'))
+            with initialize_container(output_path, os.path.basename(opf),
+                    extra_entries=extra_entries) as epub:
+                epub.add_dir(tdir)
+                if encryption is not None:
+                    epub.writestr('META-INF/encryption.xml', encryption)
+                if metadata_xml is not None:
+                    epub.writestr('META-INF/metadata.xml',
+                            metadata_xml.encode('utf-8'))
             if opts.extract_to is not None:
+                from calibre.utils.zipfile import ZipFile
                 if os.path.exists(opts.extract_to):
                     shutil.rmtree(opts.extract_to)
                 os.mkdir(opts.extract_to)
-                epub.extractall(path=opts.extract_to)
+                with ZipFile(output_path) as zf:
+                    zf.extractall(path=opts.extract_to)
                 self.log.info('EPUB extracted to', opts.extract_to)
-            epub.close()
 
     def encrypt_fonts(self, uris, tdir, uuid): # {{{
         from binascii import unhexlify

From dc84821cecc09a5f0762c3d447764dfc7aadf898 Mon Sep 17 00:00:00 2001
From: Kovid Goyal 
Date: Thu, 10 Feb 2011 12:06:21 -0700
Subject: [PATCH 23/30] E-book viewer: Fix bug that could cause the bottom of
 chapters to get cut-off if the topmost element had a large top margin. Fixes
 #8791 (Viewer cutting of chapter ends)

---
 src/calibre/gui2/viewer/documentview.py | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py
index 4485e63373..4102aea412 100644
--- a/src/calibre/gui2/viewer/documentview.py
+++ b/src/calibre/gui2/viewer/documentview.py
@@ -440,16 +440,17 @@ class Document(QWebPage): # {{{
 
     @property
     def height(self):
-        j = self.javascript('document.body.offsetHeight', 'int')
+        # Note that document.body.offsetHeight does not include top and bottom
+        # margins on body and in some cases does not include the top margin on
+        # the first element inside body either. See ticket #8791 for an example
+        # of the latter.
         q = self.mainFrame().contentsSize().height()
-        if q == j:
-            return j
-        if min(j, q) <= 0:
-            return max(j, q)
-        window_height = self.window_height
-        if j == window_height:
-            return j if q < 1.2*j else q
-        return j
+        if q < 0:
+            # Don't know if this is still needed, but it can't hurt
+            j = self.javascript('document.body.offsetHeight', 'int')
+            if j >= 0:
+                q = j
+        return q
 
     @property
     def width(self):

From f46f0c0612661a9c7d2faefb1d81a2b5c996123c Mon Sep 17 00:00:00 2001
From: Kovid Goyal 
Date: Thu, 10 Feb 2011 12:17:23 -0700
Subject: [PATCH 24/30] Fix #8871 (A Samsung Tab useing "IReader" is not being
 detected.)

---
 src/calibre/devices/android/driver.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py
index dea9725894..baefdfc41d 100644
--- a/src/calibre/devices/android/driver.py
+++ b/src/calibre/devices/android/driver.py
@@ -83,7 +83,7 @@ class ANDROID(USBMS):
             'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID',
             'SCH-I500_CARD', 'SPH-D700_CARD', 'MB810', 'GT-P1000', 'DESIRE',
             'SGH-T849', '_MB300', 'A70S', 'S_ANDROID', 'A101IT', 'A70H',
-            'IDEOS_TABLET', 'MYTOUCH_4G', 'UMS_COMPOSITE']
+            'IDEOS_TABLET', 'MYTOUCH_4G', 'UMS_COMPOSITE', 'SCH-I800_CARD']
     WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'GT-I9000_CARD', 'SGH-I897',
             'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', 'GT-P1000_CARD',
             'A70S', 'A101IT']

From 40487168d52d0ae09ffc21882ad4b1aafb774366 Mon Sep 17 00:00:00 2001
From: Kovid Goyal 
Date: Thu, 10 Feb 2011 12:20:31 -0700
Subject: [PATCH 25/30] Updated recipe for El periodico de Aragon

---
 resources/recipes/el_periodico.recipe | 47 ++++++++++++++++++---------
 1 file changed, 32 insertions(+), 15 deletions(-)

diff --git a/resources/recipes/el_periodico.recipe b/resources/recipes/el_periodico.recipe
index 2c3ed456fb..6d55280db8 100644
--- a/resources/recipes/el_periodico.recipe
+++ b/resources/recipes/el_periodico.recipe
@@ -5,8 +5,8 @@ __license__     = 'GPL v3'
 __copyright__   = '04 December 2010, desUBIKado'
 __author__      = 'desUBIKado'
 __description__ = 'Daily newspaper from Aragon'
-__version__     = 'v0.05'
-__date__        = '07, December 2010'
+__version__     = 'v0.07'
+__date__        = '06, February 2011'
 '''
 elperiodicodearagon.com
 '''
@@ -38,22 +38,26 @@ class elperiodicodearagon(BasicNewsRecipe):
                             ,'publisher' : publisher
                          }
 
-    feeds              = [(u'Arag\xf3n', u'http://elperiodicodearagon.com/RSS/2.xml'),
-                          (u'Internacional', u'http://elperiodicodearagon.com/RSS/4.xml'),
-                          (u'Espa\xf1a', u'http://elperiodicodearagon.com/RSS/3.xml'),
-                          (u'Econom\xeda', u'http://elperiodicodearagon.com/RSS/5.xml'),
-                          (u'Deportes', u'http://elperiodicodearagon.com/RSS/7.xml'),
-                          (u'Real Zaragoza', u'http://elperiodicodearagon.com/RSS/10.xml'),
-                          (u'Opini\xf3n', u'http://elperiodicodearagon.com/RSS/103.xml'),
-                          (u'Escenarios', u'http://elperiodicodearagon.com/RSS/105.xml'),
-                          (u'Sociedad', u'http://elperiodicodearagon.com/RSS/104.xml'),
-                          (u'Gente', u'http://elperiodicodearagon.com/RSS/330.xml')]
+    feeds              = [
+                           (u'Arag\xf3n', u'http://elperiodicodearagon.com/RSS/2.xml'),
+                           (u'Internacional', u'http://elperiodicodearagon.com/RSS/4.xml'),
+                           (u'Espa\xf1a', u'http://elperiodicodearagon.com/RSS/3.xml'),
+                           (u'Econom\xeda', u'http://elperiodicodearagon.com/RSS/5.xml'),
+                           (u'Deportes', u'http://elperiodicodearagon.com/RSS/7.xml'),
+                           (u'Real Zaragoza', u'http://elperiodicodearagon.com/RSS/10.xml'),
+                           (u'Opini\xf3n', u'http://elperiodicodearagon.com/RSS/103.xml'),
+                           (u'Escenarios', u'http://elperiodicodearagon.com/RSS/105.xml'),
+                           (u'Sociedad', u'http://elperiodicodearagon.com/RSS/104.xml'),
+                           (u'Gente', u'http://elperiodicodearagon.com/RSS/330.xml')
+                         ]
 
 
     extra_css = '''
-                    h3{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:xx-large;}
-                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
-                    dd{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
+                    h3 {font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:30px;}
+                    h2 {font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:18px;}
+                    h4 {font-family:Arial,Helvetica,sans-serif; font-style:italic; font-weight:normal;font-size:20px;}
+                    .columnaDeRecursosRelacionados {font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:14px;}
+                    img{margin-bottom: 0.4em}
 		'''
 
     remove_attributes = ['height','width']
@@ -82,6 +86,7 @@ class elperiodicodearagon(BasicNewsRecipe):
                           dict(name='a', attrs={'class':'AvisoComentario'}),
                           dict(name='div', attrs={'class':'CajaAvisoComentario'}),
                           dict(name='div', attrs={'class':'navegaNoticias'}),
+                          dict(name='div', attrs={'class':'Mensaje'}),
                           dict(name='div', attrs={'id':'PaginadorDiCom'}),
                           dict(name='div', attrs={'id':'CajaAccesoCuentaUsuario'}),
                           dict(name='div', attrs={'id':'CintilloComentario'}),
@@ -107,3 +112,15 @@ class elperiodicodearagon(BasicNewsRecipe):
         (re.compile(r'

', re.DOTALL|re.IGNORECASE), lambda match: ''), (re.compile(r'

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

') ] + + # Para sustituir el video incrustado de YouTube por una imagen + + def preprocess_html(self, soup): + for video_yt in soup.findAll('iframe',{'title':'YouTube video player'}): + if video_yt: + video_yt.name = 'img' + fuente = video_yt['src'] + fuente2 = fuente.replace('http://www.youtube.com/embed/','http://img.youtube.com/vi/') + video_yt['src'] = fuente2 + '/0.jpg' + + return soup From c97e1158734e486586e4be57e48442a0daf27b6d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 10 Feb 2011 12:22:13 -0700 Subject: [PATCH 26/30] ... --- src/calibre/manual/conversion.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/manual/conversion.rst b/src/calibre/manual/conversion.rst index 60f8a10fc6..73358e0f72 100644 --- a/src/calibre/manual/conversion.rst +++ b/src/calibre/manual/conversion.rst @@ -561,9 +561,10 @@ format, whether input or output are available in the conversion dialog under the Convert Microsoft Word documents ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -|app| does not directly convert .doc files from Microsoft Word. However, in Word, you can save the document +|app| does not directly convert .doc/.docx files from Microsoft Word. However, in Word, you can save the document as HTML and then convert the resulting HTML file with |app|. When saving as HTML, be sure to use the -"Save as Web Page, Filtered" option as this will produce clean HTML that will convert well. +"Save as Web Page, Filtered" option as this will produce clean HTML that will convert well. Note that Word +produces really messy HTML, converting it can take a long time, so be patient. There is a Word macro package that can automate the conversion of Word documents using |app|. It also makes generating the Table of Contents much simpler. It is called BookCreator and is available for free From f403520cc81ca40382b80c0b0a613097e5820070 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 10 Feb 2011 12:58:22 -0700 Subject: [PATCH 27/30] MOBI Output: Fix bug that was discarding non breaking spaces at the start of a paragraph when they were followed immediately by a tag. Fixes #4887 (Treatment of italics when converting to Mobi) --- src/calibre/ebooks/mobi/mobiml.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/mobi/mobiml.py b/src/calibre/ebooks/mobi/mobiml.py index 9733c5f4ca..17a14d9e12 100644 --- a/src/calibre/ebooks/mobi/mobiml.py +++ b/src/calibre/ebooks/mobi/mobiml.py @@ -39,6 +39,13 @@ def asfloat(value): return 0.0 return float(value) +def isspace(text): + if not text: + return True + if u'\xa0' in text: + return False + return text.isspace() + class BlockState(object): def __init__(self, body): self.body = body @@ -438,7 +445,7 @@ class MobiMLizer(object): if elem.text: if istate.preserve: text = elem.text - elif len(elem) > 0 and elem.text.isspace(): + elif len(elem) > 0 and isspace(elem.text): text = None else: text = COLLAPSE.sub(' ', elem.text) @@ -481,7 +488,7 @@ class MobiMLizer(object): if child.tail: if istate.preserve: tail = child.tail - elif bstate.para is None and child.tail.isspace(): + elif bstate.para is None and isspace(child.tail): tail = None else: tail = COLLAPSE.sub(' ', child.tail) From 2495b7746585d3d1ea4bb594824068c9c83c09db Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 10 Feb 2011 13:05:50 -0700 Subject: [PATCH 28/30] Weblogs SL by desUBIKado --- resources/recipes/weblogs_sl.recipe | 104 ++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 resources/recipes/weblogs_sl.recipe diff --git a/resources/recipes/weblogs_sl.recipe b/resources/recipes/weblogs_sl.recipe new file mode 100644 index 0000000000..c23c6c5093 --- /dev/null +++ b/resources/recipes/weblogs_sl.recipe @@ -0,0 +1,104 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '4 February 2011, desUBIKado' +__author__ = 'desUBIKado' +__version__ = 'v0.05' +__date__ = '9, February 2011' +''' +http://www.weblogssl.com/ +''' + +import re +from calibre.web.feeds.news import BasicNewsRecipe + +class weblogssl(BasicNewsRecipe): + __author__ = 'desUBIKado' + description = u'Weblogs colectivos dedicados a seguir la actualidad sobre tecnologia, entretenimiento, estilos de vida, motor, deportes y economia.' + title = u'Weblogs SL (Xataka, Genbeta, VidaExtra, Blog de Cine y otros)' + publisher = 'Weblogs SL' + category = 'Gadgets, Tech news, Product reviews, mobiles, science, cinema, entertainment, culture, tv, food, recipes, life style, motor, F1, sports, economy' + language = 'es' + timefmt = '[%a, %d %b, %Y]' + oldest_article = 1.5 + max_articles_per_feed = 100 + encoding = 'utf-8' + use_embedded_content = False + remove_empty_feeds = True + remove_javascript = True + no_stylesheets = True + + # Si no se quiere recuperar todos los blogs se puede suprimir la descarga del que se desee poniendo + # un caracter # por delante, es decir, # (u'Applesfera', u'http://feeds.weblogssl.com/applesfera'), + # haría que no se descargase Applesfera. OJO: El último feed no debe llevar la coma al final + + feeds = [ + (u'Xataka', u'http://feeds.weblogssl.com/xataka2'), + (u'Xataka M\xf3vil', u'http://feeds.weblogssl.com/xatakamovil'), + (u'Xataka Android', u'http://feeds.weblogssl.com/xatakandroid'), + (u'Xataka Foto', u'http://feeds.weblogssl.com/xatakafoto'), + (u'Xataka ON', u'http://feeds.weblogssl.com/xatakaon'), + (u'Xataka Ciencia', u'http://feeds.weblogssl.com/xatakaciencia'), + (u'Genbeta', u'http://feeds.weblogssl.com/genbeta'), + (u'Applesfera', u'http://feeds.weblogssl.com/applesfera'), + (u'Vida Extra', u'http://feeds.weblogssl.com/vidaextra'), + (u'Naci\xf3n Red', u'http://feeds.weblogssl.com/nacionred'), + (u'Blog de Cine', u'http://feeds.weblogssl.com/blogdecine'), + (u'Vaya tele', u'http://feeds.weblogssl.com/vayatele2'), + (u'Hipers\xf3nica', u'http://feeds.weblogssl.com/hipersonica'), + (u'Diario del viajero', u'http://feeds.weblogssl.com/diariodelviajero'), + (u'Papel en blanco', u'http://feeds.weblogssl.com/papelenblanco'), + (u'Pop rosa', u'http://feeds.weblogssl.com/poprosa'), + (u'Zona FandoM', u'http://feeds.weblogssl.com/zonafandom'), + (u'Fandemia', u'http://feeds.weblogssl.com/fandemia'), + (u'Noctamina', u'http://feeds.weblogssl.com/noctamina'), + (u'Tendencias', u'http://feeds.weblogssl.com/trendencias'), + (u'Beb\xe9s y m\xe1s', u'http://feeds.weblogssl.com/bebesymas'), + (u'Directo al paladar', u'http://feeds.weblogssl.com/directoalpaladar'), + (u'Compradicci\xf3n', u'http://feeds.weblogssl.com/compradiccion'), + (u'Decoesfera', u'http://feeds.weblogssl.com/decoesfera'), + (u'Embelezzia', u'http://feeds.weblogssl.com/embelezzia'), + (u'Vit\xf3nica', u'http://feeds.weblogssl.com/vitonica'), + (u'Ambiente G', u'http://feeds.weblogssl.com/ambienteg'), + (u'Arrebatadora', u'http://feeds.weblogssl.com/arrebatadora'), + (u'Mensencia', u'http://feeds.weblogssl.com/mensencia'), + (u'Peques y m\xe1s', u'http://feeds.weblogssl.com/pequesymas'), + (u'Motorpasi\xf3n', u'http://feeds.weblogssl.com/motorpasion'), + (u'Motorpasi\xf3n F1', u'http://feeds.weblogssl.com/motorpasionf1'), + (u'Motorpasi\xf3n Moto', u'http://feeds.weblogssl.com/motorpasionmoto'), + (u'Notas de futbol', u'http://feeds.weblogssl.com/notasdefutbol'), + (u'Fuera de l\xedmites', u'http://feeds.weblogssl.com/fueradelimites'), + (u'Salir a ganar', u'http://feeds.weblogssl.com/saliraganar'), + (u'El blog salm\xf3n', u'http://feeds.weblogssl.com/elblogsalmon2'), + (u'Pymes y aut\xf3nomos', u'http://feeds.weblogssl.com/pymesyautonomos'), + (u'Tecnolog\xeda Pyme', u'http://feeds.weblogssl.com/tecnologiapyme'), + (u'Ahorro diario', u'http://feeds.weblogssl.com/ahorrodiario') + ] + + + keep_only_tags = [dict(name='div', attrs={'id':'infoblock'}), + dict(name='div', attrs={'class':'post'}), + dict(name='div', attrs={'id':'blog-comments'}) + ] + + remove_tags = [dict(name='div', attrs={'id':'comment-nav'})] + + def print_version(self, url): + return url.replace('http://www.', 'http://m.') + + preprocess_regexps = [ + # Para poner una linea en blanco entre un comentario y el siguiente + (re.compile(r'

  • Date: Thu, 10 Feb 2011 13:09:17 -0700 Subject: [PATCH 29/30] ... --- src/calibre/gui2/preferences/tweaks.py | 8 +- src/calibre/translations/calibre.pot | 1344 +++++++++++++----------- 2 files changed, 750 insertions(+), 602 deletions(-) diff --git a/src/calibre/gui2/preferences/tweaks.py b/src/calibre/gui2/preferences/tweaks.py index a0f9d1aab0..10056ccb7b 100644 --- a/src/calibre/gui2/preferences/tweaks.py +++ b/src/calibre/gui2/preferences/tweaks.py @@ -227,8 +227,12 @@ class PluginTweaks(QDialog): # {{{ self.highlighter = PythonHighlighter(self.edit.document()) self.l = QVBoxLayout() self.setLayout(self.l) - self.l.addWidget(QLabel( - _('Add/edit tweaks for any custom plugins you have installed.'))) + self.msg = QLabel( + _('Add/edit tweaks for any custom plugins you have installed. ' + 'Documentation for these tweaks should be available ' + 'on the website from where you downloaded the plugins.')) + self.msg.setWordWrap(True) + self.l.addWidget(self.msg) self.l.addWidget(self.edit) self.edit.setPlainText(raw) self.bb = QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel, diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index 4b74a68108..6ddde0e6e2 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.7.44\n" -"POT-Creation-Date: 2011-02-04 11:04+MST\n" -"PO-Revision-Date: 2011-02-04 11:04+MST\n" +"POT-Creation-Date: 2011-02-10 13:08+MST\n" +"PO-Revision-Date: 2011-02-10 13:08+MST\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -23,7 +23,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:87 #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:88 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:77 #: /home/kovid/work/calibre/src/calibre/devices/kobo/books.py:24 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:466 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 @@ -47,9 +47,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:32 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:73 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:382 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:387 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:619 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:379 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:384 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 #: /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:54 @@ -70,7 +70,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/rtf.py:101 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/snb.py:16 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/sources/google.py:61 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:14 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:18 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txtz.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:42 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:68 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:81 @@ -84,11 +85,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:958 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:963 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1029 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:111 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:118 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:145 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:152 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:65 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:173 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:174 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26 @@ -113,51 +114,52 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:101 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:312 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:314 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:299 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:311 #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:100 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:332 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:335 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:151 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1075 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1078 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1092 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:731 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:732 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:236 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:245 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:424 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:443 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:970 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1163 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:978 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1171 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:191 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:432 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:444 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1534 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1637 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2540 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2542 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2673 -#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:229 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:430 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:436 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:446 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1539 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1642 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2545 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2547 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2678 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:233 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:158 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:161 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:79 -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:129 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:131 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:64 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:78 @@ -197,9 +199,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:525 #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:18 #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:302 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 msgid "Preferences" msgstr "" @@ -239,6 +241,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:300 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:311 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:321 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:332 msgid "Read metadata from %s files" msgstr "" @@ -246,190 +249,200 @@ msgstr "" msgid "Read metadata from ebooks in RAR archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:332 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:343 msgid "Read metadata from ebooks in ZIP archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:345 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:355 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:365 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:387 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:356 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:376 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:398 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:408 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:409 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:419 msgid "Set metadata in %s files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:376 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:387 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:430 msgid "Set metadata from %s files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:727 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:750 msgid "Look and Feel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:798 msgid "Interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:733 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:739 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 msgid "Behavior" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 msgid "Change the way calibre behaves" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:750 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:217 msgid "Add your own columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 msgid "Add/remove your own columns to the calibre book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:761 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:784 msgid "Customize the toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 msgid "Customize the toolbars and context menus, changing which actions are available in each" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +msgid "Customize searching" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +msgid "Customize the way searching for books works in calibre" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:807 msgid "Input Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:831 msgid "Conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813 msgid "Set conversion options specific to each input format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:784 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:818 msgid "Common Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 msgid "Set conversion options common to all formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:795 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Output Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:835 msgid "Set conversion options specific to each output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:806 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 msgid "Adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:854 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:866 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:878 msgid "Import/Export" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:812 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846 msgid "Control how calibre reads metadata from files when adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:818 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Saving books to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:858 msgid "Control how calibre exports files from its database to disk when using Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 msgid "Sending books to devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 msgid "Control how calibre transfers files to your ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:848 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882 msgid "Change metadata fields before saving/sending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 msgid "Template Functions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:903 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:914 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:889 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:925 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:937 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:948 msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:893 msgid "Create your own template functions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:898 msgid "Sharing books by email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:866 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:878 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:900 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:912 msgid "Sharing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:904 msgid "Setup sharing of books via email. Can be used for automatic sending of downloaded news to your devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:910 msgid "Sharing over the net" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:916 msgid "Setup the calibre Content Server which will give you access to your calibre library from anywhere, on any device, over the internet" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:889 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:269 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:923 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:267 msgid "Plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:895 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:929 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:901 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:935 msgid "Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:907 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:941 msgid "Fine tune how calibre behaves in various contexts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:912 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:946 msgid "Miscellaneous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:918 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:952 msgid "Miscellaneous advanced configuration" msgstr "" @@ -650,11 +663,11 @@ msgstr "" msgid "Communicate with Android phones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:62 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:73 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:108 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:120 msgid "Communicate with S60 phones." msgstr "" @@ -725,7 +738,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:262 #: /home/kovid/work/calibre/src/calibre/library/database2.py:244 #: /home/kovid/work/calibre/src/calibre/library/database2.py:257 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2404 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2409 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:150 msgid "News" msgstr "" @@ -733,8 +746,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2554 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:65 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:634 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2367 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2385 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2372 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2390 msgid "Catalog" msgstr "" @@ -976,15 +989,15 @@ msgstr "" msgid "Communicate with the JetBook Mini reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:44 msgid "Communicate with the Kindle eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:171 msgid "Communicate with the Kindle 2/3 eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:211 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:231 msgid "Communicate with the Kindle DX eBook reader." msgstr "" @@ -1175,6 +1188,10 @@ msgstr "" msgid "Communicate with the Sunstech EB700 reader." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:99 +msgid "Communicate with the Stash W950 reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:261 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" @@ -2121,103 +2138,103 @@ msgstr "" msgid "TEMPLATE ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:544 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:541 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:544 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:541 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:554 msgid "Yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:615 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:421 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:975 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:983 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:590 msgid "Title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:619 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:426 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:984 msgid "Author(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:617 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:621 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:622 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:619 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:40 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:214 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:383 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1182 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1190 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 msgid "Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:624 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:166 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:621 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:371 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1178 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1186 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:657 msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:626 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:164 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:623 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:388 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1187 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1195 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 msgid "Series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:627 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:624 msgid "Language" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:629 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1170 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:626 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1178 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:631 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:163 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:628 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:259 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:633 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:630 msgid "Rights" msgstr "" @@ -2688,7 +2705,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:220 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:703 msgid "Book %s of %s" msgstr "" @@ -2696,11 +2713,7 @@ msgstr "" msgid "HTML TOC generation options." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:130 -msgid "Unknown publisher" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:165 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:655 msgid "Rating" @@ -2741,7 +2754,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/output.py:32 #: /home/kovid/work/calibre/src/calibre/ebooks/pml/output.py:37 #: /home/kovid/work/calibre/src/calibre/ebooks/rb/output.py:21 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:41 msgid "Add Table of Contents to beginning of the book." msgstr "" @@ -2962,7 +2975,7 @@ msgid "Do not reduce the size or bit depth of images. Images have their size and msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:96 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:97 msgid "Table of Contents:" msgstr "" @@ -2978,12 +2991,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:25 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/output.py:23 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:30 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:37 msgid "Specify the character encoding of the output document. The default is utf-8." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:29 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:37 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:44 msgid "The maximum number of characters per line. This splits on the first space before the specified value. If no space is found the line will be broken at the space after and will exceed the specified value. Also, there is a minimum of 25 characters. Use 0 to disable line splitting." msgstr "" @@ -3017,7 +3030,7 @@ msgstr "" msgid " (Preface)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:28 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:32 msgid "" "Paragraph structure.\n" "choices are ['auto', 'block', 'single', 'print', 'unformatted']\n" @@ -3027,7 +3040,7 @@ msgid "" "* print: Assume every line starting with 2+ spaces or a tab starts a paragraph.* unformatted: Most lines have hard line breaks, few/no blank lines or indents." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:38 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:42 msgid "" "Formatting used within the document.* auto: Automatically decide which formatting processor to use.\n" "* none: Do not process the document formatting. Everything is a paragraph and no styling is applied.\n" @@ -3036,23 +3049,27 @@ msgid "" "* markdown: Processing using markdown formatting. To learn more about markdown see" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:48 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:52 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:51 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:55 +msgid "Normally extra space at the beginning of lines is retained. With this option they will be removed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:58 msgid "Do not insert a Table of Contents into the output text." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:31 msgid "Type of newline to use. Options are %s. Default is 'system'. Use 'old_mac' for compatibility with Mac OS 9 and earlier. For Mac OS X use 'unix'. 'system' will default to the newline type used by this OS." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:44 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:51 msgid "Force splitting on the max-line-length value when no space is present. Also allows max-line-length to be below the minimum" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:49 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:56 msgid "" "Formatting used within the document.\n" "* plain: Produce plain text.\n" @@ -3060,128 +3077,136 @@ msgid "" "* textile: Produce Textile formatted text." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:55 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:62 msgid "Do not remove links within the document. This is only useful when paired with a txt-output-formatting option that is not none because links are always removed with plain text output." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:60 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:67 msgid "Do not remove image references within the document. This is only useful when paired with a txt-output-formatting option that is not none because links are always removed with plain text output." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Send file to storage card instead of main memory by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Confirm before deleting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 msgid "Main window geometry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Notify when a new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Use Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 msgid "Sort tags list by name, popularity, or rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:83 msgid "Number of covers to show in the cover browsing mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:85 msgid "Defaults for conversion to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 msgid "Options for the LRF ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Formats that are viewed using the internal viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 msgid "Columns to be displayed in the book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Automatically launch content server on application startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:94 msgid "Oldest news kept in database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "Show system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "Upload downloaded news to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Delete books from library after uploading to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 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:102 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:103 msgid "Disable notifications from the system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:105 msgid "Default action to perform when send to device button is clicked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:110 +msgid "Start searching as you type. If this is disabled then search will only take place when the Enter or Return key is pressed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:113 +msgid "When searching, show all books with search results highlighted instead of showing only the matches. You can use the N or F3 keys to go to the next match." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 msgid "Maximum number of waiting worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Download social metadata (tags/rating/etc.)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:135 msgid "Overwrite author and title with new metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:101 msgid "Automatically download the cover, if available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:139 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:141 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:143 msgid "The layout of the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:145 msgid "Show the average rating per item indication in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:147 msgid "Disable UI animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:415 msgid "Choose Files" msgstr "" @@ -3228,7 +3253,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:192 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:308 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:529 msgid "Books" msgstr "" @@ -3285,7 +3310,7 @@ msgid "Merged some books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:247 -msgid "Some duplicates were found and merged into the following existing books:" +msgid "The following duplicate books were found and incoming book formats were processed and merged into your Calibre database according to your automerge settings:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 @@ -3489,95 +3514,97 @@ msgstr "" msgid "Failed to rename the library at %s. The most common cause for this is if one of the files in the library is open in another program." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:360 #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:424 #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:430 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:273 msgid "Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:245 msgid "All files from %s will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:265 msgid "none" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:266 msgid "Backup status" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:267 msgid "Book metadata files remaining to be written: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:273 msgid "Backup metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:274 msgid "Metadata will be backed up while calibre is running, at the rate of approximately 1 book every three seconds." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:306 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:286 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:338 msgid "Success" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:307 msgid "Found no errors in your calibre library database. Do you want calibre to check if the files in your library match the information in the database?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:310 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:672 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:905 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:308 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:313 msgid "Database integrity check failed, click Show details for details." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:318 msgid "No problems found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:319 msgid "The files in your library match the information in the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:326 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:328 msgid "No library found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:329 msgid "No existing calibre library was found at %s. It will be removed from the list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:399 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:780 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:395 msgid "You cannot change libraries while using the environment variable CALIBRE_OVERRIDE_DATABASE_PATH." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:400 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -3598,7 +3625,7 @@ msgid "Bulk convert" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:508 msgid "Cannot convert" msgstr "" @@ -3790,19 +3817,19 @@ msgstr "" msgid "(delete from library)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:103 msgid "Setup email based sharing of books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:121 msgid "D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:121 msgid "Send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:140 msgid "Connect/share" msgstr "" @@ -3879,7 +3906,7 @@ msgid "covers" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:227 msgid "metadata" msgstr "" @@ -3942,6 +3969,7 @@ msgid "F1" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/help.py:16 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:79 msgid "Help" msgstr "" @@ -3954,7 +3982,7 @@ msgid "Move to next highlighted match" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/next_match.py:13 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:355 msgid "N" msgstr "" @@ -3993,7 +4021,7 @@ msgid "Ctrl+P" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:201 msgid "Run welcome wizard" msgstr "" @@ -4001,16 +4029,16 @@ msgstr "" msgid "Restart in debug mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:44 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:40 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:45 msgid "Cannot configure before calibre is restarted." msgstr "" @@ -4210,60 +4238,60 @@ msgstr "" msgid "Searching in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 msgid "Adding..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:258 msgid "Searching in all sub-directories..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:269 msgid "Path error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:270 msgid "The specified directory could not be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:274 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:821 msgid "No books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:275 msgid "No books found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:339 msgid "Added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:352 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:353 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:344 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:368 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:369 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:348 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:372 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:441 msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:492 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:516 msgid "Saved" msgstr "" @@ -4413,8 +4441,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:132 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1168 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1176 msgid "Path" msgstr "" @@ -4424,15 +4452,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:134 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:375 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 msgid "Formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:979 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1171 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:987 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1179 msgid "Collections" msgstr "" @@ -4442,11 +4470,11 @@ msgid "Click to open" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:370 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1177 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1181 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1185 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1189 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 @@ -4478,7 +4506,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input.py:13 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:16 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:14 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txtz_output.py:13 msgid "Options specific to" msgstr "" @@ -4494,7 +4523,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pml_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output.py:15 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:16 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:14 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txtz_output.py:13 msgid "output" msgstr "" @@ -4523,30 +4553,31 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:91 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:40 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:135 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/search_ui.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:123 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/template_functions_ui.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:123 msgid "Form" msgstr "" @@ -5424,50 +5455,50 @@ msgstr "" msgid "&Monospaced font family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:49 msgid "Set the metadata. The output file will contain as much of this metadata as possible." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:180 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:642 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:643 msgid "Choose cover for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:187 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:650 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:651 msgid "Cannot read" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:651 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:652 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:194 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:203 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:659 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:660 msgid "Error reading file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:197 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:660 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:661 msgid "

    There was an error reading from file:
    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:204 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:196 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:671 msgid " is not a valid picture" msgstr "" @@ -5535,7 +5566,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:517 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:433 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:292 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:293 msgid "&Series:" msgstr "" @@ -5545,7 +5576,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:519 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:434 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:435 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:292 msgid "List of known series. You can add new series." msgstr "" @@ -5943,31 +5974,43 @@ msgstr "" msgid "TXT Input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:92 +msgid "Structure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:93 msgid "Paragraph style:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:60 -msgid "Preserve &spaces" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:94 msgid "Formatting style:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:62 -msgid "Markdown Options" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:95 +msgid "Common" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:96 +msgid "Preserve &spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:97 +msgid "Remove indents at the beginning of lines" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:98 +msgid "Markdown" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:99 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:64 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:100 msgid "Do not insert Table of Contents into output text when using markdown" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:13 msgid "TXT Output" msgstr "" @@ -6011,6 +6054,10 @@ msgstr "" msgid "Do not remove image references before processing" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txtz_output.py:12 +msgid "TXTZ Output" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 @@ -6118,10 +6165,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:504 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:247 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:251 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:993 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:994 msgid "Undefined" msgstr "" @@ -6265,7 +6312,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:302 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "" @@ -6275,7 +6322,7 @@ msgid "Error communicating with device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:611 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1125 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1139 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:298 msgid "No suitable formats" msgstr "" @@ -6336,7 +6383,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:1001 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1133 msgid "Auto convert the following books before uploading to the device?" msgstr "" @@ -6344,29 +6391,29 @@ msgstr "" msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1032 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1100 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1126 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1140 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:1190 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1204 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1191 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1205 msgid "

    Cannot upload books to device there is no more free space available " msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:118 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:403 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:255 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:61 msgid "Invalid template" @@ -6374,7 +6421,7 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:404 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:256 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:62 msgid "The template %s is invalid:" @@ -6405,19 +6452,19 @@ msgstr "" msgid "Save &template:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:20 msgid "How many empty books?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:25 msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:33 msgid "Set the author of the new books to:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:45 msgid "Reset author to Unknown" msgstr "" @@ -6450,7 +6497,7 @@ msgid "My Books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:314 msgid "Generate catalog" msgstr "" @@ -6608,7 +6655,7 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_device_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1175 msgid "Format" msgstr "" @@ -6650,20 +6697,20 @@ msgstr "" msgid "The folder %s is not empty. Please choose an empty folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:87 msgid "No location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:87 msgid "No location selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:91 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:670 msgid "Bad location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:92 msgid "%s is not an existing folder" msgstr "" @@ -6732,7 +6779,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comments_dialog.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/template_dialog.py:31 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:226 msgid "&Cancel" msgstr "" @@ -6785,7 +6832,7 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:985 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 @@ -6960,7 +7007,7 @@ msgstr "" msgid "Show detailed information about this error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/message_box.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/message_box.py:93 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:525 msgid "Copied" msgstr "" @@ -7060,7 +7107,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:719 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:727 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:837 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:838 msgid "Search/replace invalid" msgstr "" @@ -7072,35 +7119,35 @@ msgstr "" msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:838 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:839 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:890 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:891 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:920 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:560 msgid "Delete saved search/replace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:921 msgid "The selected saved search/replace will be deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:937 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:945 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:946 msgid "Save search/replace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:939 msgid "Search/replace name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:946 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:947 msgid "That saved search/replace already exists and will be overwritten. Are you sure?" msgstr "" @@ -7126,7 +7173,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:503 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:424 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:785 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:786 msgid "&Rating:" msgstr "" @@ -7134,7 +7181,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:505 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:425 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:426 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:786 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:787 msgid "Rating of this book. 0-5 stars" msgstr "" @@ -7208,7 +7255,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:531 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:440 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:978 msgid "&Date:" msgstr "" @@ -7433,7 +7480,7 @@ msgid "&Search and replace" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:429 msgid "Last modified: %s" msgstr "" @@ -7455,22 +7502,22 @@ msgid "The cover in the %s format is invalid" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:746 msgid "Cover size: %dx%d pixels" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:670 msgid "Not a valid picture" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:214 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:696 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:697 msgid "Specify title and author" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:215 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:697 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:698 msgid "You must specify a title and author before generating a cover" msgstr "" @@ -7512,44 +7559,44 @@ msgid "The cover is not a valid picture" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:307 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:527 msgid "Choose formats for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:559 msgid "No permission" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:339 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:560 msgid "You do not have permission to read the following files:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:366 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:367 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:590 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:592 msgid "No format selected" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:603 msgid "Could not read metadata" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:603 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:604 msgid "Could not read metadata from %s format" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:453 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:229 msgid " The green color indicates that the current author sort matches the current author" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:456 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:232 msgid " The red color indicates that the current author sort does not match the current author. No action is required if this is what you want." msgstr "" @@ -7586,57 +7633,57 @@ msgstr "" msgid "Next" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:687 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:688 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:913 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:695 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:696 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:920 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:779 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:861 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:781 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:862 msgid "Tags changed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:780 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:862 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:782 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:863 msgid "You have changed the tags. In order to use the tags editor, you must either discard or apply these changes. Apply changes?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:815 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:817 msgid "Timed out" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:816 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:818 msgid "The download of social metadata timed out, the servers are probably busy. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:823 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:825 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:824 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:826 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:858 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:860 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:859 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:861 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:957 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:959 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:307 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:960 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:308 msgid "Could not open %s. Is it being used by another program?" msgstr "" @@ -7682,7 +7729,7 @@ msgid "Author S&ort: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:422 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:215 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles Dickens should be sorted as Dickens, Charles.\n" "If the box is colored green, then text matches the individual author's sort strings. If it is colored red, then the authors and this text do not match." @@ -7694,7 +7741,7 @@ msgid "Remove unused series (Series that have no books)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:439 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:886 msgid "IS&BN:" msgstr "" @@ -7703,7 +7750,7 @@ msgid "dd MMM yyyy" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:442 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1028 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1029 msgid "Publishe&d:" msgstr "" @@ -7713,7 +7760,7 @@ msgid "&Fetch metadata from server" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:448 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:620 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:621 msgid "&Browse" msgstr "" @@ -7722,7 +7769,7 @@ msgid "Remove border (if any) from cover" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:450 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:622 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:623 msgid "T&rim" msgstr "" @@ -7731,12 +7778,12 @@ msgid "Reset cover to default" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:452 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:624 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:625 msgid "&Remove" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:453 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:631 msgid "Download co&ver" msgstr "" @@ -7745,7 +7792,7 @@ msgid "Generate a default cover based on the title and author" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:455 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:632 msgid "&Generate cover" msgstr "" @@ -7762,7 +7809,7 @@ msgid "Remove the selected formats for this book from the database." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:461 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:446 msgid "Set the cover for the book from the selected format" msgstr "" @@ -8113,7 +8160,7 @@ msgid "&Author:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:826 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:827 msgid "Ta&gs:" msgstr "" @@ -8228,7 +8275,7 @@ msgid "Unapply (remove) tag from current tag category" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:70 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:109 msgid "Are your sure?" msgstr "" @@ -8272,37 +8319,37 @@ 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:20 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:21 msgid "%s (was %s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:883 msgid "Item is blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:884 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:97 msgid "No item selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:98 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:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:105 msgid "No items selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:106 msgid "You must select at least one items from the list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:110 msgid "Are you certain you want to delete the following items?" msgstr "" @@ -8566,7 +8613,7 @@ msgid "Attached, you will find the e-book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:247 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:184 msgid "by" msgstr "" @@ -8667,50 +8714,50 @@ msgstr "" msgid "Regular expression (?P)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105 msgid "Cover Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110 msgid "Shift+Alt+B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:124 msgid "Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126 msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:149 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:30 msgid "created by Kovid Goyal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:179 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:213 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:224 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:216 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:226 msgid "Shift+Alt+D" msgstr "" @@ -8798,7 +8845,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:901 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:906 msgid "Card A" msgstr "" @@ -8807,7 +8854,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:903 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:908 msgid "Card B" msgstr "" @@ -8823,36 +8870,32 @@ msgstr "" msgid "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:171 msgid "Shift+Ctrl+F" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:174 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:179 msgid "

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

    Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:185 msgid "&Go!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:191 msgid "Do Quick Search (you can also press the Enter key)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:197 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:198 -msgid "&Highlight" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:199 -msgid "When searching, highlight matched books, instead of restricting the book list to the matches.

    You can use the N or F3 keys to go to the next match." +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:203 +msgid "Change the way searching for books works" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:215 @@ -8867,11 +8910,11 @@ msgstr "" msgid "Delete current saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:355 msgid "Y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:390 msgid "Edit template" msgstr "" @@ -8885,38 +8928,38 @@ msgstr "" msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:387 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:738 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1287 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:736 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1295 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:589 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:744 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1289 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1297 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:974 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:982 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:978 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:986 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1187 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1195 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1267 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1275 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1270 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1278 msgid "Double click to edit me

    " msgstr "" @@ -9006,12 +9049,12 @@ msgid "LRF Viewer toolbar" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:539 msgid "Next Page" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:539 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:540 msgid "Previous Page" msgstr "" @@ -9174,39 +9217,39 @@ msgstr "" msgid "Title &sort:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:220 msgid "Author s&ort:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:348 msgid "&Number:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:716 msgid "Invalid cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:717 msgid "Could not change cover as the image is invalid." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:744 msgid "This book has no cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:793 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:794 msgid "stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:827 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:828 msgid "Tags categorize the book. This is particularly useful while searching.

    They can be any wordsor phrases, separated by commas." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:926 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:927 msgid "&Publisher:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:996 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:997 msgid "Clear date" msgstr "" @@ -9218,36 +9261,36 @@ msgstr "" msgid "No matches found for this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:191 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:187 msgid "Failed to download metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:227 msgid "cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:228 msgid "Downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:228 msgid "Failed to get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:232 msgid "%s %s for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:291 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:160 msgid "Done" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:292 msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:294 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:661 msgid "Details" msgstr "" @@ -9282,43 +9325,70 @@ msgstr "" msgid "Restore settings to default values. You have to click Apply to actually save the default settings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:61 -msgid "Here you can control how calibre will read metadata from the files you add to it. calibre can either read metadata from the contents of the file, or from the filename." +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding.py:28 +msgid "Ignore duplicate incoming formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:62 -msgid "Read &metadata from &file contents rather than file name" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding.py:29 +msgid "Overwrite existing duplicate formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:63 -msgid "Swap the firstname and lastname of the author. This affects only metadata read from file names." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:64 -msgid "&Swap author firstname and lastname" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding.py:30 +msgid "Create new record for each duplicate format" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:65 +msgid "Here you can control how calibre will read metadata from the files you add to it. calibre can either read metadata from the contents of the file, or from the filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:66 +msgid "Read &metadata from &file contents rather than file name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:67 +msgid "Swap the firstname and lastname of the author. This affects only metadata read from file names." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:68 +msgid "&Swap author firstname and lastname" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:69 msgid "" -"If an existing book with a similar title and author is found that does not have the format being added, the format is added\n" -"to the existing book, instead of creating a new entry. If the existing book already has the format, then it is silently ignored.\n" +"Automerge: If books with similar titles and authors found, merge the incoming formats automatically into\n" +"existing book records. The box to the right controls what happens when an existing record already has\n" +"the incoming format. Note that this option also affects the Copy to library action.\n" "\n" "Title match ignores leading indefinite articles (\"the\", \"a\", \"an\"), punctuation, case, etc. Author match is exact." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:69 -msgid "If books with similar titles and authors found, &merge the new files automatically" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:74 +msgid "&Automerge added books if they already exist in the calibre library:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:75 +msgid "" +"Automerge: If books with similar titles and authors found, merge the incoming formats automatically into\n" +"existing book records. This box controls what happens when an existing record already has\n" +"the incoming format: \n" +"\n" +"Ignore duplicate incoming files - means that existing files in your calibre library will not be replaced\n" +"Overwrite existing duplicate files - means that existing files in your calibre library will be replaced\n" +"Create new record for each duplicate file - means that a new book entry will be created for each duplicate file\n" +"\n" +"Title matching ignores leading indefinite articles (\"the\", \"a\", \"an\"), punctuation, case, etc.\n" +"Author matching is exact." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:85 msgid "&Tags to apply when adding a book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:86 msgid "A comma-separated list of tags that will be applied to books added to the library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:87 msgid "&Configure metadata from file name" msgstr "" @@ -9713,95 +9783,91 @@ msgstr "" msgid "Wide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:52 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 msgid "Always" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 msgid "Automatic" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:56 msgid "Never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:59 msgid "By first letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:59 msgid "Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:60 msgid "Partitioned" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:136 msgid "User Interface &layout (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:137 msgid "&Number of covers to show in browse mode (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:138 msgid "Choose &language (requires restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:139 msgid "Show &average ratings in the tags browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:140 msgid "Disable all animations. Useful if you have a slow/old computer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:141 msgid "Disable &animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:142 msgid "Enable system &tray icon (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:143 msgid "Show &splash screen at startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:144 msgid "Disable ¬ifications in system tray" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:145 msgid "Use &Roman numerals for series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:146 msgid "Show cover &browser in a separate window (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:151 -msgid "Search as you type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:147 msgid "Tags browser category partitioning method:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:148 msgid "" "Choose how tag browser subcategories are displayed when\n" "there are more items than the limit. Select by first\n" @@ -9810,69 +9876,70 @@ msgid "" "if you never want subcategories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:153 msgid "Collapse when more items than:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:154 msgid "" "If a Tag Browser category has more than this number of items, it is divided\n" "up into sub-categories. If the partition method is set to disable, this value is ignored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:156 msgid "&Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:157 msgid "&Icon size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:158 msgid "Show &text under icons:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:159 msgid "&Split the toolbar into two toolbars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:160 msgid "Interface font:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:161 msgid "Change &font (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:84 msgid "&Apply" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:230 msgid "Restore &defaults" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:231 msgid "Save changes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:232 msgid "Cancel and return to overview" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:288 msgid "Restoring to defaults not supported for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:323 msgid "Some of the changes you made require a restart. Please restart calibre as soon as possible." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:326 msgid "The changes you have made require calibre be restarted immediately. You will not be allowed set any more preferences, until you restart." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:331 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:120 msgid "Restart needed" msgstr "" @@ -9984,89 +10051,89 @@ msgstr "" msgid "Delete plugboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:177 msgid "%(plugin_type)s %(plugins)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:178 msgid "plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:187 msgid "" "\n" "Customization: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:216 msgid "Search for plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:224 msgid "No matches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:225 msgid "Could not find any matching plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:266 msgid "Add plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:274 msgid "Installing plugins is a security risk. Plugins can contain a virus/malware. Only install it if you got it from a trusted source. Are you sure you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:285 msgid "Plugin {0} successfully installed under {1} plugins. You may have to restart calibre for the plugin to take effect." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:293 msgid "No valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:294 msgid "%s is not a valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:303 msgid "Select an actual plugin under %s to customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:309 msgid "Plugin cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:310 msgid "The plugin: %s cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:320 msgid "Plugin not customizable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:321 msgid "Plugin: %s does not need customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:327 msgid "Must restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:328 msgid "You must restart calibre before you can configure the %s plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:335 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:333 msgid "Plugin {0} successfully removed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:341 msgid "Cannot remove builtin plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:342 msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." msgstr "" @@ -10158,6 +10225,34 @@ msgstr "" msgid "Save metadata in &OPF file" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/search_ui.py:60 +msgid "Search as you &type" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/search_ui.py:61 +msgid "&Highlight search results instead of restricting the book list to the results" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/search_ui.py:62 +msgid "What to search by default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/search_ui.py:63 +msgid "When you enter a search term without a prefix, by default calibre will search all metadata for matches. For example, entering, \"asimov\" will search not just authors but title/tags/series/comments/etc. Use these options if you would like to change this behavior." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/search_ui.py:64 +msgid "&Limit the searched metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/search_ui.py:65 +msgid "&Columns that non-prefixed searches are limited to:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/search_ui.py:66 +msgid "Note that this option affects all searches, including saved searches and restrictions. Therefore, if you use this option, it is best to ensure that you always use prefixes in your saved searches. For example, use \"series:Foundation\" rather than just \"Foundation\" in a saved search" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:70 msgid "Manual management" @@ -10473,46 +10568,79 @@ msgstr "" msgid "Remove selected actions from toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:112 +msgid "This tweak has it default value" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:114 +msgid "This tweak has been customized" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:231 +msgid "Add/edit tweaks for any custom plugins you have installed. Documentation for these tweaks should be available on the website from where you downloaded the plugins." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:309 +msgid "There was a syntax error in your tweak. Click the show details button for details." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:322 msgid "Invalid tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:323 msgid "The tweaks you entered are invalid, try resetting the tweaks to default and changing them one by one until you find the invalid setting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:50 -msgid "Values for the tweaks are shown below. Edit them to change the behavior of calibre. Your changes will only take effect after a restart of calibre." +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:76 +msgid "Values for the tweaks are shown below. Edit them to change the behavior of calibre. Your changes will only take effect after a restart of calibre." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:51 -msgid "All available tweaks" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:77 +msgid "Edit tweaks for any custom plugins you have installed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:52 -msgid "&Current tweaks" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:78 +msgid "&Plugin tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:80 +msgid "Edit tweak" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:81 +msgid "Restore this tweak to its default value" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:82 +msgid "Restore &default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:83 +msgid "Apply any changes you made to this tweak" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:270 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:616 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:277 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:314 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:357 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:424 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:430 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:426 msgid "Choose saved search or enter name for new saved search" msgstr "" @@ -10663,11 +10791,11 @@ msgstr "" msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1321 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1320 msgid "Find item in tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1324 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1323 msgid "" "Search for items. This is a \"contains\" search; items containing the\n" "text anywhere in the name will be found. You can limit the search\n" @@ -10677,77 +10805,77 @@ msgid "" "containing the text \"foo\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1333 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1332 msgid "ALT+f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1337 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1336 msgid "F&ind" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1338 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1337 msgid "Find the first/next matching item" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1345 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1344 msgid "Collapse all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1366 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1365 msgid "No More Matches.

    Click Find again to go to first match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1379 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1378 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1379 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1378 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1380 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1379 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1383 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1382 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1389 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1388 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1389 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1388 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1394 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1393 msgid "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1398 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1397 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1401 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1400 msgid "Add your own categories to the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:65 msgid "Convert book %(num)d of %(total)d (%(title)s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:204 -msgid "Could not convert some books" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:93 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:205 +msgid "Could not convert some books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:206 msgid "Could not convert %d of %d books, because no suitable source format was found." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:125 msgid "Queueing books for bulk conversion" msgstr "" @@ -10759,15 +10887,15 @@ msgstr "" msgid "Convert book %d of %d (%s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:254 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:327 msgid "Convert existing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:328 msgid "The following books have already been converted to %s format. Do you wish to reconvert them?" msgstr "" @@ -10795,38 +10923,38 @@ msgstr "" msgid "You have started calibre in debug mode. After you quit calibre, the debug log will be available in the file: %s

    The log will be displayed automatically." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:494 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:496 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:519 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:535 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:572 msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development. Your donation helps keep calibre development going." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:596 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:598 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:599 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:601 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:603 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:605 msgid "Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:671 msgid "will keep running in the system tray. To close it, choose Quit in the context menu of the system tray." msgstr "" @@ -11090,36 +11218,36 @@ msgstr "" msgid "You are in the middle of editing a keyboard shortcut first complete that, by clicking outside the shortcut editing box." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:514 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:515 msgid "&Lookup in dictionary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:518 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:139 msgid "Go to..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:530 msgid "Next Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:531 msgid "Previous Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:533 msgid "Document Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:534 msgid "Document End" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:535 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:536 msgid "Section Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:537 msgid "Section End" msgstr "" @@ -11621,50 +11749,50 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:306 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:311 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:309 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:314 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:312 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:317 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:315 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:316 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:320 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:321 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:528 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:538 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:548 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 msgid "unchecked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:528 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:538 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:548 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:558 #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:185 msgid "no" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:531 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:541 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 msgid "checked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:531 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:541 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:551 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:185 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:535 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:555 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:535 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:555 msgid "empty" msgstr "" @@ -11905,7 +12033,7 @@ msgstr "" msgid "No books available to include in catalog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:5024 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:5017 msgid "" "\n" "*** Adding 'By Authors' Section required for MOBI output ***" @@ -12404,11 +12532,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/custom_columns.py:584 +#: /home/kovid/work/calibre/src/calibre/library/custom_columns.py:586 msgid "No label was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/custom_columns.py:586 +#: /home/kovid/work/calibre/src/calibre/library/custom_columns.py:588 msgid "The label must contain only lower case letters, digits and underscores, and start with a letter" msgstr "" @@ -12416,19 +12544,19 @@ msgstr "" msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:899 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:904 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2699 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2704 msgid "

    Migrating old database to ebook library in %s

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2728 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2733 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2745 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2750 msgid "Compacting database" msgstr "" @@ -12842,6 +12970,14 @@ msgstr "" msgid "How and when calibre updates metadata on the device." msgstr "" +#: /home/kovid/work/calibre/src/calibre/utils/config.py:732 +msgid "When searching for text without using lookup prefixes, as for example, Red instead of title:Red, limit the columns searched to those named below." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/config.py:737 +msgid "Choose columns to be searched when not using prefixes, as for example, when searching for Redd instead of title:Red. Enter a list of search/lookup names separated by commas. Only takes effect if you set the option to limit search columns above." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/utils/formatter.py:27 msgid "failed to scan program. Invalid input {0}" msgstr "" @@ -13075,90 +13211,98 @@ msgid "English (Cyprus)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:107 -msgid "English (Pakistan)" +msgid "English (Czechoslovakia)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:108 -msgid "English (Croatia)" +msgid "English (Pakistan)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:109 -msgid "English (Israel)" +msgid "English (Croatia)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:110 -msgid "English (Singapore)" +msgid "English (Indonesia)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 -msgid "English (Yemen)" +msgid "English (Israel)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:112 -msgid "English (Ireland)" +msgid "English (Singapore)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:113 -msgid "English (China)" +msgid "English (Yemen)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:114 -msgid "Spanish (Paraguay)" +msgid "English (Ireland)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:115 -msgid "Spanish (Uruguay)" +msgid "English (China)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:116 -msgid "Spanish (Argentina)" +msgid "Spanish (Paraguay)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:117 -msgid "Spanish (Mexico)" +msgid "Spanish (Uruguay)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:118 -msgid "Spanish (Cuba)" +msgid "Spanish (Argentina)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:119 -msgid "Spanish (Chile)" +msgid "Spanish (Mexico)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:120 -msgid "Spanish (Ecuador)" +msgid "Spanish (Cuba)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:121 -msgid "Spanish (Honduras)" +msgid "Spanish (Chile)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:122 -msgid "Spanish (Venezuela)" +msgid "Spanish (Ecuador)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:123 -msgid "Spanish (Bolivia)" +msgid "Spanish (Honduras)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:124 -msgid "Spanish (Nicaragua)" +msgid "Spanish (Venezuela)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:125 -msgid "German (AT)" +msgid "Spanish (Bolivia)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:126 -msgid "French (BE)" +msgid "Spanish (Nicaragua)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:127 -msgid "Dutch (NL)" +msgid "German (AT)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:128 +msgid "French (BE)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:129 +msgid "Dutch (NL)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:130 msgid "Dutch (BE)" msgstr "" From 40345e062836cc94b8d1a77f7b0598fb772bc792 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 10 Feb 2011 14:20:07 -0700 Subject: [PATCH 30/30] Interoperability Happes by DM. Fixes #8909 (New recipe for Ted Neward's technology blog) --- resources/recipes/tedneward.recipe | 33 ++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 resources/recipes/tedneward.recipe diff --git a/resources/recipes/tedneward.recipe b/resources/recipes/tedneward.recipe new file mode 100644 index 0000000000..d4466f815e --- /dev/null +++ b/resources/recipes/tedneward.recipe @@ -0,0 +1,33 @@ + +__license__ = 'GPL v3' +__copyright__ = '2011, Darko Miletic ' +''' +blogs.tedneward.com +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class InteroperabilityHappens(BasicNewsRecipe): + title = 'Interoperability Happens' + __author__ = 'Darko Miletic' + description = 'Tech blog by Ted Neward' + oldest_article = 15 + max_articles_per_feed = 100 + language = 'en' + encoding = 'utf-8' + no_stylesheets = True + use_embedded_content = True + publication_type = 'blog' + extra_css = """ + body{font-family: Verdana,Arial,Helvetica,sans-serif} + """ + + conversion_options = { + 'comment' : description + , 'tags' : 'blog, technology, microsoft, programming, C#, Java' + , 'publisher': 'Ted Neward' + , 'language' : language + } + + feeds = [(u'Posts', u'http://blogs.tedneward.com/SyndicationService.asmx/GetRss')] +