diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 81088da520..01a6e8bd75 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 @@ -74,24 +77,25 @@ 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}' +#: 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 = '' - +#: 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. 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/resources/images/news/njuz_net.png b/resources/images/news/njuz_net.png new file mode 100644 index 0000000000..86f2f77e17 Binary files /dev/null and b/resources/images/news/njuz_net.png differ 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 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 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/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 + 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/" 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')] + 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'

  • I', r0[4:8])[0] - + pages = self.get_pages(text_length) apnx = self.generate_apnx(pages) - + with open(apnx_path, 'wb') as apnxf: apnxf.write(apnx) - + def generate_apnx(self, pages): apnx = '' - + content_vals = { 'guid': str(uuid.uuid4()).replace('-', '')[:8], - 'isbn': '', + 'isbn': '', } - + content_header = '{"contentGuid":"%(guid)s","asin":"%(isbn)s","cdeType":"EBOK","fileRevisionId":"1"}' % content_vals - page_header = '{"asin":"%(isbn)s","pageMap":"(1,a,1)"}' % content_vals - + page_header = '{"asin":"%(isbn)s","pageMap":"(1,a,1)"}' % content_vals + apnx += struct.pack('>I', 65537) apnx += struct.pack('>I', 12 + len(content_header)) apnx += struct.pack('>I', len(content_header)) @@ -50,7 +50,7 @@ class APNXBuilder(object): apnx += struct.pack('>H', len(pages)) apnx += struct.pack('>H', 32) apnx += page_header - + # write page values to apnx for page in pages: apnx += struct.pack('>L', page) @@ -60,7 +60,7 @@ class APNXBuilder(object): def get_pages(self, text_length): pages = [] count = 0 - + while count < text_length: pages.append(count) count += 1024 diff --git a/src/calibre/devices/kindle/bookmark.py b/src/calibre/devices/kindle/bookmark.py index a895d3263e..aed498a093 100644 --- a/src/calibre/devices/kindle/bookmark.py +++ b/src/calibre/devices/kindle/bookmark.py @@ -3,6 +3,7 @@ __license__ = 'GPL v3' __docformat__ = 'restructuredtext en' +import os from cStringIO import StringIO from struct import unpack diff --git a/src/calibre/devices/kindle/driver.py b/src/calibre/devices/kindle/driver.py index 615d786adc..5c150eab5a 100644 --- a/src/calibre/devices/kindle/driver.py +++ b/src/calibre/devices/kindle/driver.py @@ -13,7 +13,6 @@ import datetime, os, re, sys, json, hashlib from calibre.devices.kindle.apnx import APNXBuilder from calibre.devices.kindle.bookmark import Bookmark from calibre.devices.usbms.driver import USBMS -from calibre.ebooks.oeb.base import OPF ''' Notes on collections: @@ -173,7 +172,7 @@ class KINDLE2(KINDLE): FORMATS = KINDLE.FORMATS + ['pdf'] DELETE_EXTS = KINDLE.DELETE_EXTS + ['.apnx'] - + PRODUCT_ID = [0x0002, 0x0004] BCD = [0x0100] @@ -208,7 +207,7 @@ class KINDLE2(KINDLE): h = hashlib.sha1(path).hexdigest() if h in path_map: book.device_collections = list(sorted(path_map[h])) - + def upload_cover(self, path, filename, metadata, filepath): ''' Hijacking this function to write the apnx file. @@ -221,8 +220,10 @@ class KINDLE2(KINDLE): try: apnx_builder.write_apnx(filepath, apnx_path) except: - pass - + print 'Failed to generate APNX' + import traceback + traceback.print_exc() + class KINDLE_DX(KINDLE2): 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' + diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py index e58bbca1bd..95f832c76a 100644 --- a/src/calibre/ebooks/conversion/utils.py +++ b/src/calibre/ebooks/conversion/utils.py @@ -342,11 +342,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 @@ -356,6 +354,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/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
    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,
    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/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)
    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:
    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/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
    diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py
    index 8efa7f154c..3540575f81 100644
    --- a/src/calibre/gui2/device.py
    +++ b/src/calibre/gui2/device.py
    @@ -1026,6 +1026,20 @@ 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:
    +                        import traceback
    +                        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
    +                    # 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,
                             memory=[files, remove])
    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)
     
    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/gui2/preferences/tweaks.py b/src/calibre/gui2/preferences/tweaks.py
    index 2bd765986d..10056ccb7b 100644
    --- a/src/calibre/gui2/preferences/tweaks.py
    +++ b/src/calibre/gui2/preferences/tweaks.py
    @@ -5,37 +5,316 @@ __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.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,
    +                Qt.Horizontal, self)
    +        self.bb.accepted.connect(self.accept)
    +        self.bb.rejected.connect(self.reject)
    +        self.l.addWidget(self.bb)
    +        self.resize(550, 300)
    +
    +# }}}
     
     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 +333,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..139f9563ad 100644
    --- a/src/calibre/gui2/preferences/tweaks.ui
    +++ b/src/calibre/gui2/preferences/tweaks.ui
    @@ -7,31 +7,73 @@
         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
    +       
    +       
    +        true
    +       
    +      
    +     
    +     
    +      
    +       
    +        Edit tweaks for any custom plugins you have installed
    +       
    +       
    +        &Plugin tweaks
    +       
    +      
    +     
    +    
        
    -   
    -    
    +   
    +    
          
    -      All available tweaks
    +      Help
          
    -     
    -      
    -       
    +     
    +      
    +       
    +        
    +         QPlainTextEdit::NoWrap
    +        
             
              true
             
    @@ -40,14 +82,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
    +        
    +       
           
          
         
    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):
    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)
    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))
    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
    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.
     
    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 "" 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)'),