diff --git a/Changelog.yaml b/Changelog.yaml
index 8ec96fc055..9673832a81 100644
--- a/Changelog.yaml
+++ b/Changelog.yaml
@@ -4,6 +4,38 @@
# for important features/bug fixes.
# Also, each release can have new and improved recipes.
+- version: 0.7.1
+ date: 2010-06-04
+
+ new features:
+ - title: "Content server: Add option to control category groupiong in OPDS feeds"
+
+ - title: "Make the book details pane occupy the full lower part of the window"
+
+ - title: "Add true and false searches for date based columns"
+ tickets: [5717]
+
+ bug fixes:
+ - title: "iPad driver: Various bug fixes."
+
+ - title: "SONY driver: Fix Launcher partition being detected as storage card in linux"
+
+ - title: "Fix news downloading breaking on windows systems with local encoding other than UTF-8."
+
+ - title: "SONY driver: Fix problem caused by null titles"
+
+ - title: "Make the new splash screen not always stay on top"
+ tickets: [5700]
+
+ - title: "When setting an image with transparent pixels as the book cover, overlay it on a white background first. Fixes transparent covers getting random backgrounds."
+
+ - title: "Content server: Fix stanza integration when entering the server URL my hand"
+
+ improved recipes:
+ - Gizmodo
+ - Vreme
+
+
- version: 0.7.0
date: 2010-06-04
diff --git a/resources/images/news/haaretz_en.png b/resources/images/news/haaretz_en.png
new file mode 100644
index 0000000000..56b41baf99
Binary files /dev/null and b/resources/images/news/haaretz_en.png differ
diff --git a/resources/images/news/ourdailybread.png b/resources/images/news/ourdailybread.png
new file mode 100644
index 0000000000..771f252216
Binary files /dev/null and b/resources/images/news/ourdailybread.png differ
diff --git a/resources/recipes/cbc_canada.recipe b/resources/recipes/cbc_canada.recipe
new file mode 100644
index 0000000000..26ea6abd29
--- /dev/null
+++ b/resources/recipes/cbc_canada.recipe
@@ -0,0 +1,25 @@
+from calibre.web.feeds.news import BasicNewsRecipe
+
+class AdvancedUserRecipe1275798572(BasicNewsRecipe):
+ title = u'CBC Canada'
+ publisher = 'www.cbc.ca'
+ language = 'en_CA'
+ __author__ = 'rty'
+ category = 'news'
+ oldest_article = 4
+ max_articles_per_feed = 100
+ remove_javascript = True
+ use_embedded_content = False
+ no_stylesheets = True
+ language = 'en'
+ masthead_url = 'http://www.cbc.ca/includes/gfx/cbcnews_logo_09.gif'
+ cover_url = 'http://img692.imageshack.us/img692/2814/cbc.png'
+ keep_only_tags = [dict(name='div', attrs={'id':['storyhead','storybody']})]
+ remove_tags_after = dict(id=['socialtools'])
+ feeds = [(u'Top Stories', u'http://rss.cbc.ca/lineup/topstories.xml'),
+ (u'World', u'http://rss.cbc.ca/lineup/world.xml'),
+ (u'National', u'http://rss.cbc.ca/lineup/canada.xml'),
+ (u'Manitoba', u'http://rss.cbc.ca/lineup/canada-manitoba.xml'),
+ (u'Politics', u'http://rss.cbc.ca/lineup/politics.xml'),
+ (u'Tech & Science', u'http://rss.cbc.ca/lineup/technology.xml'),
+ (u'Books', u'http://rss.cbc.ca/lineup/arts-books.xml')]
diff --git a/resources/recipes/gizmodo.recipe b/resources/recipes/gizmodo.recipe
index 6f6e6ae0cf..4233ef66b7 100644
--- a/resources/recipes/gizmodo.recipe
+++ b/resources/recipes/gizmodo.recipe
@@ -17,7 +17,7 @@ class Gizmodo(BasicNewsRecipe):
max_articles_per_feed = 100
no_stylesheets = True
encoding = 'utf-8'
- use_embedded_content = True
+ use_embedded_content = False
language = 'en'
masthead_url = 'http://cache.gawkerassets.com/assets/gizmodo.com/img/logo.png'
extra_css = ' body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif} img{margin-bottom: 1em} '
@@ -29,9 +29,11 @@ class Gizmodo(BasicNewsRecipe):
, 'language' : language
}
- remove_attributes = ['width','height']
- remove_tags = [dict(name='div',attrs={'class':'feedflare'})]
- remove_tags_after = dict(name='div',attrs={'class':'feedflare'})
+ remove_attributes = ['width','height']
+ keep_only_tags = [dict(attrs={'class':'content permalink'})]
+ remove_tags_before = dict(name='h1')
+ remove_tags = [dict(attrs={'class':'contactinfo'})]
+ remove_tags_after = dict(attrs={'class':'contactinfo'})
feeds = [(u'Articles', u'http://feeds.gawker.com/gizmodo/full')]
diff --git a/resources/recipes/haaretz_en.recipe b/resources/recipes/haaretz_en.recipe
new file mode 100644
index 0000000000..4df6b45a3e
--- /dev/null
+++ b/resources/recipes/haaretz_en.recipe
@@ -0,0 +1,57 @@
+__license__ = 'GPL v3'
+__copyright__ = '2010, Darko Miletic '
+'''
+haaretz.com
+'''
+
+from calibre.web.feeds.news import BasicNewsRecipe
+
+class Haaretz_en(BasicNewsRecipe):
+ title = 'Haaretz in English'
+ __author__ = 'Darko Miletic'
+ description = 'Haaretz.com, the online edition of Haaretz Newspaper in Israel, and analysis from Israel and the Middle East. Haaretz.com provides extensive and in-depth coverage of Israel, the Jewish World and the Middle East, including defense, diplomacy, the Arab-Israeli conflict, the peace process, Israeli politics, Jerusalem affairs, international relations, Iran, Iraq, Syria, Lebanon, the Palestinian Authority, the West Bank and the Gaza Strip, the Israeli business world and Jewish life in Israel and the Diaspora. '
+ publisher = 'haaretz.com'
+ category = 'news, politics, Israel'
+ oldest_article = 2
+ max_articles_per_feed = 200
+ no_stylesheets = True
+ encoding = 'cp1252'
+ use_embedded_content = False
+ language = 'en_IL'
+ publication_type = 'newspaper'
+ remove_empty_feeds = True
+ masthead_url = 'http://www.haaretz.com/images/logos/logoGrey.gif'
+ extra_css = ' body{font-family: Verdana,Arial,Helvetica,sans-serif } '
+
+ conversion_options = {
+ 'comment' : description
+ , 'tags' : category
+ , 'publisher' : publisher
+ , 'language' : language
+ }
+
+ remove_tags = [dict(name='div', attrs={'class':['rightcol']}),dict(name='table')]
+ remove_tags_before = dict(name='h1')
+ remove_tags_after = dict(attrs={'id':'innerArticle'})
+ keep_only_tags = [dict(attrs={'id':'content'})]
+
+
+ feeds = [
+ (u'Opinion' , u'http://www.haaretz.com/cmlink/opinion-rss-1.209234?localLinksEnabled=false' )
+ ,(u'Defense and diplomacy' , u'http://www.haaretz.com/cmlink/defense-and-diplomacy-rss-1.208894?localLinksEnabled=false')
+ ,(u'National' , u'http://www.haaretz.com/cmlink/national-rss-1.208896?localLinksEnabled=false' )
+ ,(u'International' , u'http://www.haaretz.com/cmlink/international-rss-1.208898?localLinksEnabled=false' )
+ ,(u'Jewish World' , u'http://www.haaretz.com/cmlink/jewish-world-rss-1.209085?localLinksEnabled=false' )
+ ,(u'Business' , u'http://www.haaretz.com/cmlink/business-print-rss-1.264904?localLinksEnabled=false' )
+ ,(u'Real Estate' , u'http://www.haaretz.com/cmlink/real-estate-print-rss-1.264977?localLinksEnabled=false' )
+ ,(u'Features' , u'http://www.haaretz.com/cmlink/features-print-rss-1.264912?localLinksEnabled=false' )
+ ,(u'Arts and leisure' , u'http://www.haaretz.com/cmlink/arts-and-leisure-rss-1.286090?localLinksEnabled=false' )
+ ,(u'Books' , u'http://www.haaretz.com/cmlink/books-rss-1.264947?localLinksEnabled=false' )
+ ,(u'Food and Wine' , u'http://www.haaretz.com/cmlink/food-and-wine-print-rss-1.265034?localLinksEnabled=false' )
+ ,(u'Sports' , u'http://www.haaretz.com/cmlink/sports-rss-1.286092?localLinksEnabled=false' )
+ ]
+
+ def preprocess_html(self, soup):
+ for item in soup.findAll(style=True):
+ del item['style']
+ return soup
diff --git a/resources/recipes/nytimes.recipe b/resources/recipes/nytimes.recipe
index eba717027e..ec546569e5 100644
--- a/resources/recipes/nytimes.recipe
+++ b/resources/recipes/nytimes.recipe
@@ -16,7 +16,7 @@ class NYTimes(BasicNewsRecipe):
title = 'New York Times Top Stories'
__author__ = 'GRiker'
- language = _('English')
+ language = 'en'
description = 'Top Stories from the New York Times'
# List of sections typically included in Top Stories. Use a keyword from the
diff --git a/resources/recipes/ourdailybread.recipe b/resources/recipes/ourdailybread.recipe
index 0b37880377..e0d38db821 100644
--- a/resources/recipes/ourdailybread.recipe
+++ b/resources/recipes/ourdailybread.recipe
@@ -1,9 +1,7 @@
-#!/usr/bin/env python
-
__license__ = 'GPL v3'
-__copyright__ = '2009, Darko Miletic '
+__copyright__ = '2009-2010, Darko Miletic '
'''
-rbc.org
+odb.org
'''
from calibre.web.feeds.news import BasicNewsRecipe
@@ -11,27 +9,29 @@ from calibre.web.feeds.news import BasicNewsRecipe
class OurDailyBread(BasicNewsRecipe):
title = 'Our Daily Bread'
__author__ = 'Darko Miletic and Sujata Raman'
- description = 'Religion'
+ description = "Our Daily Bread is a daily devotional from RBC Ministries which helps readers spend time each day in God's Word."
oldest_article = 15
- language = 'en'
- lang = 'en'
-
+ language = 'en'
max_articles_per_feed = 100
no_stylesheets = True
use_embedded_content = False
- category = 'religion'
+ category = 'ODB, Daily Devotional, Bible, Christian Devotional, Devotional, RBC Ministries, Our Daily Bread, Devotionals, Daily Devotionals, Christian Devotionals, Faith, Bible Study, Bible Studies, Scripture, RBC, religion'
encoding = 'utf-8'
-
+
conversion_options = {
- 'comments' : description
- ,'tags' : category
- ,'language' : 'en'
+ 'comments' : description
+ ,'tags' : category
+ ,'language' : language
+ ,'linearize_tables' : True
}
- keep_only_tags = [dict(name='div', attrs={'class':['altbg','text']})]
+ keep_only_tags = [dict(attrs={'class':'module-content'})]
+ remove_tags = [
+ dict(attrs={'id':'article-zoom'})
+ ,dict(attrs={'class':'listen-now-box'})
+ ]
+ remove_tags_after = dict(attrs={'class':'readable-area'})
- remove_tags = [dict(name='div', attrs={'id':['ctl00_cphPrimary_pnlBookCover']}),
- ]
extra_css = '''
.text{font-family:Arial,Helvetica,sans-serif;font-size:x-small;}
.devotionalTitle{font-family:Arial,Helvetica,sans-serif; font-size:large; font-weight: bold;}
@@ -40,14 +40,9 @@ class OurDailyBread(BasicNewsRecipe):
a{color:#000000;font-family:Arial,Helvetica,sans-serif; font-size:x-small;}
'''
- feeds = [(u'Our Daily Bread', u'http://www.rbc.org/rss.ashx?id=50398')]
+ feeds = [(u'Our Daily Bread', u'http://odb.org/feed/')]
def preprocess_html(self, soup):
- soup.html['xml:lang'] = self.lang
- soup.html['lang'] = self.lang
- mtag = ''
- soup.head.insert(0,mtag)
-
return self.adeify_images(soup)
def get_cover_url(self):
@@ -61,3 +56,4 @@ class OurDailyBread(BasicNewsRecipe):
cover_url = a.img['src']
return cover_url
+
diff --git a/resources/recipes/sueddeutsche.recipe b/resources/recipes/sueddeutsche.recipe
index 8f4d7e5892..9a5b00fc6c 100644
--- a/resources/recipes/sueddeutsche.recipe
+++ b/resources/recipes/sueddeutsche.recipe
@@ -19,10 +19,10 @@ class Sueddeutsche(BasicNewsRecipe):
no_stylesheets = True
language = 'de'
- encoding = 'iso-8859-15'
+ encoding = 'utf-8'
remove_javascript = True
-
+
remove_tags = [ dict(name='link'), dict(name='iframe'),
dict(name='div', attrs={'id':["bookmarking","themenbox","artikelfoot","CAD_AD",
"SKY_AD","NT1_AD","navbar1","sdesiteheader"]}),
diff --git a/resources/recipes/vreme.recipe b/resources/recipes/vreme.recipe
index a54353b78c..197c20f108 100644
--- a/resources/recipes/vreme.recipe
+++ b/resources/recipes/vreme.recipe
@@ -52,10 +52,12 @@ class Vreme(BasicNewsRecipe):
def parse_index(self):
articles = []
soup = self.index_to_soup(self.INDEX)
-
+ cover_item = soup.find('div',attrs={'id':'najava'})
+ if cover_item:
+ self.cover_url = self.INDEX + cover_item.img['src']
for item in soup.findAll(['h3','h4']):
- description = ''
- title_prefix = ''
+ description = u''
+ title_prefix = u''
feed_link = item.find('a')
if feed_link and feed_link.has_key('href') and feed_link['href'].startswith('/cms/view.php'):
url = self.INDEX + feed_link['href']
@@ -67,7 +69,7 @@ class Vreme(BasicNewsRecipe):
,'url' :url
,'description':description
})
- return [(soup.head.title.string, articles)]
+ return [('Nedeljnik Vreme', articles)]
remove_tags = [
dict(name=['object','link'])
@@ -76,11 +78,3 @@ class Vreme(BasicNewsRecipe):
def print_version(self, url):
return url + '&print=yes'
-
- def get_cover_url(self):
- cover_url = None
- soup = self.index_to_soup(self.INDEX)
- cover_item = soup.find('div',attrs={'id':'najava'})
- if cover_item:
- cover_url = self.INDEX + cover_item.img['src']
- return cover_url
diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py
index 65618aaff4..0687afd5b2 100644
--- a/src/calibre/__init__.py
+++ b/src/calibre/__init__.py
@@ -41,6 +41,8 @@ mimetypes.add_type('application/vnd.palm', '.pdb')
mimetypes.add_type('application/x-mobipocket-ebook', '.mobi')
mimetypes.add_type('application/x-mobipocket-ebook', '.prc')
mimetypes.add_type('application/x-mobipocket-ebook', '.azw')
+mimetypes.add_type('application/x-cbz', '.cbz')
+mimetypes.add_type('application/x-cbr', '.cbr')
mimetypes.add_type('application/x-koboreader-ebook', '.kobo')
mimetypes.add_type('image/wmf', '.wmf')
guess_type = mimetypes.guess_type
diff --git a/src/calibre/constants.py b/src/calibre/constants.py
index e4a1c521c2..69bad99723 100644
--- a/src/calibre/constants.py
+++ b/src/calibre/constants.py
@@ -2,7 +2,7 @@ __license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'
__appname__ = 'calibre'
-__version__ = '0.7.0'
+__version__ = '0.7.1'
__author__ = "Kovid Goyal "
import re
diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py
index dddd60cadf..13be5952a9 100644
--- a/src/calibre/devices/apple/driver.py
+++ b/src/calibre/devices/apple/driver.py
@@ -5,15 +5,15 @@ __copyright__ = '2010, Gregory Riker'
__docformat__ = 'restructuredtext en'
-import cStringIO, os, re, shutil, sys, tempfile, time, zipfile
+import cStringIO, os, re, shutil, subprocess, sys, tempfile, time, zipfile
from calibre.constants import DEBUG
from calibre import fit_image
from calibre.constants import isosx, iswindows
from calibre.devices.interface import DevicePlugin
+from calibre.ebooks.BeautifulSoup import BeautifulSoup
from calibre.ebooks.metadata import MetaInformation
from calibre.library.server.utils import strftime
-from calibre.ptempfile import PersistentTemporaryFile
from calibre.utils.config import Config, config_dir
from calibre.utils.date import parse_date
from calibre.utils.logging import Log
@@ -22,10 +22,46 @@ from calibre.devices.errors import UserFeedback
from PIL import Image as PILImage
if isosx:
- import appscript
+ try:
+ import appscript
+ appscript
+ except:
+ # appscript fails to load on 10.4
+ appscript = None
if iswindows:
import pythoncom, win32com.client
+
+class ITUNES(DevicePlugin):
+ '''
+ try:
+ pythoncom.CoInitialize()
+ finally:
+ pythoncom.CoUninitialize()
+ '''
+
+ name = 'Apple device interface'
+ gui_name = 'Apple device'
+ icon = I('devices/ipad.png')
+ description = _('Communicate with iBooks through iTunes.')
+ supported_platforms = ['osx','windows']
+ author = 'GRiker'
+ #: The version of this plugin as a 3-tuple (major, minor, revision)
+ version = (0, 4, 0)
+
+ OPEN_FEEDBACK_MESSAGE = _(
+ 'Apple device detected, launching iTunes, please wait ...')
+
+ FORMATS = ['epub']
+
+ # Product IDs:
+ # 0x1292:iPhone 3G
+ # 0x129a:iPad
+ VENDOR_ID = [0x05ac]
+ PRODUCT_ID = [0x129a]
+ BCD = [0x01]
+
+ # iTunes enumerations
Sources = [
'Unknown',
'Library',
@@ -43,40 +79,34 @@ if iswindows:
'BMP'
]
-class ITUNES(DevicePlugin):
- '''
- try:
- pythoncom.CoInitialize()
- finally:
- pythoncom.CoUninitialize()
- '''
+ PlaylistKind = [
+ 'Unknown',
+ 'Library',
+ 'User',
+ 'CD',
+ 'Device',
+ 'Radio Tuner'
+ ]
- name = 'Apple device interface'
- gui_name = 'Apple device'
- icon = I('devices/ipad.png')
- description = _('Communicate with iBooks through iTunes.')
- supported_platforms = ['osx','windows']
- author = 'GRiker'
- #: The version of this plugin as a 3-tuple (major, minor, revision)
- version = (1, 0, 0)
-
- OPEN_FEEDBACK_MESSAGE = _(
- 'Apple device detected, launching iTunes, please wait ...')
-
- FORMATS = ['epub']
-
- # Product IDs:
- # 0x1292:iPhone 3G
- # 0x129a:iPad
- VENDOR_ID = [0x05ac]
- PRODUCT_ID = [0x129a]
- BCD = [0x01]
+ PlaylistSpecialKind = [
+ 'Unknown',
+ 'Purchased Music',
+ 'Party Shuffle',
+ 'Podcasts',
+ 'Folder',
+ 'Video',
+ 'Music',
+ 'Movies',
+ 'TV Shows',
+ 'Books',
+ ]
# Properties
cached_books = {}
cache_dir = os.path.join(config_dir, 'caches', 'itunes')
ejected = False
iTunes= None
+ iTunes_media = None
log = Log()
path_template = 'iTunes/%s - %s.epub'
problem_titles = []
@@ -109,12 +139,12 @@ class ITUNES(DevicePlugin):
self.log.info( "ITUNES.add_books_to_metadata()")
self._dump_update_list('add_books_to_metadata()')
for (j,p_book) in enumerate(self.update_list):
- self.log.info("ITUNES.add_books_to_metadata(): looking for %s" %
+ self.log.info("ITUNES.add_books_to_metadata():\n looking for %s" %
str(p_book['lib_book'])[-9:])
for i,bl_book in enumerate(booklists[0]):
if bl_book.library_id == p_book['lib_book']:
booklists[0].pop(i)
- self.log.info("ITUNES.add_books_to_metadata(): removing %s %s" %
+ self.log.info("ITUNES.add_books_to_metadata():\n removing %s %s" %
(p_book['title'], str(p_book['lib_book'])[-9:]))
break
else:
@@ -151,8 +181,9 @@ class ITUNES(DevicePlugin):
self.log.info(" adding '%s' by '%s' to booklists[0]" %
(new_book.title, new_book.author))
booklists[0].append(new_book)
- if DEBUG:
- self._dump_booklist(booklists[0],'after add_books_to_metadata()')
+
+# if DEBUG:
+# self._dump_booklist(booklists[0],'after add_books_to_metadata()')
def books(self, oncard=None, end_session=True):
"""
@@ -268,6 +299,8 @@ class ITUNES(DevicePlugin):
instantiate iTunes if necessary
This gets called ~1x/second while device fingerprint is sensed
'''
+ if appscript is None:
+ return False
if self.iTunes:
# Check for connected book-capable device
@@ -452,12 +485,14 @@ class ITUNES(DevicePlugin):
if isosx:
self.iTunes.eject(self.sources['iPod'])
elif iswindows:
- try:
- pythoncom.CoInitialize()
- self.iTunes = win32com.client.Dispatch("iTunes.Application")
- self.iTunes.sources.ItemByName(self.sources['iPod']).EjectIPod()
- finally:
- pythoncom.CoUninitialize()
+ if 'iPod' in self.sources:
+ try:
+ pythoncom.CoInitialize()
+ self.iTunes = win32com.client.Dispatch("iTunes.Application")
+ self.iTunes.sources.ItemByName(self.sources['iPod']).EjectIPod()
+
+ finally:
+ pythoncom.CoUninitialize()
self.iTunes = None
self.sources = None
@@ -562,7 +597,7 @@ class ITUNES(DevicePlugin):
L{books}(oncard='cardb')).
'''
if DEBUG:
- self.log.info("ITUNES.remove_books_from_metadata():")
+ self.log.info("ITUNES.remove_books_from_metadata()")
for path in paths:
if self.cached_books[path]['lib_book']:
# Remove from the booklist
@@ -572,15 +607,15 @@ class ITUNES(DevicePlugin):
booklists[0].pop(i)
break
else:
- self.log.error("ITUNES.remove_books_from_metadata(): '%s' not found in self.cached_book" % path)
+ self.log.error(" '%s' not found in self.cached_book" % path)
# Remove from cached_books
self.cached_books.pop(path)
if DEBUG:
- self.log.info("ITUNES.remove_books_from_metadata(): Removing '%s' from self.cached_books" % path)
- self._dump_cached_books('remove_books_from_metadata()')
+ self.log.info(" Removing '%s' from self.cached_books" % path)
+# self._dump_cached_books('remove_books_from_metadata()')
else:
- self.log.warning("ITUNES.remove_books_from_metadata(): skipping purchased book, can't remove via automation interface")
+ self.log.warning(" skipping purchased book, can't remove via automation interface")
def reset(self, key='-1', log_packets=False, report_progress=None,
detected_device=None) :
@@ -624,54 +659,13 @@ class ITUNES(DevicePlugin):
L{books}(oncard='cardb')).
'''
if DEBUG:
- self.log.info("ITUNES:sync_booklists():")
+ self.log.info("ITUNES:sync_booklists()")
if self.update_needed:
if DEBUG:
self.log.info(' calling _update_device')
- self._update_device(msg=self.update_msg)
- self.update_needed = False
-
- # Get actual size of updated books on device
- if self.update_list:
- if DEBUG:
- self._dump_update_list(header='sync_booklists()')
- if isosx:
- for updated_book in self.update_list:
- size_on_device = self._get_device_book_size(updated_book['title'],
- updated_book['author'][0])
- if size_on_device:
- for book in booklists[0]:
- if book.title == updated_book['title'] and \
- book.author == updated_book['author']:
- break
- else:
- self.log.error("ITUNES:sync_booklists(): could not update book size for '%s'" % updated_book['title'])
-
- else:
- self.log.error("ITUNES:sync_booklists(): could not find '%s' on device" % updated_book['title'])
-
- elif iswindows:
- try:
- pythoncom.CoInitialize()
- self.iTunes = win32com.client.Dispatch("iTunes.Application")
-
- for updated_book in self.update_list:
- size_on_device = self._get_device_book_size(updated_book['title'], updated_book['author'])
- if size_on_device:
- for book in booklists[0]:
- if book.title == updated_book['title'] and \
- book.author[0] == updated_book['author']:
- book.size = size_on_device
- break
- else:
- self.log.error("ITUNES:sync_booklists(): could not update book size for '%s'" % updated_book['title'])
-
- else:
- self.log.error("ITUNES:sync_booklists(): could not find '%s' on device" % updated_book['title'])
- finally:
- pythoncom.CoUninitialize()
-
+ self._update_device(msg=self.update_msg, wait=False)
self.update_list = []
+ self.update_needed = False
# Inform user of any problem books
if self.problem_titles:
@@ -729,22 +723,50 @@ class ITUNES(DevicePlugin):
self.problem_msg = _("Some cover art could not be converted.\n"
"Click 'Show Details' for a list.")
+ if DEBUG:
+ self.log.info("ITUNES.upload_books()")
+ self._dump_files(files, header='upload_books()')
+# self._dump_cached_books('upload_books()')
+ self._dump_update_list('upload_books()')
+
if isosx:
- if DEBUG:
- self.log.info("ITUNES.upload_books():")
- self._dump_files(files, header='upload_books()')
- self._dump_cached_books('upload_books()')
- self._dump_update_list('upload_books()')
for (i,file) in enumerate(files):
+ # Delete existing from Library|Books
+ # Add to self.update_list for deletion from booklist[0] during add_books_to_metadata
+
+ '''
+ # ---------------------------
+ # PROVISIONAL
+ # Use the cover to find the database storage point of the epub
+ # Pass database copy to iTunes instead of the temporary file
+
+ if False:
+ if DEBUG:
+ self.log.info(" processing '%s'" % metadata[i].title)
+ self.log.info(" file: %s" % (file._name if isinstance(file,PersistentTemporaryFile) else file))
+ self.log.info(" cover: %s" % metadata[i].cover)
+
+ calibre_database_item = False
+ if metadata[i].cover:
+ passed_file = file
+ storage_path = os.path.split(metadata[i].cover)[0]
+ try:
+ database_epub = filter(lambda x: x.endswith('.epub'), os.listdir(storage_path))[0]
+ file = os.path.join(storage_path,database_epub)
+ calibre_database_item = True
+ self.log.info(" using database file: %s" % file)
+ except:
+ self.log.info(" could not find epub in %s" % storage_path)
+ else:
+ self.log.info(" no cover available, using temp file")
+ # ---------------------------
+ '''
+
path = self.path_template % (metadata[i].title, metadata[i].author[0])
- # Delete existing from Library|Books, add to self.update_list
- # for deletion from booklist[0] during add_books_to_metadata
if path in self.cached_books:
if DEBUG:
self.log.info(" adding '%s' by %s to self.update_list" %
(self.cached_books[path]['title'],self.cached_books[path]['author']))
-
- # *** Second time a book is updated the author is a list ***
self.update_list.append(self.cached_books[path])
if DEBUG:
@@ -752,10 +774,12 @@ class ITUNES(DevicePlugin):
self._remove_from_iTunes(self.cached_books[path])
# Add to iTunes Library|Books
- if isinstance(file,PersistentTemporaryFile):
- added = self.iTunes.add(appscript.mactypes.File(file._name))
- else:
- added = self.iTunes.add(appscript.mactypes.File(file))
+ fpath = file
+ if getattr(file, 'orig_file_path', None) is not None:
+ fpath = file.orig_file_path
+ elif getattr(file, 'name', None) is not None:
+ fpath = file.name
+ added = self.iTunes.add(appscript.mactypes.File(fpath))
thumb = None
if metadata[i].cover:
@@ -792,16 +816,17 @@ class ITUNES(DevicePlugin):
this_book.device_collections = []
this_book.library_id = added
this_book.path = path
- this_book.size = added.size() # Updated later from actual storage size
+ this_book.size = self._get_device_book_size(fpath, added.size())
this_book.thumbnail = thumb
this_book.iTunes_id = added
new_booklist.append(this_book)
- # Flesh out the iTunes metadata
- added.description.set("added by calibre %s" % strftime('%Y-%m-%d %H:%M:%S'))
+ # Populate the iTunes metadata
if metadata[i].comments:
added.comment.set(strip_tags.sub('',metadata[i].comments))
+ added.description.set("added by calibre %s" % strftime('%Y-%m-%d %H:%M:%S'))
+ added.enabled.set(True)
if metadata[i].rating:
added.rating.set(metadata[i].rating*10)
added.sort_artist.set(metadata[i].author_sort.title())
@@ -825,20 +850,67 @@ class ITUNES(DevicePlugin):
# Report progress
if self.report_progress is not None:
self.report_progress(i+1/file_count, _('%d of %d') % (i+1, file_count))
+
elif iswindows:
try:
pythoncom.CoInitialize()
self.iTunes = win32com.client.Dispatch("iTunes.Application")
- lib = self.iTunes.sources.ItemByName('Library')
- lib_playlists = [pl.Name for pl in lib.Playlists]
- if not 'Books' in lib_playlists:
- self.log.error(" no 'Books' playlist in Library")
- library_books = lib.Playlists.ItemByName('Books')
+
+ for source in self.iTunes.sources:
+ if source.Kind == self.Sources.index('Library'):
+ lib = source
+ if DEBUG:
+ self.log.info(" Library source: '%s' kind: %s" % (lib.Name, self.Sources[lib.Kind]))
+ break
+ else:
+ if DEBUG:
+ self.log.info(" Library source not found")
+
+ if lib is not None:
+ lib_books = None
+ for pl in lib.Playlists:
+ if self.PlaylistKind[pl.Kind] == 'User' and self.PlaylistSpecialKind[pl.SpecialKind] == 'Books':
+ if DEBUG:
+ self.log.info(" Books playlist: '%s' special_kind: '%s'" % (pl.Name, self.PlaylistSpecialKind[pl.SpecialKind]))
+ lib_books = pl
+ break
+ else:
+ if DEBUG:
+ self.log.error(" no Books playlist found")
for (i,file) in enumerate(files):
- path = self.path_template % (metadata[i].title, metadata[i].author[0])
# Delete existing from Library|Books, add to self.update_list
# for deletion from booklist[0] during add_books_to_metadata
+
+ '''
+ # ---------------------------
+ # PROVISIONAL
+ # Use the cover to find the database storage point of the epub
+ # Pass database copy to iTunes instead of the temporary file
+
+ if False:
+ if DEBUG:
+ self.log.info(" processing '%s'" % metadata[i].title)
+ self.log.info(" file: %s" % (file._name if isinstance(file,PersistentTemporaryFile) else file))
+ self.log.info(" cover: %s" % metadata[i].cover)
+
+ calibre_database_item = False
+ if metadata[i].cover:
+ passed_file = file
+ storage_path = os.path.split(metadata[i].cover)[0]
+ try:
+ database_epub = filter(lambda x: x.endswith('.epub'), os.listdir(storage_path))[0]
+ file = os.path.join(storage_path,database_epub)
+ calibre_database_item = True
+ self.log.info(" using database file: %s" % file)
+ except:
+ self.log.info(" could not find epub in %s" % storage_path)
+ else:
+ self.log.info(" no cover available, using temp file")
+ # ---------------------------
+ '''
+
+ path = self.path_template % (metadata[i].title, metadata[i].author[0])
if path in self.cached_books:
self.update_list.append(self.cached_books[path])
@@ -851,12 +923,15 @@ class ITUNES(DevicePlugin):
self.log.info(" '%s' not in cached_books" % metadata[i].title)
# Add to iTunes Library|Books
- if isinstance(file,PersistentTemporaryFile):
- op_status = library_books.AddFile(file._name)
- self.log.info("ITUNES.upload_books():\n iTunes adding '%s'" % file._name)
- else:
- op_status = library_books.AddFile(file)
- self.log.info(" iTunes adding '%s'" % file)
+ fpath = file
+ if getattr(file, 'orig_file_path', None) is not None:
+ fpath = file.orig_file_path
+ elif getattr(file, 'name', None) is not None:
+ fpath = file.name
+
+ op_status = lib_books.AddFile(fpath)
+ self.log.info("ITUNES.upload_books():\n iTunes adding '%s'"
+ % fpath)
if DEBUG:
sys.stdout.write(" iTunes copying '%s' ..." % metadata[i].title)
@@ -936,9 +1011,10 @@ class ITUNES(DevicePlugin):
new_booklist.append(this_book)
# Flesh out the iTunes metadata
- added.Description = ("added by calibre %s" % strftime('%Y-%m-%d %H:%M:%S'))
if metadata[i].comments:
added.Comment = (strip_tags.sub('',metadata[i].comments))
+ added.Description = ("added by calibre %s" % strftime('%Y-%m-%d %H:%M:%S'))
+ added.Enabled = True
if metadata[i].rating:
added.AlbumRating = (metadata[i].rating*10)
added.SortArtist = (metadata[i].author_sort.title())
@@ -1053,20 +1129,6 @@ class ITUNES(DevicePlugin):
ub['author']))
self.log.info()
- def _find_device_book(self, cached_book):
- '''
- Windows-only method to get a handle to a device book in the current pythoncom session
- '''
- SearchField = ['All','Visible','Artists','Titles','Composers','SongNames']
- if iswindows:
- dev_books = self.iTunes.sources.ItemByName(self.sources['iPod']).Playlists.ItemByName('Books')
- hits = dev_books.Search(cached_book['title'],SearchField.index('Titles'))
- if hits:
- for hit in hits:
- if hit.Artist == cached_book['author']:
- return hit
- return None
-
def _find_library_book(self, cached_book):
'''
Windows-only method to get a handle to a library book in the current pythoncom session
@@ -1076,7 +1138,28 @@ class ITUNES(DevicePlugin):
if DEBUG:
self.log.info("ITUNES._find_library_book()")
self.log.info(" looking for '%s' by %s" % (cached_book['title'], cached_book['author']))
- lib_books = self.iTunes.sources.ItemByName('Library').Playlists.ItemByName('Books')
+
+ for source in self.iTunes.sources:
+ if source.Kind == self.Sources.index('Library'):
+ lib = source
+ if DEBUG:
+ self.log.info(" Library source: '%s' kind: %s" % (lib.Name, self.Sources[lib.Kind]))
+ break
+ else:
+ if DEBUG:
+ self.log.info(" Library source not found")
+
+ if lib is not None:
+ lib_books = None
+ for pl in lib.Playlists:
+ if self.PlaylistKind[pl.Kind] == 'User' and self.PlaylistSpecialKind[pl.SpecialKind] == 'Books':
+ if DEBUG:
+ self.log.info(" Books playlist: '%s' special_kind: '%s'" % (pl.Name, self.PlaylistSpecialKind[pl.SpecialKind]))
+ lib_books = pl
+ break
+ else:
+ if DEBUG:
+ self.log.error(" no Books playlist found")
attempts = 9
while attempts:
@@ -1084,7 +1167,7 @@ class ITUNES(DevicePlugin):
hits = lib_books.Search(cached_book['author'],SearchField.index('Artists'))
if hits:
for hit in hits:
- self.log.info(" evaluating '%s' by %s" % (hit.Name, hit.Artist))
+ #self.log.info(" evaluating '%s' by %s" % (hit.Name, hit.Artist))
if hit.Name == cached_book['title']:
self.log.info(" matched '%s' by %s" % (hit.Name, hit.Artist))
return hit
@@ -1114,12 +1197,6 @@ class ITUNES(DevicePlugin):
except:
zfw = zipfile.ZipFile(archive_path, mode='a')
else:
-# if DEBUG:
-# if isosx:
-# self.log.info("ITUNES._generate_thumbnail(): cached thumb found for '%s'" % book.name())
-# elif iswindows:
-# self.log.info("ITUNES._generate_thumbnail(): cached thumb found for '%s'" % book.Name)
-
return thumb_data
if isosx:
@@ -1153,7 +1230,7 @@ class ITUNES(DevicePlugin):
return None
# Save the cover from iTunes
- tmp_thumb = os.path.join(tempfile.gettempdir(), "thumb.%s" % ArtworkFormat[book.Artwork.Item(1).Format])
+ tmp_thumb = os.path.join(tempfile.gettempdir(), "thumb.%s" % self.ArtworkFormat[book.Artwork.Item(1).Format])
book.Artwork.Item(1).SaveArtworkToFile(tmp_thumb)
try:
# Resize the cover
@@ -1174,86 +1251,150 @@ class ITUNES(DevicePlugin):
self.log.error(" error generating thumb for '%s'" % book.Name)
return None
- def _get_device_book_size(self, title, author):
+ def _get_device_book_size(self, file, compressed_size):
'''
- Fetch the size of a book stored on the device
-
- Windows: If sync-in-progress, this call blocked until sync completes
+ Calculate the exploded size of file
'''
+ myZip = zipfile.ZipFile(file,'r')
+ myZipList = myZip.infolist()
+ exploded_file_size = 0
+ for file in myZipList:
+ exploded_file_size += file.file_size
if DEBUG:
- self.log.info("ITUNES._get_device_book_size():\n looking for title: '%s' author: '%s'" %
- (title,author))
-
- device_books = self._get_device_books()
-
- if isosx:
- for d_book in device_books:
- if d_book.name() == title and d_book.artist() == author:
- if DEBUG:
- self.log.info(' found it')
- return d_book.size()
- else:
- self.log.error("ITUNES._get_device_book_size():"
- " could not find '%s' by '%s' in device_books" % (title,author))
- return None
- elif iswindows:
- for d_book in device_books:
- if d_book.Name == title and d_book.Artist == author:
- self.log.info(" found it")
- return d_book.Size
- else:
- self.log.error(" could not find '%s' by '%s' in device_books" % (title,author))
- return None
+ self.log.info("ITUNES._get_device_book_size()")
+ self.log.info(" %d items in archive" % len(myZipList))
+ self.log.info(" compressed: %d exploded: %d" % (compressed_size, exploded_file_size))
+ return exploded_file_size
def _get_device_books(self):
'''
- Assumes pythoncom wrapper
+ Assumes pythoncom wrapper for Windows
'''
+ if DEBUG:
+ self.log.info("\nITUNES._get_device_books()")
+
+ device_books = []
if isosx:
if 'iPod' in self.sources:
connected_device = self.sources['iPod']
- if 'Books' in self.iTunes.sources[connected_device].playlists.name():
- return self.iTunes.sources[connected_device].playlists['Books'].file_tracks()
- return []
+ device = self.iTunes.sources[connected_device]
+ for pl in device.playlists():
+ if pl.special_kind() == appscript.k.Books:
+ if DEBUG:
+ self.log.info(" Book playlist: '%s' special_kind: '%s'" % (pl.name(), pl.special_kind()))
+ books = pl.file_tracks()
+ break
+ else:
+ self.log.error(" book_playlist not found")
+
+ for book in books:
+ if book.kind() in ['Book','Protected book']:
+ device_books.append(book)
+ else:
+ if DEBUG:
+ self.log.info(" ignoring '%s' of type '%s'" % (book.name(), book.kind()))
elif iswindows:
if 'iPod' in self.sources:
- connected_device = self.sources['iPod']
- dev = self.iTunes.sources.ItemByName(connected_device)
- dev_playlists = [pl.Name for pl in dev.Playlists]
- if 'Books' in dev_playlists:
- return self.iTunes.sources.ItemByName(connected_device).Playlists.ItemByName('Books').Tracks
- else:
- return []
- if DEBUG:
- self.log.warning('ITUNES._get_device_book(): No iPod device connected')
- return []
+ try:
+ pythoncom.CoInitialize()
+ connected_device = self.sources['iPod']
+ device = self.iTunes.sources.ItemByName(connected_device)
+
+ dev_books = None
+ for pl in device.Playlists:
+ if self.PlaylistKind[pl.Kind] == 'User' and self.PlaylistSpecialKind[pl.SpecialKind] == 'Books':
+ if DEBUG:
+ self.log.info(" Books playlist: '%s' special_kind: '%s'" % (pl.Name, self.PlaylistSpecialKind[pl.SpecialKind]))
+ dev_books = pl.Tracks
+ break
+ else:
+ if DEBUG:
+ self.log.info(" no Books playlist found")
+
+ for book in dev_books:
+ if book.KindAsString in ['Book','Protected book']:
+ device_books.append(book)
+ else:
+ self.log.info(" ignoring '%s' of type %s" % (book.Name, book.KindAsString))
+
+ finally:
+ pythoncom.CoUninitialize()
+
+ return device_books
def _get_library_books(self):
'''
Populate a dict of paths from iTunes Library|Books
'''
+ if DEBUG:
+ self.log.info("\nITUNES._get_library_books()")
+
library_books = {}
+ lib = None
if isosx:
- lib = self.iTunes.sources['library']
- if 'Books' in lib.playlists.name():
- lib_books = lib.playlists['Books'].file_tracks()
+ for source in self.iTunes.sources():
+ if source.kind() == appscript.k.library:
+ lib = source
+ if DEBUG:
+ self.log.info(" Library source: '%s' kind: %s" % (lib.name(), lib.kind()))
+ break
+ else:
+ if DEBUG:
+ self.log.error(' Library source not found')
+
+ if lib is not None:
+ lib_books = None
+ for pl in lib.playlists():
+ if pl.special_kind() == appscript.k.Books:
+ if DEBUG:
+ self.log.info(" Books playlist: '%s' special_kind: '%s'" % (pl.name(), pl.special_kind()))
+ break
+ lib_books = pl.file_tracks()
for book in lib_books:
- path = self.path_template % (book.name(), book.artist())
- library_books[path] = book
+ if book.kind() in ['Book','Protected book']:
+ path = self.path_template % (book.name(), book.artist())
+ library_books[path] = book
+ else:
+ if DEBUG:
+ self.log.info(" ignoring library book of type '%s'" % book.kind())
+ else:
+ if DEBUG:
+ self.log.info('ITUNES._get_library_books():\n No Books playlist')
elif iswindows:
+ lib = None
try:
pythoncom.CoInitialize()
self.iTunes = win32com.client.Dispatch("iTunes.Application")
- lib = self.iTunes.sources.ItemByName('Library')
- lib_playlists = [pl.Name for pl in lib.Playlists]
- if 'Books' in lib_playlists:
- lib_books = lib.Playlists.ItemByName('Books').Tracks
+ for source in self.iTunes.sources:
+ if source.Kind == self.Sources.index('Library'):
+ lib = source
+ self.log.info(" Library source: '%s' kind: %s" % (lib.Name, self.Sources[lib.Kind]))
+ break
+ else:
+ self.log.error(" Library source not found")
+
+ if lib is not None:
+ lib_books = None
+ for pl in lib.Playlists:
+ if self.PlaylistKind[pl.Kind] == 'User' and self.PlaylistSpecialKind[pl.SpecialKind] == 'Books':
+ if DEBUG:
+ self.log.info(" Books playlist: '%s' special_kind: '%s'" % (pl.Name, self.PlaylistSpecialKind[pl.SpecialKind]))
+ lib_books = pl.Tracks
+ break
+ else:
+ if DEBUG:
+ self.log.error(" no Books playlist found")
+
for book in lib_books:
- path = self.path_template % (book.Name, book.Artist)
- library_books[path] = book
+ if book.KindAsString in ['Book','Protected book']:
+ path = self.path_template % (book.Name, book.Artist)
+ library_books[path] = book
+ else:
+ if DEBUG:
+ self.log.info(" ignoring '%s' of type %s" % (book.Name, book.KindAsString))
finally:
pythoncom.CoUninitialize()
@@ -1324,11 +1465,21 @@ class ITUNES(DevicePlugin):
self.iTunes = appscript.app('iTunes')
initial_status = 'already running'
+ # Read the current storage path for iTunes media
+ cmd = "defaults read com.apple.itunes NSNavLastRootDirectory"
+ proc = subprocess.Popen( cmd, shell=True, cwd=os.curdir, stdout=subprocess.PIPE)
+ proc.wait()
+ media_dir = os.path.abspath(proc.communicate()[0].strip())
+ if os.path.exists(media_dir):
+ self.iTunes_media = media_dir
+ else:
+ self.log.error(" could not confirm valid iTunes.media_dir from %s" % 'com.apple.itunes')
+
if DEBUG:
- self.log.info( " [%s - %s (%s), driver version %d.%d.%d]" %
+ self.log.info(" [%s - %s (%s), driver version %d.%d.%d]" %
(self.iTunes.name(), self.iTunes.version(), initial_status,
self.version[0],self.version[1],self.version[2]))
-
+ self.log.info(" iTunes_media: %s" % self.iTunes_media)
if iswindows:
'''
Launch iTunes if not already running
@@ -1340,40 +1491,59 @@ class ITUNES(DevicePlugin):
self.iTunes.Windows[0].Minimized = True
initial_status = 'launched'
+ # Read the current storage path for iTunes media from the XML file
+ with open(self.iTunes.LibraryXMLPath, 'r') as xml:
+ soup = BeautifulSoup(xml.read().decode('utf-8'))
+ mf = soup.find('key',text="Music Folder").parent
+ string = mf.findNext('string').renderContents()
+ media_dir = os.path.abspath(string[len('file://localhost/'):].replace('%20',' '))
+ if os.path.exists(media_dir):
+ self.iTunes_media = media_dir
+ else:
+ self.log.error(" could not extract valid iTunes.media_dir from %s" % self.iTunes.LibraryXMLPath)
+ self.log.error(" %s" % string.parent.prettify())
+ self.log.error(" '%s' not found" % media_dir)
+
if DEBUG:
self.log.info( " [%s - %s (%s), driver version %d.%d.%d]" %
(self.iTunes.Windows[0].name, self.iTunes.Version, initial_status,
self.version[0],self.version[1],self.version[2]))
+ self.log.info(" iTunes_media: %s" % self.iTunes_media)
def _remove_from_iTunes(self, cached_book):
'''
iTunes does not delete books from storage when removing from database
+ We only want to delete stored copies if the file is stored in iTunes
+ We don't want to delete files stored outside of iTunes
'''
if isosx:
storage_path = os.path.split(cached_book['lib_book'].location().path)
- title_storage_path = storage_path[0]
- if DEBUG:
- self.log.info("ITUNES._remove_from_iTunes():")
- self.log.info(" removing title_storage_path: %s" % title_storage_path)
- try:
- shutil.rmtree(title_storage_path)
- except:
- self.log.info(" '%s' not empty" % title_storage_path)
+ if cached_book['lib_book'].location().path.startswith(self.iTunes_media):
+ title_storage_path = storage_path[0]
+ if DEBUG:
+ self.log.info("ITUNES._remove_from_iTunes():")
+ self.log.info(" removing title_storage_path: %s" % title_storage_path)
+ try:
+ shutil.rmtree(title_storage_path)
+ except:
+ self.log.info(" '%s' not empty" % title_storage_path)
- # Clean up title/author directories
- author_storage_path = os.path.split(title_storage_path)[0]
- self.log.info(" author_storage_path: %s" % author_storage_path)
- author_files = os.listdir(author_storage_path)
- if '.DS_Store' in author_files:
- author_files.pop(author_files.index('.DS_Store'))
- if not author_files:
- shutil.rmtree(author_storage_path)
- if DEBUG:
- self.log.info(" removing empty author_storage_path")
+ # Clean up title/author directories
+ author_storage_path = os.path.split(title_storage_path)[0]
+ self.log.info(" author_storage_path: %s" % author_storage_path)
+ author_files = os.listdir(author_storage_path)
+ if '.DS_Store' in author_files:
+ author_files.pop(author_files.index('.DS_Store'))
+ if not author_files:
+ shutil.rmtree(author_storage_path)
+ if DEBUG:
+ self.log.info(" removing empty author_storage_path")
+ else:
+ if DEBUG:
+ self.log.info(" author_storage_path not empty (%d objects):" % len(author_files))
+ self.log.info(" %s" % '\n'.join(author_files))
else:
- if DEBUG:
- self.log.info(" author_storage_path not empty (%d objects):" % len(author_files))
- self.log.info(" %s" % '\n'.join(author_files))
+ self.log.info(" '%s' stored external to iTunes, no files deleted" % cached_book['title'])
self.iTunes.delete(cached_book['lib_book'])
@@ -1383,26 +1553,34 @@ class ITUNES(DevicePlugin):
Windows stores the book under a common author directory, so we just delete the .epub
'''
if DEBUG:
- self.log.info("ITUNES._remove_from_iTunes(): '%s'" % cached_book['title'])
+ self.log.info("ITUNES._remove_from_iTunes():\n '%s'" % cached_book['title'])
book = self._find_library_book(cached_book)
if book:
- if DEBUG:
- self.log.info("ITUNES._remove_from_iTunes():\n deleting '%s' at %s" %
- (cached_book['title'], book.Location))
- folder = os.path.split(book.Location)[0]
path = book.Location
+ storage_path = os.path.split(book.Location)
+ if book.Location.startswith(self.iTunes_media):
+ if DEBUG:
+ self.log.info("ITUNES._remove_from_iTunes():")
+ self.log.info(" removing '%s' at %s" %
+ (cached_book['title'], path))
+ try:
+ os.remove(path)
+ except:
+ self.log.warning(" could not find '%s' in iTunes storage" % path)
+ try:
+ os.rmdir(storage_path[0])
+ self.log.info(" removed folder '%s'" % storage_path[0])
+ except:
+ self.log.info(" folder '%s' not found or not empty" % storage_path[0])
+
+ # Delete from iTunes database
+ else:
+ self.log.info(" '%s' stored external to iTunes, no files deleted" % cached_book['title'])
+
book.Delete()
- try:
- os.remove(path)
- except:
- self.log.warning(" could not find '%s' in iTunes storage" % path)
- try:
- os.rmdir(folder)
- self.log.info(" removed folder '%s'" % folder)
- except:
- self.log.info(" folder '%s' not found or not empty" % folder)
+
else:
- self.log.warning(" could not find '%s' in iTunes storage" % cached_book['title'])
+ self.log.warning(" could not find '%s' in iTunes database" % cached_book['title'])
def _update_device(self, msg='', wait=True):
'''
@@ -1448,11 +1626,9 @@ class ITUNES(DevicePlugin):
sys.stdout.write('\n')
sys.stdout.flush()
break
-
finally:
pythoncom.CoUninitialize()
-
class BookList(list):
'''
A list of books. Each Book object must have the fields:
diff --git a/src/calibre/devices/hanlin/driver.py b/src/calibre/devices/hanlin/driver.py
index c6c9fb876a..adb4b353f3 100644
--- a/src/calibre/devices/hanlin/driver.py
+++ b/src/calibre/devices/hanlin/driver.py
@@ -123,5 +123,12 @@ class BOOX(HANLINV3):
EBOOK_DIR_MAIN = 'MyBooks'
EBOOK_DIR_CARD_A = 'MyBooks'
+ def windows_sort_drives(self, drives):
+ return drives
+ def osx_sort_names(self, names):
+ return names
+
+ def linux_swap_drives(self, drives):
+ return drives
diff --git a/src/calibre/devices/interface.py b/src/calibre/devices/interface.py
index 35617d8097..2d82bf4563 100644
--- a/src/calibre/devices/interface.py
+++ b/src/calibre/devices/interface.py
@@ -287,7 +287,9 @@ class DevicePlugin(Plugin):
This method should raise a L{FreeSpaceError} if there is not enough
free space on the device. The text of the FreeSpaceError must contain the
word "card" if C{on_card} is not None otherwise it must contain the word "memory".
- :files: A list of paths and/or file-like objects.
+ :files: A list of paths and/or file-like objects. If they are paths and
+ the paths point to temporary files, they may have an additional
+ attribute, original_file_path pointing to the originals.
:names: A list of file names that the books should have
once uploaded to the device. len(names) == len(files)
:return: A list of 3-element tuples. The list is meant to be passed
diff --git a/src/calibre/devices/prs500/cli/main.py b/src/calibre/devices/prs500/cli/main.py
index 6ad5fe2087..cd8395467b 100755
--- a/src/calibre/devices/prs500/cli/main.py
+++ b/src/calibre/devices/prs500/cli/main.py
@@ -337,7 +337,7 @@ def main():
dev.touch(args[0])
elif command == 'test_file':
parser = OptionParser(usage=("usage: %prog test_file path\n"
- 'Open device, copy file psecified by path to device and '
+ 'Open device, copy file specified by path to device and '
'then eject device.'))
options, args = parser.parse_args(args)
if len(args) != 1:
diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py
index bd06d2d7e1..38fac8b266 100644
--- a/src/calibre/devices/prs505/driver.py
+++ b/src/calibre/devices/prs505/driver.py
@@ -6,10 +6,9 @@ __docformat__ = 'restructuredtext en'
Device driver for the SONY devices
'''
-import os
-import re
+import os, time, re
-from calibre.devices.usbms.driver import USBMS
+from calibre.devices.usbms.driver import USBMS, debug_print
from calibre.devices.prs505 import MEDIA_XML
from calibre.devices.prs505 import CACHE_XML
from calibre.devices.prs505.sony_cache import XMLCache
@@ -66,6 +65,41 @@ class PRS505(USBMS):
def windows_filter_pnp_id(self, pnp_id):
return '_LAUNCHER' in pnp_id
+ def post_open_callback(self):
+
+ def write_cache(prefix):
+ try:
+ cachep = os.path.join(prefix, *(CACHE_XML.split('/')))
+ if not os.path.exists(cachep):
+ dname = os.path.dirname(cachep)
+ if not os.path.exists(dname):
+ try:
+ os.makedirs(dname, mode=0777)
+ except:
+ time.sleep(5)
+ os.makedirs(dname, mode=0777)
+ with open(cachep, 'wb') as f:
+ f.write(u'''
+
+
+ '''.encode('utf8'))
+ return True
+ except:
+ import traceback
+ traceback.print_exc()
+ return False
+
+ # Make sure we don't have the launcher partition
+ # as one of the cards
+
+ if self._card_a_prefix is not None:
+ if not write_cache(self._card_a_prefix):
+ self._card_a_prefix = None
+ if self._card_b_prefix is not None:
+ if not write_cache(self._card_b_prefix):
+ self._card_b_prefix = None
+
+
def get_device_information(self, end_session=True):
return (self.gui_name, '', '', '')
@@ -94,26 +128,31 @@ class PRS505(USBMS):
return XMLCache(paths, prefixes)
def books(self, oncard=None, end_session=True):
+ debug_print('PRS505: starting fetching books for card', oncard)
bl = USBMS.books(self, oncard=oncard, end_session=end_session)
c = self.initialize_XML_cache()
c.update_booklist(bl, {'carda':1, 'cardb':2}.get(oncard, 0))
+ debug_print('PRS505: finished fetching books for card', oncard)
return bl
def sync_booklists(self, booklists, end_session=True):
+ debug_print('PRS505: started sync_booklists')
c = self.initialize_XML_cache()
blists = {}
for i in c.paths:
if booklists[i] is not None:
blists[i] = booklists[i]
opts = self.settings()
- collections = ['series', 'tags']
if opts.extra_customization:
collections = [x.strip() for x in
opts.extra_customization.split(',')]
-
+ else:
+ collections = []
+ debug_print('PRS505: collection fields:', collections)
c.update(blists, collections)
c.write()
USBMS.sync_booklists(self, booklists, end_session=end_session)
+ debug_print('PRS505: finished sync_booklists')
diff --git a/src/calibre/devices/prs505/sony_cache.py b/src/calibre/devices/prs505/sony_cache.py
index 177a741e0d..5542e28d90 100644
--- a/src/calibre/devices/prs505/sony_cache.py
+++ b/src/calibre/devices/prs505/sony_cache.py
@@ -14,6 +14,7 @@ from lxml import etree
from calibre import prints, guess_type
from calibre.devices.errors import DeviceError
+from calibre.devices.usbms.driver import debug_print
from calibre.constants import DEBUG
from calibre.ebooks.chardet import xml_to_unicode
from calibre.ebooks.metadata import authors_to_string, title_sort
@@ -61,7 +62,7 @@ class XMLCache(object):
def __init__(self, paths, prefixes):
if DEBUG:
- prints('Building XMLCache...')
+ debug_print('Building XMLCache...')
pprint(paths)
self.paths = paths
self.prefixes = prefixes
@@ -97,16 +98,17 @@ class XMLCache(object):
self.record_roots[0] = recs[0]
self.detect_namespaces()
+ debug_print('Done building XMLCache...')
# Playlist management {{{
def purge_broken_playlist_items(self, root):
+ id_map = self.build_id_map(root)
for pl in root.xpath('//*[local-name()="playlist"]'):
seen = set([])
for item in list(pl):
id_ = item.get('id', None)
- if id_ is None or id_ in seen or not root.xpath(
- '//*[local-name()!="item" and @id="%s"]'%id_):
+ if id_ is None or id_ in seen or id_map.get(id_, None) is None:
if DEBUG:
if id_ is None:
cause = 'invalid id'
@@ -127,7 +129,7 @@ class XMLCache(object):
for playlist in root.xpath('//*[local-name()="playlist"]'):
if len(playlist) == 0 or not playlist.get('title', None):
if DEBUG:
- prints('Removing playlist id:', playlist.get('id', None),
+ debug_print('Removing playlist id:', playlist.get('id', None),
playlist.get('title', None))
playlist.getparent().remove(playlist)
@@ -149,20 +151,25 @@ class XMLCache(object):
seen.add(title)
def get_playlist_map(self):
+ debug_print('Start get_playlist_map')
ans = {}
self.ensure_unique_playlist_titles()
+ debug_print('after ensure_unique_playlist_titles')
self.prune_empty_playlists()
+ debug_print('get_playlist_map loop')
for i, root in self.record_roots.items():
+ debug_print('get_playlist_map loop', i)
+ id_map = self.build_id_map(root)
ans[i] = []
for playlist in root.xpath('//*[local-name()="playlist"]'):
items = []
for item in playlist:
id_ = item.get('id', None)
- records = root.xpath(
- '//*[local-name()="text" and @id="%s"]'%id_)
- if records:
- items.append(records[0])
+ record = id_map.get(id_, None)
+ if record is not None:
+ items.append(record)
ans[i].append((playlist.get('title'), items))
+ debug_print('end get_playlist_map')
return ans
def get_or_create_playlist(self, bl_idx, title):
@@ -171,7 +178,7 @@ class XMLCache(object):
if playlist.get('title', None) == title:
return playlist
if DEBUG:
- prints('Creating playlist:', title)
+ debug_print('Creating playlist:', title)
ans = root.makeelement('{%s}playlist'%self.namespaces[bl_idx],
nsmap=root.nsmap, attrib={
'uuid' : uuid(),
@@ -185,7 +192,7 @@ class XMLCache(object):
def fix_ids(self): # {{{
if DEBUG:
- prints('Running fix_ids()')
+ debug_print('Running fix_ids()')
def ensure_numeric_ids(root):
idmap = {}
@@ -198,8 +205,8 @@ class XMLCache(object):
idmap[id_] = '-1'
if DEBUG and idmap:
- prints('Found non numeric ids:')
- prints(list(idmap.keys()))
+ debug_print('Found non numeric ids:')
+ debug_print(list(idmap.keys()))
return idmap
def remap_playlist_references(root, idmap):
@@ -210,7 +217,7 @@ class XMLCache(object):
if id_ in idmap:
item.set('id', idmap[id_])
if DEBUG:
- prints('Remapping id %s to %s'%(id_, idmap[id_]))
+ debug_print('Remapping id %s to %s'%(id_, idmap[id_]))
def ensure_media_xml_base_ids(root):
for num, tag in enumerate(('library', 'watchSpecial')):
@@ -260,6 +267,8 @@ class XMLCache(object):
last_bl = max(self.roots.keys())
max_id = self.max_id(self.roots[last_bl])
self.roots[0].set('nextID', str(max_id+1))
+ debug_print('Finished running fix_ids()')
+
# }}}
# Update JSON from XML {{{
@@ -267,7 +276,7 @@ class XMLCache(object):
if bl_index not in self.record_roots:
return
if DEBUG:
- prints('Updating JSON cache:', bl_index)
+ debug_print('Updating JSON cache:', bl_index)
root = self.record_roots[bl_index]
pmap = self.get_playlist_map()[bl_index]
playlist_map = {}
@@ -279,13 +288,14 @@ class XMLCache(object):
playlist_map[path] = []
playlist_map[path].append(title)
+ lpath_map = self.build_lpath_map(root)
for book in bl:
- record = self.book_by_lpath(book.lpath, root)
+ record = lpath_map.get(book.lpath, None)
if record is not None:
title = record.get('title', None)
if title is not None and title != book.title:
if DEBUG:
- prints('Renaming title', book.title, 'to', title)
+ debug_print('Renaming title', book.title, 'to', title)
book.title = title
# We shouldn't do this for Sonys, because the reader strips
# all but the first author.
@@ -310,20 +320,24 @@ class XMLCache(object):
if book.lpath in playlist_map:
tags = playlist_map[book.lpath]
book.device_collections = tags
+ debug_print('Finished updating JSON cache:', bl_index)
# }}}
# Update XML from JSON {{{
def update(self, booklists, collections_attributes):
+ debug_print('Starting update XML from JSON')
playlist_map = self.get_playlist_map()
for i, booklist in booklists.items():
if DEBUG:
- prints('Updating XML Cache:', i)
+ debug_print('Updating XML Cache:', i)
root = self.record_roots[i]
+ lpath_map = self.build_lpath_map(root)
for book in booklist:
path = os.path.join(self.prefixes[i], *(book.lpath.split('/')))
- record = self.book_by_lpath(book.lpath, root)
+# record = self.book_by_lpath(book.lpath, root)
+ record = lpath_map.get(book.lpath, None)
if record is None:
record = self.create_text_record(root, i, book.lpath)
self.update_text_record(record, book, path, i)
@@ -337,16 +351,19 @@ class XMLCache(object):
# This is needed to update device_collections
for i, booklist in booklists.items():
self.update_booklist(booklist, i)
+ debug_print('Finished update XML from JSON')
def update_playlists(self, bl_index, root, booklist, playlist_map,
collections_attributes):
+ debug_print('Starting update_playlists')
collections = booklist.get_collections(collections_attributes)
+ lpath_map = self.build_lpath_map(root)
for category, books in collections.items():
- records = [self.book_by_lpath(b.lpath, root) for b in books]
+ records = [lpath_map.get(b.lpath, None) for b in books]
# Remove any books that were not found, although this
# *should* never happen
if DEBUG and None in records:
- prints('WARNING: Some elements in the JSON cache were not'
+ debug_print('WARNING: Some elements in the JSON cache were not'
' found in the XML cache')
records = [x for x in records if x is not None]
for rec in records:
@@ -355,7 +372,7 @@ class XMLCache(object):
ids = [x.get('id', None) for x in records]
if None in ids:
if DEBUG:
- prints('WARNING: Some elements do not have ids')
+ debug_print('WARNING: Some elements do not have ids')
ids = [x for x in ids if x is not None]
playlist = self.get_or_create_playlist(bl_index, category)
@@ -379,20 +396,21 @@ class XMLCache(object):
title = playlist.get('title', None)
if title not in collections:
if DEBUG:
- prints('Deleting playlist:', playlist.get('title', ''))
+ debug_print('Deleting playlist:', playlist.get('title', ''))
playlist.getparent().remove(playlist)
continue
books = collections[title]
- records = [self.book_by_lpath(b.lpath, root) for b in books]
+ records = [lpath_map.get(b.lpath, None) for b in books]
records = [x for x in records if x is not None]
ids = [x.get('id', None) for x in records]
ids = [x for x in ids if x is not None]
for item in list(playlist):
if item.get('id', None) not in ids:
if DEBUG:
- prints('Deleting item:', item.get('id', ''),
+ debug_print('Deleting item:', item.get('id', ''),
'from playlist:', playlist.get('title', ''))
playlist.remove(item)
+ debug_print('Finishing update_playlists')
def create_text_record(self, root, bl_id, lpath):
namespace = self.namespaces[bl_id]
@@ -408,17 +426,13 @@ class XMLCache(object):
timestamp = os.path.getctime(path)
date = strftime(timestamp)
if date != record.get('date', None):
- if DEBUG:
- prints('Changing date of', path, 'from',
- record.get('date', ''), 'to', date)
- prints('\tctime', strftime(os.path.getctime(path)))
- prints('\tmtime', strftime(os.path.getmtime(path)))
record.set('date', date)
record.set('size', str(os.stat(path).st_size))
- record.set('title', book.title)
+ title = book.title if book.title else _('Unknown')
+ record.set('title', title)
ts = book.title_sort
if not ts:
- ts = title_sort(book.title)
+ ts = title_sort(title)
record.set('titleSorter', ts)
record.set('author', authors_to_string(book.authors))
ext = os.path.splitext(path)[1]
@@ -474,12 +488,24 @@ class XMLCache(object):
# }}}
# Utility methods {{{
+
+ def build_lpath_map(self, root):
+ m = {}
+ for bk in root.xpath('//*[local-name()="text"]'):
+ m[bk.get('path')] = bk
+ return m
+
+ def build_id_map(self, root):
+ m = {}
+ for bk in root.xpath('//*[local-name()="text"]'):
+ m[bk.get('id')] = bk
+ return m
+
def book_by_lpath(self, lpath, root):
matches = root.xpath(u'//*[local-name()="text" and @path="%s"]'%lpath)
if matches:
return matches[0]
-
def max_id(self, root):
ans = -1
for x in root.xpath('//*[@id]'):
@@ -514,10 +540,10 @@ class XMLCache(object):
break
self.namespaces[i] = ns
- if DEBUG:
- prints('Found nsmaps:')
- pprint(self.nsmaps)
- prints('Found namespaces:')
- pprint(self.namespaces)
+# if DEBUG:
+# debug_print('Found nsmaps:')
+# pprint(self.nsmaps)
+# debug_print('Found namespaces:')
+# pprint(self.namespaces)
# }}}
diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py
index 6e8811432a..d065d0f47a 100644
--- a/src/calibre/devices/usbms/books.py
+++ b/src/calibre/devices/usbms/books.py
@@ -46,7 +46,8 @@ class Book(MetaInformation):
self.smart_update(other)
def __eq__(self, other):
- return self.path == getattr(other, 'path', None)
+ # use lpath because the prefix can change, changing path
+ return self.path == getattr(other, 'lpath', None)
@dynamic_property
def db_id(self):
@@ -97,13 +98,24 @@ class Book(MetaInformation):
class BookList(_BookList):
+ def __init__(self, oncard, prefix, settings):
+ _BookList.__init__(self, oncard, prefix, settings)
+ self._bookmap = {}
+
def supports_collections(self):
return False
def add_book(self, book, replace_metadata):
- if book not in self:
+ try:
+ b = self.index(book)
+ except (ValueError, IndexError):
+ b = None
+ if b is None:
self.append(book)
return True
+ if replace_metadata:
+ self[b].smart_update(book)
+ return True
return False
def remove_book(self, book):
@@ -112,7 +124,6 @@ class BookList(_BookList):
def get_collections(self):
return {}
-
class CollectionsBookList(BookList):
def supports_collections(self):
diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py
index cb95374ed5..2f01b8dd41 100644
--- a/src/calibre/devices/usbms/device.py
+++ b/src/calibre/devices/usbms/device.py
@@ -765,12 +765,8 @@ class Device(DeviceConfig, DevicePlugin):
path = existing[0]
def get_size(obj):
- if hasattr(obj, 'seek'):
- obj.seek(0, os.SEEK_END)
- size = obj.tell()
- obj.seek(0)
- return size
- return os.path.getsize(obj)
+ path = getattr(obj, 'name', obj)
+ return os.path.getsize(path)
sizes = [get_size(f) for f in files]
size = sum(sizes)
diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py
index 97c212775a..92e57e7447 100644
--- a/src/calibre/devices/usbms/driver.py
+++ b/src/calibre/devices/usbms/driver.py
@@ -12,15 +12,24 @@ for a particular device.
import os
import re
+import time
import json
from itertools import cycle
from calibre import prints, isbytestring
-from calibre.constants import filesystem_encoding
+from calibre.constants import filesystem_encoding, DEBUG
from calibre.devices.usbms.cli import CLI
from calibre.devices.usbms.device import Device
from calibre.devices.usbms.books import BookList, Book
+BASE_TIME = None
+def debug_print(*args):
+ global BASE_TIME
+ if BASE_TIME is None:
+ BASE_TIME = time.time()
+ if DEBUG:
+ prints('DEBUG: %6.1f'%(time.time()-BASE_TIME), *args)
+
# CLI must come before Device as it implements the CLI functions that
# are inherited from the device interface in Device.
class USBMS(CLI, Device):
@@ -47,6 +56,8 @@ class USBMS(CLI, Device):
def books(self, oncard=None, end_session=True):
from calibre.ebooks.metadata.meta import path_to_ext
+ debug_print ('USBMS: Fetching list of books from device. oncard=', oncard)
+
dummy_bl = BookList(None, None, None)
if oncard == 'carda' and not self._card_a_prefix:
@@ -136,8 +147,8 @@ class USBMS(CLI, Device):
need_sync = True
del bl[idx]
- #print "count found in cache: %d, count of files in metadata: %d, need_sync: %s" % \
- # (len(bl_cache), len(bl), need_sync)
+ debug_print('USBMS: count found in cache: %d, count of files in metadata: %d, need_sync: %s' % \
+ (len(bl_cache), len(bl), need_sync))
if need_sync: #self.count_found_in_bl != len(bl) or need_sync:
if oncard == 'cardb':
self.sync_booklists((None, None, bl))
@@ -147,10 +158,13 @@ class USBMS(CLI, Device):
self.sync_booklists((bl, None, None))
self.report_progress(1.0, _('Getting list of books on device...'))
+ debug_print('USBMS: Finished fetching list of books from device. oncard=', oncard)
return bl
def upload_books(self, files, names, on_card=None, end_session=True,
metadata=None):
+ debug_print('USBMS: uploading %d books'%(len(files)))
+
path = self._sanity_check(on_card, files)
paths = []
@@ -174,6 +188,7 @@ class USBMS(CLI, Device):
self.report_progress((i+1) / float(len(files)), _('Transferring books to device...'))
self.report_progress(1.0, _('Transferring books to device...'))
+ debug_print('USBMS: finished uploading %d books'%(len(files)))
return zip(paths, cycle([on_card]))
def upload_cover(self, path, filename, metadata):
@@ -186,6 +201,8 @@ class USBMS(CLI, Device):
pass
def add_books_to_metadata(self, locations, metadata, booklists):
+ debug_print('USBMS: adding metadata for %d books'%(len(metadata)))
+
metadata = iter(metadata)
for i, location in enumerate(locations):
self.report_progress((i+1) / float(len(locations)), _('Adding books to device metadata listing...'))
@@ -218,8 +235,10 @@ class USBMS(CLI, Device):
book.size = os.stat(self.normalize_path(path)).st_size
booklists[blist].add_book(book, replace_metadata=True)
self.report_progress(1.0, _('Adding books to device metadata listing...'))
+ debug_print('USBMS: finished adding metadata')
def delete_books(self, paths, end_session=True):
+ debug_print('USBMS: deleting %d books'%(len(paths)))
for i, path in enumerate(paths):
self.report_progress((i+1) / float(len(paths)), _('Removing books from device...'))
path = self.normalize_path(path)
@@ -240,8 +259,11 @@ class USBMS(CLI, Device):
except:
pass
self.report_progress(1.0, _('Removing books from device...'))
+ debug_print('USBMS: finished deleting %d books'%(len(paths)))
def remove_books_from_metadata(self, paths, booklists):
+ debug_print('USBMS: removing metadata for %d books'%(len(paths)))
+
for i, path in enumerate(paths):
self.report_progress((i+1) / float(len(paths)), _('Removing books from device metadata listing...'))
for bl in booklists:
@@ -249,8 +271,11 @@ class USBMS(CLI, Device):
if path.endswith(book.path):
bl.remove_book(book)
self.report_progress(1.0, _('Removing books from device metadata listing...'))
+ debug_print('USBMS: finished removing metadata for %d books'%(len(paths)))
def sync_booklists(self, booklists, end_session=True):
+ debug_print('USBMS: starting sync_booklists')
+
if not os.path.exists(self.normalize_path(self._main_prefix)):
os.makedirs(self.normalize_path(self._main_prefix))
@@ -267,6 +292,7 @@ class USBMS(CLI, Device):
write_prefix(self._card_b_prefix, 2)
self.report_progress(1.0, _('Sending metadata to device...'))
+ debug_print('USBMS: finished sync_booklists')
@classmethod
def path_to_unicode(cls, path):
diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py
index 181d0c784b..378c585efb 100644
--- a/src/calibre/gui2/device.py
+++ b/src/calibre/gui2/device.py
@@ -1,6 +1,8 @@
from __future__ import with_statement
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal '
+
+# Imports {{{
import os, traceback, Queue, time, socket, cStringIO, re
from threading import Thread, RLock
from itertools import repeat
@@ -27,7 +29,9 @@ from calibre.utils.smtp import compose_mail, sendmail, extract_email_address, \
config as email_config
from calibre.devices.folder_device.driver import FOLDER_DEVICE
-class DeviceJob(BaseJob):
+# }}}
+
+class DeviceJob(BaseJob): # {{{
def __init__(self, func, done, job_manager, args=[], kwargs={},
description=''):
@@ -78,8 +82,9 @@ class DeviceJob(BaseJob):
def log_file(self):
return cStringIO.StringIO(self._details.encode('utf-8'))
+ # }}}
-class DeviceManager(Thread):
+class DeviceManager(Thread): # {{{
def __init__(self, connected_slot, job_manager, open_feedback_slot, sleep_time=2):
'''
@@ -122,7 +127,7 @@ class DeviceManager(Thread):
try:
dev.open()
except:
- print 'Unable to open device', dev
+ prints('Unable to open device', str(dev))
traceback.print_exc()
continue
self.connected_device = dev
@@ -168,11 +173,11 @@ class DeviceManager(Thread):
if possibly_connected_devices:
if not self.do_connect(possibly_connected_devices,
is_folder_device=False):
- print 'Connect to device failed, retrying in 5 seconds...'
+ prints('Connect to device failed, retrying in 5 seconds...')
time.sleep(5)
if not self.do_connect(possibly_connected_devices,
is_folder_device=False):
- print 'Device connect failed again, giving up'
+ prints('Device connect failed again, giving up')
def umount_device(self, *args):
if self.is_device_connected and not self.job_manager.has_device_jobs():
@@ -317,7 +322,7 @@ class DeviceManager(Thread):
def _save_books(self, paths, target):
'''Copy books from device to disk'''
for path in paths:
- name = path.rpartition(getattr(self.device, 'path_sep', '/'))[2]
+ name = path.rpartition(os.sep)[2]
dest = os.path.join(target, name)
if os.path.abspath(dest) != os.path.abspath(path):
f = open(dest, 'wb')
@@ -338,8 +343,9 @@ class DeviceManager(Thread):
return self.create_job(self._view_book, done, args=[path, target],
description=_('View book on device'))
+ # }}}
-class DeviceAction(QAction):
+class DeviceAction(QAction): # {{{
a_s = pyqtSignal(object)
@@ -356,9 +362,9 @@ class DeviceAction(QAction):
def __repr__(self):
return self.__class__.__name__ + ':%s:%s:%s'%(self.dest, self.delete,
self.specific)
+ # }}}
-
-class DeviceMenu(QMenu):
+class DeviceMenu(QMenu): # {{{
fetch_annotations = pyqtSignal()
connect_to_folder = pyqtSignal()
@@ -532,8 +538,9 @@ class DeviceMenu(QMenu):
annot_enable = enable and getattr(device, 'SUPPORTS_ANNOTATIONS', False)
self.annotation_action.setEnabled(annot_enable)
+ # }}}
-class Emailer(Thread):
+class Emailer(Thread): # {{{
def __init__(self, timeout=60):
Thread.__init__(self)
@@ -590,6 +597,7 @@ class Emailer(Thread):
results.append([jobname, e, traceback.format_exc()])
callback(results)
+ # }}}
class DeviceGUI(object):
@@ -637,7 +645,7 @@ class DeviceGUI(object):
if not ids or len(ids) == 0:
return
files, _auto_ids = self.library_view.model().get_preferred_formats_from_ids(ids,
- fmts, paths=True, set_metadata=True,
+ fmts, set_metadata=True,
specific_format=specific_format,
exclude_auto=do_auto_convert)
if do_auto_convert:
@@ -647,7 +655,6 @@ class DeviceGUI(object):
_auto_ids = []
full_metadata = self.library_view.model().metadata_for(ids)
- files = [getattr(f, 'name', None) for f in files]
bad, remove_ids, jobnames = [], [], []
texts, subjects, attachments, attachment_names = [], [], [], []
@@ -760,7 +767,7 @@ class DeviceGUI(object):
for account, fmts in accounts:
files, auto = self.library_view.model().\
get_preferred_formats_from_ids([id], fmts)
- files = [f.name for f in files if f is not None]
+ files = [f for f in files if f is not None]
if not files:
continue
attachment = files[0]
@@ -824,7 +831,7 @@ class DeviceGUI(object):
prefix = prefix.decode(preferred_encoding, 'replace')
prefix = ascii_filename(prefix)
names.append('%s_%d%s'%(prefix, id,
- os.path.splitext(f.name)[1]))
+ os.path.splitext(f)[1]))
if mi.cover and os.access(mi.cover, os.R_OK):
mi.thumbnail = self.cover_to_thumbnail(open(mi.cover,
'rb').read())
@@ -837,7 +844,7 @@ class DeviceGUI(object):
on_card = space.get(sorted(space.keys(), reverse=True)[0], None)
self.upload_books(files, names, metadata,
on_card=on_card,
- memory=[[f.name for f in files], remove])
+ memory=[files, remove])
self.status_bar.showMessage(_('Sending catalogs to device.'), 5000)
@@ -884,7 +891,7 @@ class DeviceGUI(object):
prefix = prefix.decode(preferred_encoding, 'replace')
prefix = ascii_filename(prefix)
names.append('%s_%d%s'%(prefix, id,
- os.path.splitext(f.name)[1]))
+ os.path.splitext(f)[1]))
if mi.cover and os.access(mi.cover, os.R_OK):
mi.thumbnail = self.cover_to_thumbnail(open(mi.cover,
'rb').read())
@@ -898,7 +905,7 @@ class DeviceGUI(object):
on_card = space.get(sorted(space.keys(), reverse=True)[0], None)
self.upload_books(files, names, metadata,
on_card=on_card,
- memory=[[f.name for f in files], remove])
+ memory=[files, remove])
self.status_bar.showMessage(_('Sending news to device.'), 5000)
@@ -914,7 +921,7 @@ class DeviceGUI(object):
_files, _auto_ids = self.library_view.model().get_preferred_formats_from_ids(ids,
settings.format_map,
- paths=True, set_metadata=True,
+ set_metadata=True,
specific_format=specific_format,
exclude_auto=do_auto_convert)
if do_auto_convert:
@@ -930,9 +937,8 @@ class DeviceGUI(object):
mi.thumbnail = self.cover_to_thumbnail(open(mi.cover, 'rb').read())
imetadata = iter(metadata)
- files = [getattr(f, 'name', None) for f in _files]
bad, good, gf, names, remove_ids = [], [], [], [], []
- for f in files:
+ for f in _files:
mi = imetadata.next()
id = ids.next()
if f is None:
diff --git a/src/calibre/gui2/device_drivers/configwidget.py b/src/calibre/gui2/device_drivers/configwidget.py
index d1cebcb81d..585eed30df 100644
--- a/src/calibre/gui2/device_drivers/configwidget.py
+++ b/src/calibre/gui2/device_drivers/configwidget.py
@@ -38,9 +38,10 @@ class ConfigWidget(QWidget, Ui_ConfigWidget):
self.opt_read_metadata.setChecked(self.settings.read_metadata)
else:
self.opt_read_metadata.hide()
- if extra_customization_message and settings.extra_customization:
+ if extra_customization_message:
self.extra_customization_label.setText(extra_customization_message)
- self.opt_extra_customization.setText(settings.extra_customization)
+ if settings.extra_customization:
+ self.opt_extra_customization.setText(settings.extra_customization)
else:
self.extra_customization_label.setVisible(False)
self.opt_extra_customization.setVisible(False)
diff --git a/src/calibre/gui2/dialogs/config/__init__.py b/src/calibre/gui2/dialogs/config/__init__.py
index 5d855b5263..b9c57b27ab 100644
--- a/src/calibre/gui2/dialogs/config/__init__.py
+++ b/src/calibre/gui2/dialogs/config/__init__.py
@@ -445,6 +445,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog):
self.username.setText(opts.username)
self.password.setText(opts.password if opts.password else '')
self.opt_max_opds_items.setValue(opts.max_opds_items)
+ self.opt_max_opds_ungrouped_items.setValue(opts.max_opds_ungrouped_items)
self.auto_launch.setChecked(config['autolaunch_server'])
self.systray_icon.setChecked(config['systray_icon'])
self.sync_news.setChecked(config['upload_news_to_device'])
@@ -848,6 +849,8 @@ class ConfigDialog(ResizableDialog, Ui_Dialog):
sc.set('port', self.port.value())
sc.set('max_cover', mcs)
sc.set('max_opds_items', self.opt_max_opds_items.value())
+ sc.set('max_opds_ungrouped_items',
+ self.opt_max_opds_ungrouped_items.value())
config['delete_news_from_library_on_upload'] = self.delete_news.isChecked()
config['upload_news_to_device'] = self.sync_news.isChecked()
config['search_as_you_type'] = self.search_as_you_type.isChecked()
diff --git a/src/calibre/gui2/dialogs/config/config.ui b/src/calibre/gui2/dialogs/config/config.ui
index db748dae7e..917333a989 100644
--- a/src/calibre/gui2/dialogs/config/config.ui
+++ b/src/calibre/gui2/dialogs/config/config.ui
@@ -892,6 +892,26 @@
+ -
+
+
+ 25
+
+
+ 1000000
+
+
+
+ -
+
+
+ Max. OPDS &ungrouped items:
+
+
+ opt_max_opds_ungrouped_items
+
+
+
-
diff --git a/src/calibre/gui2/dialogs/config/create_custom_column.py b/src/calibre/gui2/dialogs/config/create_custom_column.py
index 3d5cb8ba53..a66b7b6642 100644
--- a/src/calibre/gui2/dialogs/config/create_custom_column.py
+++ b/src/calibre/gui2/dialogs/config/create_custom_column.py
@@ -3,6 +3,7 @@ __copyright__ = '2010, Kovid Goyal '
'''Dialog to create a new custom column'''
+import re
from functools import partial
from PyQt4.QtCore import SIGNAL
@@ -94,8 +95,8 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn):
col = unicode(self.column_name_box.text()).lower()
if not col:
return self.simple_error('', _('No lookup name was provided'))
- if not col.isalnum() or not col[0].isalpha():
- return self.simple_error('', _('The label must contain only letters and digits, and start with a letter'))
+ if re.match('^\w*$', col) is None or not col[0].isalpha():
+ return self.simple_error('', _('The label must contain only letters, digits and underscores, and start with a letter'))
col_heading = unicode(self.column_heading_box.text())
col_type = self.column_types[self.column_type_box.currentIndex()]['datatype']
if col_type == '*text':
diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py
index 1ea6743ae2..0241e1b542 100644
--- a/src/calibre/gui2/dialogs/metadata_single.py
+++ b/src/calibre/gui2/dialogs/metadata_single.py
@@ -403,12 +403,14 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
ag = QCoreApplication.instance().desktop().availableGeometry(self)
self.cover.MAX_HEIGHT = ag.height()-(25 if (islinux or isfreebsd) else 0)-height_of_rest
self.cover.MAX_WIDTH = ag.width()-(25 if (islinux or isfreebsd) else 0)-width_of_rest
+ pm = QPixmap()
if cover:
- pm = QPixmap()
pm.loadFromData(cover)
- if not pm.isNull():
- self.cover.setPixmap(pm)
+ if pm.isNull():
+ pm = QPixmap(I('book.svg'))
+ else:
self.cover_data = cover
+ self.cover.setPixmap(pm)
self.original_series_name = unicode(self.series.text()).strip()
if len(db.custom_column_label_map) == 0:
self.central_widget.tabBar().setVisible(False)
diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py
index 48ce5bbc45..abd80aaa8f 100644
--- a/src/calibre/gui2/library/models.py
+++ b/src/calibre/gui2/library/models.py
@@ -21,7 +21,8 @@ from calibre.utils.date import dt_factory, qt_to_dt, isoformat
from calibre.ebooks.metadata.meta import set_metadata as _set_metadata
from calibre.utils.search_query_parser import SearchQueryParser
from calibre.library.caches import _match, CONTAINS_MATCH, EQUALS_MATCH, REGEXP_MATCH
-from calibre import strftime
+from calibre import strftime, isbytestring
+from calibre.constants import filesystem_encoding
from calibre.gui2.library import DEFAULT_SORT
def human_readable(size, precision=1):
@@ -33,6 +34,13 @@ TIME_FMT = '%d %b %Y'
ALIGNMENT_MAP = {'left': Qt.AlignLeft, 'right': Qt.AlignRight, 'center':
Qt.AlignHCenter}
+class FormatPath(unicode):
+
+ def __new__(cls, path, orig_file_path):
+ ans = unicode.__new__(cls, path)
+ ans.orig_file_path = orig_file_path
+ return ans
+
class BooksModel(QAbstractTableModel): # {{{
about_to_be_sorted = pyqtSignal(object, name='aboutToBeSorted')
@@ -213,7 +221,7 @@ class BooksModel(QAbstractTableModel): # {{{
self.endInsertRows()
self.count_changed()
- def search(self, text, refinement, reset=True):
+ def search(self, text, reset=True):
try:
self.db.search(text)
except ParseException:
@@ -224,9 +232,10 @@ class BooksModel(QAbstractTableModel): # {{{
self.clear_caches()
self.reset()
if self.last_search:
+ # Do not issue search done for the null search. It is used to clear
+ # the search and count records for restrictions
self.searched.emit(True)
-
def sort(self, col, order, reset=True):
if not self.db:
return
@@ -257,7 +266,7 @@ class BooksModel(QAbstractTableModel): # {{{
self.sort(col, self.sorted_on[1], reset=reset)
def research(self, reset=True):
- self.search(self.last_search, False, reset=reset)
+ self.search(self.last_search, reset=reset)
def columnCount(self, parent):
if parent and parent.isValid():
@@ -378,7 +387,7 @@ class BooksModel(QAbstractTableModel): # {{{
else:
return metadata
- def get_preferred_formats_from_ids(self, ids, formats, paths=False,
+ def get_preferred_formats_from_ids(self, ids, formats,
set_metadata=False, specific_format=None,
exclude_auto=False, mode='r+b'):
ans = []
@@ -403,12 +412,20 @@ class BooksModel(QAbstractTableModel): # {{{
as_file=True)) as src:
shutil.copyfileobj(src, pt)
pt.flush()
+ if getattr(src, 'name', None):
+ pt.orig_file_path = os.path.abspath(src.name)
pt.seek(0)
if set_metadata:
_set_metadata(pt, self.db.get_metadata(id, get_cover=True, index_is_id=True),
format)
- pt.close() if paths else pt.seek(0)
- ans.append(pt)
+ pt.close()
+ def to_uni(x):
+ if isbytestring(x):
+ x = x.decode(filesystem_encoding)
+ return x
+ name, op = map(to_uni, map(os.path.abspath, (pt.name,
+ pt.orig_file_path)))
+ ans.append(FormatPath(name, op))
else:
need_auto.append(id)
if not exclude_auto:
@@ -730,6 +747,8 @@ class BooksModel(QAbstractTableModel): # {{{
def set_search_restriction(self, s):
self.db.data.set_search_restriction(s)
+ self.search('')
+ return self.rowCount(None)
# }}}
@@ -874,7 +893,7 @@ class DeviceBooksModel(BooksModel): # {{{
return flags
- def search(self, text, refinement, reset=True):
+ def search(self, text, reset=True):
if not text or not text.strip():
self.map = list(range(len(self.db)))
else:
@@ -1086,7 +1105,6 @@ class DeviceBooksModel(BooksModel): # {{{
idx = self.map[row]
if cname == 'title' :
self.db[idx].title = val
- self.db[idx].title_sorter = val
elif cname == 'authors':
self.db[idx].authors = string_to_authors(val)
elif cname == 'collections':
diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py
index eb9ffe6258..109b001925 100644
--- a/src/calibre/gui2/library/views.py
+++ b/src/calibre/gui2/library/views.py
@@ -426,6 +426,14 @@ class BooksView(QTableView): # {{{
if dy != 0:
self.column_header.update()
+ def scroll_to_row(self, row):
+ if row > -1:
+ h = self.horizontalHeader()
+ for i in range(h.count()):
+ if not h.isSectionHidden(i):
+ self.scrollTo(self.model().index(row, i))
+ break
+
def close(self):
self._model.close()
@@ -437,10 +445,6 @@ class BooksView(QTableView): # {{{
self._search_done = search_done
self._model.searched.connect(self.search_done)
- def connect_to_restriction_set(self, tv):
- # must be synchronous (not queued)
- tv.restriction_set.connect(self._model.set_search_restriction)
-
def connect_to_book_display(self, bd):
self._model.new_bookdisplay_data.connect(bd)
diff --git a/src/calibre/gui2/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py
index 2b76ab0fea..87ec55e114 100644
--- a/src/calibre/gui2/lrf_renderer/main.py
+++ b/src/calibre/gui2/lrf_renderer/main.py
@@ -152,7 +152,7 @@ class Main(MainWindow, Ui_MainWindow):
self.stack.setCurrentIndex(1)
self.renderer.start()
- def find(self, search, refinement):
+ def find(self, search):
self.last_search = search
try:
self.document.search(search)
diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py
index 29ae1875c8..ba40c0c92b 100644
--- a/src/calibre/gui2/main.py
+++ b/src/calibre/gui2/main.py
@@ -226,7 +226,7 @@ class GuiRunner(QObject):
self.splash_pixmap = QPixmap()
self.splash_pixmap.load(I('library.png'))
self.splash_screen = QSplashScreen(self.splash_pixmap,
- Qt.SplashScreen|Qt.WindowStaysOnTopHint)
+ Qt.SplashScreen)
self.splash_screen.showMessage(_('Starting %s: Loading books...') %
__appname__)
self.splash_screen.show()
diff --git a/src/calibre/gui2/main.ui b/src/calibre/gui2/main.ui
index 8c1d1bf787..b4bafc3b79 100644
--- a/src/calibre/gui2/main.ui
+++ b/src/calibre/gui2/main.ui
@@ -28,7 +28,7 @@
:/images/library.png:/images/library.png
-
+
-
-
@@ -305,78 +305,79 @@
-
-
-
-
-
-
-
- 0
- 100
-
-
-
- Qt::Vertical
-
-
-
-
- 100
- 100
-
-
-
- 0
-
-
-
-
-
-
-
- Qt::Horizontal
-
-
-
-
-
-
-
- true
-
-
- true
-
-
- true
-
-
- true
-
-
-
- -
+
+
+
+ 0
+ 100
+
+
+
+ Qt::Vertical
+
+
+
+
-
+
+
+
+ 100
+ 100
+
+
+
+ 0
+
+
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+
-
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+
+ -
Sort by &popularity
-
- -
-
-
- 0
-
-
-
-
- Match any
+
+ -
+
+
+ 0
-
- -
-
- Match all
-
-
-
-
- -
+
-
+
+ Match any
+
+
+ -
+
+ Match all
+
+
+
+
+ -
Create, edit, and delete user categories
@@ -385,10 +386,55 @@
Manage &user categories
-
-
+
+
+
+
+
+ -
+
+
+
+ 100
+ 10
+
+
+
+ true
+
+
+ true
+
+
+ false
+
+
+ QAbstractItemView::DragDrop
+
+
+ true
+
+
+ QAbstractItemView::SelectRows
+
+
+ false
+
+
+ false
+
+
+
+
+
-
+
+
+
+
+
+ -
+
100
@@ -420,139 +466,107 @@
false
-
-
-
+
+
+
+
+
+ -
+
+
+
+ 10
+ 10
+
+
+
+ true
+
+
+ true
+
+
+ false
+
+
+ QAbstractItemView::DragDrop
+
+
+ true
+
+
+ QAbstractItemView::SelectRows
+
+
+ false
+
+
+ false
+
+
+
+
+
+
+
+ -
+
+
+
+ 10
+ 10
+
+
+
+ true
+
+
+ true
+
+
+ false
+
+
+ QAbstractItemView::DragDrop
+
+
+ true
+
+
+ QAbstractItemView::SelectRows
+
+
+ false
+
+
+ false
+
+
+
+
+
-
-
- -
-
-
-
- 100
- 10
-
-
-
- true
-
-
- true
-
-
- false
-
-
- QAbstractItemView::DragDrop
-
-
- true
-
-
- QAbstractItemView::SelectRows
-
-
- false
-
-
- false
-
-
-
-
+
+ -
+
-
-
-
-
-
-
-
- 10
- 10
-
-
-
- true
-
-
- true
-
-
- false
-
-
- QAbstractItemView::DragDrop
-
-
- true
-
-
- QAbstractItemView::SelectRows
-
-
- false
-
-
- false
-
-
-
-
-
-
-
- -
-
-
-
- 10
- 10
-
-
-
- true
-
-
- true
-
-
- false
-
-
- QAbstractItemView::DragDrop
-
-
- true
-
-
- QAbstractItemView::SelectRows
-
-
- false
-
-
- false
-
-
-
-
-
-
-
-
-
- -
-
-
-
+
+
+
+
+
diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py
index d3059992bc..4e9ccc2900 100644
--- a/src/calibre/gui2/search_box.py
+++ b/src/calibre/gui2/search_box.py
@@ -57,7 +57,7 @@ class SearchBox2(QComboBox):
INTERVAL = 1500 #: Time to wait before emitting search signal
MAX_COUNT = 25
- search = pyqtSignal(object, object)
+ search = pyqtSignal(object)
def __init__(self, parent=None):
QComboBox.__init__(self, parent)
@@ -97,8 +97,12 @@ class SearchBox2(QComboBox):
self.help_state = False
def clear_to_help(self):
+ self.search.emit('')
self._in_a_search = False
self.setEditText(self.help_text)
+ if self.timer is not None: # Turn off any timers that got started in setEditText
+ self.killTimer(self.timer)
+ self.timer = None
self.line_edit.home(False)
self.help_state = True
self.line_edit.setStyleSheet(
@@ -111,7 +115,6 @@ class SearchBox2(QComboBox):
def clear(self):
self.clear_to_help()
- self.search.emit('', False)
def search_done(self, ok):
if not unicode(self.currentText()).strip():
@@ -155,9 +158,8 @@ class SearchBox2(QComboBox):
if not text or text == self.help_text:
return self.clear()
self.help_state = False
- refinement = text.startswith(self.prev_search) and ':' not in text
self.prev_search = text
- self.search.emit(text, refinement)
+ self.search.emit(text)
idx = self.findText(text, Qt.MatchFixedString)
self.block_signals(True)
@@ -187,12 +189,15 @@ class SearchBox2(QComboBox):
self.set_search_string(joiner.join(tags))
def set_search_string(self, txt):
+ if not txt:
+ self.clear_to_help()
+ return
self.normalize_state()
self.setEditText(txt)
if self.timer is not None: # Turn off any timers that got started in setEditText
self.killTimer(self.timer)
self.timer = None
- self.search.emit(txt, False)
+ self.search.emit(txt)
self.line_edit.end(False)
self.initial_state = False
diff --git a/src/calibre/gui2/status.py b/src/calibre/gui2/status.py
index 2759c4074b..14c6131fb8 100644
--- a/src/calibre/gui2/status.py
+++ b/src/calibre/gui2/status.py
@@ -52,10 +52,7 @@ class BookInfoDisplay(QWidget):
QLabel.__init__(self)
self.setMaximumWidth(81)
self.setMaximumHeight(108)
- self.default_pixmap = QPixmap(coverpath).scaled(self.maximumWidth(),
- self.maximumHeight(),
- Qt.IgnoreAspectRatio,
- Qt.SmoothTransformation)
+ self.default_pixmap = QPixmap(coverpath)
self.setScaledContents(True)
self.statusbar_height = 120
self.setPixmap(self.default_pixmap)
diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py
index 80f6bfa264..e8f3068d35 100644
--- a/src/calibre/gui2/tag_view.py
+++ b/src/calibre/gui2/tag_view.py
@@ -22,7 +22,6 @@ from calibre.gui2 import error_dialog
class TagsView(QTreeView): # {{{
refresh_required = pyqtSignal()
- restriction_set = pyqtSignal(object)
tags_marked = pyqtSignal(object, object)
user_category_edit = pyqtSignal(object)
tag_list_edit = pyqtSignal(object, object)
@@ -37,24 +36,23 @@ class TagsView(QTreeView): # {{{
self.setIconSize(QSize(30, 30))
self.tag_match = None
- def set_database(self, db, tag_match, popularity, restriction):
+ def set_database(self, db, tag_match, popularity):
self.hidden_categories = config['tag_browser_hidden_categories']
self._model = TagsModel(db, parent=self,
- hidden_categories=self.hidden_categories)
+ hidden_categories=self.hidden_categories,
+ search_restriction=None)
self.popularity = popularity
- self.restriction = restriction
self.tag_match = tag_match
self.db = db
+ self.search_restriction = None
self.setModel(self._model)
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.clicked.connect(self.toggle)
self.customContextMenuRequested.connect(self.show_context_menu)
self.popularity.setChecked(config['sort_by_popularity'])
self.popularity.stateChanged.connect(self.sort_changed)
- self.restriction.activated[str].connect(self.search_restriction_set)
self.refresh_required.connect(self.recount, type=Qt.QueuedConnection)
db.add_listener(self.database_changed)
- self.saved_searches_changed(recount=False)
def database_changed(self, event, ids):
self.refresh_required.emit()
@@ -65,19 +63,14 @@ class TagsView(QTreeView): # {{{
def sort_changed(self, state):
config.set('sort_by_popularity', state == Qt.Checked)
- self.model().refresh()
- # self.search_restriction_set()
+ self.recount()
- def search_restriction_set(self, s):
- self.clear()
- if len(s) == 0:
- self.search_restriction = ''
+ def set_search_restriction(self, s):
+ if s:
+ self.search_restriction = s
else:
- self.search_restriction = 'search:"%s"' % unicode(s).strip()
- self.model().set_search_restriction(self.search_restriction)
- self.restriction_set.emit(self.search_restriction)
- self.recount() # Must happen after the emission of the restriction_set signal
- self.tags_marked.emit(self._model.tokens(), self.match_all)
+ self.search_restriction = None
+ self.set_new_model()
def mouseReleaseEvent(self, event):
# Swallow everything except leftButton so context menus work correctly
@@ -144,7 +137,8 @@ class TagsView(QTreeView): # {{{
# the possibility of renaming that item
if tag_name and \
(key in ['authors', 'tags', 'series', 'publisher', 'search'] or \
- self.db.field_metadata[key]['is_custom']):
+ self.db.field_metadata[key]['is_custom'] and \
+ self.db.field_metadata[key]['datatype'] != 'rating'):
self.context_menu.addAction(_('Rename') + " '" + tag_name + "'",
partial(self.context_menu_handler, action='edit_item',
category=tag_item, index=index))
@@ -187,29 +181,24 @@ class TagsView(QTreeView): # {{{
return True
def clear(self):
- self.model().clear_state()
+ if self.model():
+ self.model().clear_state()
- def saved_searches_changed(self, recount=True):
- p = prefs['saved_searches'].keys()
- p.sort()
- t = self.restriction.currentText()
- self.restriction.clear() # rebuild the restrictions combobox using current saved searches
- self.restriction.addItem('')
- for s in p:
- self.restriction.addItem(s)
- if t in p: # redo the current restriction, if there was one
- self.restriction.setCurrentIndex(self.restriction.findText(t))
- self.search_restriction_set(t)
- if recount:
- self.recount()
+ def is_visible(self, idx):
+ item = idx.internalPointer()
+ if getattr(item, 'type', None) == TagTreeItem.TAG:
+ idx = idx.parent()
+ return self.isExpanded(idx)
def recount(self, *args):
ci = self.currentIndex()
if not ci.isValid():
ci = self.indexAt(QPoint(10, 10))
- path = self.model().path_for_index(ci)
+ path = self.model().path_for_index(ci) if self.is_visible(ci) else None
try:
- self.model().refresh()
+ if not self.model().refresh(): # categories changed!
+ self.set_new_model()
+ path = None
except: #Database connection could be closed if an integrity check is happening
pass
if path:
@@ -222,9 +211,16 @@ class TagsView(QTreeView): # {{{
# gone, or if columns have been hidden or restored, we must rebuild the
# model. Reason: it is much easier than reconstructing the browser tree.
def set_new_model(self):
- self._model = TagsModel(self.db, parent=self,
- hidden_categories=self.hidden_categories)
- self.setModel(self._model)
+ try:
+ self._model = TagsModel(self.db, parent=self,
+ hidden_categories=self.hidden_categories,
+ search_restriction=self.search_restriction)
+ self.setModel(self._model)
+ except:
+ # The DB must be gone. Set the model to None and hope that someone
+ # will call set_database later. I don't know if this in fact works
+ self._model = None
+ self.setModel(None)
# }}}
class TagTreeItem(object): # {{{
@@ -311,7 +307,7 @@ class TagTreeItem(object): # {{{
class TagsModel(QAbstractItemModel): # {{{
- def __init__(self, db, parent, hidden_categories=None):
+ def __init__(self, db, parent, hidden_categories=None, search_restriction=None):
QAbstractItemModel.__init__(self, parent)
# must do this here because 'QPixmap: Must construct a QApplication
@@ -333,20 +329,10 @@ class TagsModel(QAbstractItemModel): # {{{
self.db = db
self.tags_view = parent
self.hidden_categories = hidden_categories
- self.search_restriction = ''
- self.ignore_next_search = 0
-
- # Reconstruct the user categories, putting them into metadata
- tb_cats = self.db.field_metadata
- for k in tb_cats.keys():
- if tb_cats[k]['kind'] in ['user', 'search']:
- del tb_cats[k]
- for user_cat in sorted(prefs['user_categories'].keys()):
- cat_name = user_cat+':' # add the ':' to avoid name collision
- tb_cats.add_user_category(label=cat_name, name=user_cat)
- if len(saved_searches.names()):
- tb_cats.add_search_category(label='search', name=_('Searches'))
+ self.search_restriction = search_restriction
+ self.row_map = []
+ # get_node_tree cannot return None here, because row_map is empty
data = self.get_node_tree(config['sort_by_popularity'])
self.root_item = TagTreeItem()
for i, r in enumerate(self.row_map):
@@ -367,29 +353,44 @@ class TagsModel(QAbstractItemModel): # {{{
self.search_restriction = s
def get_node_tree(self, sort):
+ old_row_map = self.row_map[:]
self.row_map = []
self.categories = []
- if len(self.search_restriction):
- data = self.db.get_categories(sort_on_count=sort, icon_map=self.category_icon_map,
- ids=self.db.search(self.search_restriction, return_matches=True))
+ # Reconstruct the user categories, putting them into metadata
+ tb_cats = self.db.field_metadata
+ for k in tb_cats.keys():
+ if tb_cats[k]['kind'] in ['user', 'search']:
+ del tb_cats[k]
+ for user_cat in sorted(prefs['user_categories'].keys()):
+ cat_name = user_cat+':' # add the ':' to avoid name collision
+ tb_cats.add_user_category(label=cat_name, name=user_cat)
+ if len(saved_searches.names()):
+ tb_cats.add_search_category(label='search', name=_('Searches'))
+
+ # Now get the categories
+ if self.search_restriction:
+ data = self.db.get_categories(sort_on_count=sort,
+ icon_map=self.category_icon_map,
+ ids=self.db.search('', return_matches=True))
else:
data = self.db.get_categories(sort_on_count=sort, icon_map=self.category_icon_map)
tb_categories = self.db.field_metadata
- self.category_items = {}
for category in tb_categories:
- if category in data: # They should always be there, but ...
- # make a map of sets of names per category for duplicate
- # checking when editing
- self.category_items[category] = set([tag.name for tag in data[category]])
+ if category in data: # The search category can come and go
self.row_map.append(category)
self.categories.append(tb_categories[category]['name'])
-
+ if len(old_row_map) != 0 and len(old_row_map) != len(self.row_map):
+ # A category has been added or removed. We must force a rebuild of
+ # the model
+ return None
return data
def refresh(self):
data = self.get_node_tree(config['sort_by_popularity']) # get category data
+ if data is None:
+ return False
row_index = -1
for i, r in enumerate(self.row_map):
if self.hidden_categories and self.categories[i] in self.hidden_categories:
@@ -411,6 +412,7 @@ class TagsModel(QAbstractItemModel): # {{{
tag.state = state_map.get(tag.name, 0)
t = TagTreeItem(parent=category, data=tag, icon_map=self.icon_state_map)
self.endInsertRows()
+ return True
def columnCount(self, parent):
return 1
@@ -424,6 +426,8 @@ class TagsModel(QAbstractItemModel): # {{{
def setData(self, index, value, role=Qt.EditRole):
if not index.isValid():
return NONE
+ # set up to position at the category label
+ path = self.path_for_index(self.parent(index))
val = unicode(value.toString())
if not val:
error_dialog(self.tags_view, _('Item is blank'),
@@ -431,15 +435,14 @@ class TagsModel(QAbstractItemModel): # {{{
return False
item = index.internalPointer()
key = item.parent.category_key
- # make certain we know about the category
+ # make certain we know about the item's category
if key not in self.db.field_metadata:
return
- if val in self.category_items[key]:
- error_dialog(self.tags_view, 'Duplicate item',
- _('The name %s is already used.')%val).exec_()
- return False
- oldval = item.tag.name
if key == 'search':
+ if val in saved_searches.names():
+ error_dialog(self.tags_view, _('Duplicate search name'),
+ _('The saved search name %s is already used.')%val).exec_()
+ return False
saved_searches.rename(unicode(item.data(role).toString()), val)
self.tags_view.search_item_renamed.emit()
else:
@@ -456,10 +459,12 @@ class TagsModel(QAbstractItemModel): # {{{
label=self.db.field_metadata[key]['label'])
self.tags_view.tag_item_renamed.emit()
item.tag.name = val
- self.dataChanged.emit(index, index)
- # replace the old value in the duplicate detection map with the new one
- self.category_items[key].discard(oldval)
- self.category_items[key].add(val)
+ self.refresh() # Should work, because no categories can have disappeared
+ if path:
+ idx = self.index_for_path(path)
+ if idx.isValid():
+ self.tags_view.setCurrentIndex(idx)
+ self.tags_view.scrollTo(idx, QTreeView.PositionAtCenter)
return True
def headerData(self, *args):
@@ -544,12 +549,6 @@ class TagsModel(QAbstractItemModel): # {{{
def clear_state(self):
self.reset_all_states()
- def reinit(self, *args, **kwargs):
- if self.ignore_next_search == 0:
- self.reset_all_states()
- else:
- self.ignore_next_search -= 1
-
def toggle(self, index, exclusive):
if not index.isValid(): return False
item = index.internalPointer()
@@ -557,7 +556,6 @@ class TagsModel(QAbstractItemModel): # {{{
item.toggle()
if exclusive:
self.reset_all_states(except_=item.tag)
- self.ignore_next_search = 2
self.dataChanged.emit(index, index)
return True
return False
diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py
index 7546e461d6..af33b2e997 100644
--- a/src/calibre/gui2/ui.py
+++ b/src/calibre/gui2/ui.py
@@ -160,9 +160,9 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.restriction_in_effect = False
self.search.initialize('main_search_history', colorize=True,
help_text=_('Search (For Advanced Search click the button to the left)'))
- self.connect(self.clear_button, SIGNAL('clicked()'), self.search_clear)
+ self.connect(self.clear_button, SIGNAL('clicked()'), self.search.clear)
self.connect(self.clear_button, SIGNAL('clicked()'), self.saved_search.clear_to_help)
- self.search_clear()
+ self.search.clear()
self.saved_search.initialize(saved_searches, self.search, colorize=True,
help_text=_('Saved Searches'))
@@ -226,14 +226,14 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.connect(self.quit_action, SIGNAL('triggered(bool)'), self.quit)
self.connect(self.donate_action, SIGNAL('triggered(bool)'), self.donate)
self.connect(self.restore_action, SIGNAL('triggered()'),
- self.show_windows)
+ self.show_windows)
self.connect(self.action_show_book_details,
- SIGNAL('triggered(bool)'), self.show_book_info)
+ SIGNAL('triggered(bool)'), self.show_book_info)
self.connect(self.action_restart, SIGNAL('triggered()'),
self.restart)
self.connect(self.system_tray_icon,
- SIGNAL('activated(QSystemTrayIcon::ActivationReason)'),
- self.system_tray_icon_activated)
+ SIGNAL('activated(QSystemTrayIcon::ActivationReason)'),
+ self.system_tray_icon_activated)
self.tool_bar.contextMenuEvent = self.no_op
####################### Start spare job server ########################
@@ -521,8 +521,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.search_done)),
('connect_to_book_display',
(self.status_bar.book_info.show_data,)),
- ('connect_to_restriction_set',
- (self.tags_view,)),
]:
for view in (self.library_view, self.memory_view, self.card_a_view, self.card_b_view):
getattr(view, func)(*args)
@@ -545,24 +543,22 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.cover_cache.start()
self.library_view.model().cover_cache = self.cover_cache
self.connect(self.edit_categories, SIGNAL('clicked()'), self.do_user_categories_edit)
- self.tags_view.set_database(db, self.tag_match, self.popularity, self.search_restriction)
+ self.search_restriction.activated[str].connect(self.apply_search_restriction)
+ self.tags_view.set_database(db, self.tag_match, self.popularity)
self.tags_view.tags_marked.connect(self.search.search_from_tags)
- for x in (self.saved_search.clear_to_help, self.mark_restriction_set):
- self.tags_view.restriction_set.connect(x)
self.tags_view.tags_marked.connect(self.saved_search.clear_to_help)
self.tags_view.tag_list_edit.connect(self.do_tags_list_edit)
self.tags_view.user_category_edit.connect(self.do_user_categories_edit)
self.tags_view.saved_search_edit.connect(self.do_saved_search_edit)
self.tags_view.tag_item_renamed.connect(self.do_tag_item_renamed)
self.tags_view.search_item_renamed.connect(self.saved_search.clear_to_help)
- self.search.search.connect(self.tags_view.model().reinit)
for x in (self.location_view.count_changed, self.tags_view.recount,
self.restriction_count_changed):
self.library_view.model().count_changed_signal.connect(x)
self.connect(self.search, SIGNAL('cleared()'), self.search_box_cleared)
- self.connect(self.saved_search, SIGNAL('changed()'),
- self.tags_view.saved_searches_changed, Qt.QueuedConnection)
+ self.connect(self.saved_search, SIGNAL('changed()'), self.saved_searches_changed)
+ self.saved_searches_changed()
if not gprefs.get('quick_start_guide_added', False):
from calibre.ebooks.metadata import MetaInformation
mi = MetaInformation(_('Calibre Quick Start Guide'), ['John Schember'])
@@ -585,7 +581,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.search_restriction.setSizeAdjustPolicy(self.search_restriction.AdjustToMinimumContentsLengthWithIcon)
self.search_restriction.setMinimumContentsLength(10)
-
########################### Cover Flow ################################
self.cover_flow = None
if CoverFlow is not None:
@@ -602,7 +597,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.cover_flow = CoverFlow(height=cfh, text_height=text_height)
self.cover_flow.setVisible(False)
if not config['separate_cover_flow']:
- self.library.layout().addWidget(self.cover_flow)
+ self.cb_layout.addWidget(self.cover_flow)
self.cover_flow.currentChanged.connect(self.sync_listview_to_cf)
self.library_view.selectionModel().currentRowChanged.connect(
self.sync_cf_to_listview)
@@ -625,7 +620,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.sidebar.job_done, Qt.QueuedConnection)
-
if config['autolaunch_server']:
from calibre.library.server.main import start_threaded_server
from calibre.library.server import server_config
@@ -644,7 +638,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.connect(self.scheduler,
SIGNAL('start_recipe_fetch(PyQt_PyObject)'),
self.download_scheduled_recipe, Qt.QueuedConnection)
- self.library_view.verticalHeader().sectionClicked.connect(self.view_specific_book)
for view in ('library', 'memory', 'card_a', 'card_b'):
view = getattr(self, view+'_view')
@@ -683,7 +676,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
d = SavedSearchEditor(self, search)
d.exec_()
if d.result() == d.Accepted:
- self.tags_view.saved_searches_changed(recount=True)
+ self.saved_searches_changed()
self.saved_search.clear_to_help()
def resizeEvent(self, ev):
@@ -807,7 +800,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
d.layout().addWidget(self.cover_flow)
self.cover_flow.setVisible(True)
self.cover_flow.setFocus(Qt.OtherFocusReason)
- self.library_view.scrollTo(self.library_view.currentIndex())
+ self.library_view.scroll_to_row(self.library_view.currentIndex().row())
d.show()
d.finished.connect(self.sidebar.external_cover_flow_finished)
self.cf_dialog = d
@@ -831,7 +824,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.library_view.currentIndex())
self.cover_flow.setVisible(True)
self.cover_flow.setFocus(Qt.OtherFocusReason)
- self.library_view.scrollTo(self.library_view.currentIndex())
+ self.library_view.scroll_to_row(self.library_view.currentIndex().row())
self.cover_flow_sync_timer.start(500)
else:
self.cover_flow_sync_timer.stop()
@@ -842,19 +835,11 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
sm.select(idx, sm.ClearAndSelect|sm.Rows)
self.library_view.setCurrentIndex(idx)
-
-
'''
- Handling of the count of books in a restricted view requires that
- we capture the count after the initial restriction search. To so this,
- we require that the restriction_set signal be issued before the search signal,
- so that when the search_done happens and the count is displayed,
- we can grab the count. This works because the search box is cleared
- when a restriction is set, so that first search will find all books.
-
- Adding and deleting books creates another complexity. When added, they are
- displayed regardless of whether they match the restriction. However, if they
- do not, they are removed at the next search. The counts must take this
+ Restrictions.
+ Adding and deleting books creates a complexity. When added, they are
+ displayed regardless of whether they match a search restriction. However, if
+ they do not, they are removed at the next search. The counts must take this
behavior into effect.
'''
@@ -862,15 +847,25 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.restriction_count_of_books_in_view += c - self.restriction_count_of_books_in_library
self.restriction_count_of_books_in_library = c
if self.restriction_in_effect:
- self.set_number_of_books_shown(compute_count=False)
+ self.set_number_of_books_shown()
- def mark_restriction_set(self, r):
- self.restriction_in_effect = False if r is None or not r else True
+ def apply_search_restriction(self, r):
+ r = unicode(r)
+ if r is not None and r != '':
+ self.restriction_in_effect = True
+ restriction = 'search:"%s"'%(r)
+ else:
+ self.restriction_in_effect = False
+ restriction = ''
+ self.restriction_count_of_books_in_view = \
+ self.library_view.model().set_search_restriction(restriction)
+ self.search.clear_to_help()
+ self.saved_search.clear_to_help()
+ self.tags_view.set_search_restriction(restriction)
+ self.set_number_of_books_shown()
- def set_number_of_books_shown(self, compute_count):
+ def set_number_of_books_shown(self):
if self.current_view() == self.library_view and self.restriction_in_effect:
- if compute_count:
- self.restriction_count_of_books_in_view = self.current_view().row_count()
t = _("({0} of {1})").format(self.current_view().row_count(),
self.restriction_count_of_books_in_view)
self.search_count.setStyleSheet('QLabel { border-radius: 8px; background-color: yellow; }')
@@ -884,18 +879,31 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.search_count.setText(t)
def search_box_cleared(self):
- self.set_number_of_books_shown(compute_count=True)
self.tags_view.clear()
self.saved_search.clear_to_help()
-
- def search_clear(self):
- self.set_number_of_books_shown(compute_count=True)
- self.search.clear()
+ self.set_number_of_books_shown()
def search_done(self, view, ok):
if view is self.current_view():
self.search.search_done(ok)
- self.set_number_of_books_shown(compute_count=False)
+ self.set_number_of_books_shown()
+
+ def saved_searches_changed(self):
+ p = prefs['saved_searches'].keys()
+ p.sort()
+ t = unicode(self.search_restriction.currentText())
+ self.search_restriction.clear() # rebuild the restrictions combobox using current saved searches
+ self.search_restriction.addItem('')
+ self.tags_view.recount()
+ for s in p:
+ self.search_restriction.addItem(s)
+ if t:
+ if t in p: # redo the current restriction, if there was one
+ self.search_restriction.setCurrentIndex(self.search_restriction.findText(t))
+ # self.tags_view.set_search_restriction(t)
+ else:
+ self.search_restriction.setCurrentIndex(0)
+ self.apply_search_restriction('')
def sync_cf_to_listview(self, current, previous):
if self.cover_flow_sync_flag and self.cover_flow.isVisible() and \
@@ -914,6 +922,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
index = m.index(row, 0)
if self.library_view.currentIndex().row() != row and index.isValid():
self.cover_flow_sync_flag = False
+ self.library_view.scroll_to_row(index.row())
sm = self.library_view.selectionModel()
sm.select(index, sm.ClearAndSelect|sm.Rows)
self.library_view.setCurrentIndex(index)
@@ -1548,7 +1557,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
if not confirm(''+_('The selected books will be '
'permanently deleted '
'from your device. Are you sure?')
- +'
', 'library_delete_books', self):
+ +'
', 'device_delete_books', self):
return
if self.stack.currentIndex() == 1:
view = self.memory_view
@@ -2304,14 +2313,17 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
def library_moved(self, newloc):
if newloc is None: return
db = LibraryDatabase2(newloc)
+ self.library_path = newloc
self.book_on_device(None, reset=True)
db.set_book_on_device_func(self.book_on_device)
self.library_view.set_database(db)
+ self.tags_view.set_database(db, self.tag_match, self.popularity)
self.library_view.model().set_book_on_device_func(self.book_on_device)
self.status_bar.clearMessage()
self.search.clear_to_help()
self.status_bar.reset_info()
self.library_view.model().count_changed()
+ prefs['library_path'] = self.library_path
############################################################################
@@ -2358,7 +2370,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.search_restriction.setEnabled(False)
for action in list(self.delete_menu.actions())[1:]:
action.setEnabled(False)
- self.set_number_of_books_shown(compute_count=False)
+ self.set_number_of_books_shown()
def device_job_exception(self, job):
diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py
index 06abb7181c..0964ed47c3 100644
--- a/src/calibre/gui2/viewer/main.py
+++ b/src/calibre/gui2/viewer/main.py
@@ -424,7 +424,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
self.set_bookmarks(self.iterator.bookmarks)
- def find(self, text, refinement, repeat=False, backwards=False):
+ def find(self, text, repeat=False, backwards=False):
if not text:
self.view.search('')
return self.search.search_done(False)
diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py
index 83c56c5395..e2ecdd9f55 100644
--- a/src/calibre/library/caches.py
+++ b/src/calibre/library/caches.py
@@ -241,6 +241,24 @@ class ResultCache(SearchQueryParser):
matches = set([])
if len(query) < 2:
return matches
+
+ if location == 'date':
+ location = 'timestamp'
+ loc = self.field_metadata[location]['rec_index']
+
+ if query == 'false':
+ for item in self._data:
+ if item is None: continue
+ if item[loc] is None or item[loc] == UNDEFINED_DATE:
+ matches.add(item[0])
+ return matches
+ if query == 'true':
+ for item in self._data:
+ if item is None: continue
+ if item[loc] is not None and item[loc] != UNDEFINED_DATE:
+ matches.add(item[0])
+ return matches
+
relop = None
for k in self.date_search_relops.keys():
if query.startswith(k):
@@ -249,10 +267,6 @@ class ResultCache(SearchQueryParser):
if relop is None:
(p, relop) = self.date_search_relops['=']
- if location == 'date':
- location = 'timestamp'
- loc = self.field_metadata[location]['rec_index']
-
if query == _('today'):
qd = now()
field_count = 3
@@ -301,7 +315,7 @@ class ResultCache(SearchQueryParser):
if query == 'false':
query = '0'
elif query == 'true':
- query = '>0'
+ query = '!=0'
relop = None
for k in self.numeric_search_relops.keys():
if query.startswith(k):
diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py
index 4d2c8970b6..23b78f38ae 100644
--- a/src/calibre/library/custom_columns.py
+++ b/src/calibre/library/custom_columns.py
@@ -183,15 +183,30 @@ class CustomColumns(object):
ans = self.conn.get('SELECT id, value FROM %s'%table)
return ans
- def rename_custom_item(self, id, new_name, label=None, num=None):
- if id:
- if label is not None:
- data = self.custom_column_label_map[label]
- if num is not None:
- data = self.custom_column_num_map[num]
- table,lt = self.custom_table_names(data['num'])
- self.conn.execute('UPDATE %s SET value=? WHERE id=?'%table, (new_name, id))
- self.conn.commit()
+ def rename_custom_item(self, old_id, new_name, label=None, num=None):
+ if label is not None:
+ data = self.custom_column_label_map[label]
+ if num is not None:
+ data = self.custom_column_num_map[num]
+ table,lt = self.custom_table_names(data['num'])
+ # check if item exists
+ new_id = self.conn.get(
+ 'SELECT id FROM %s WHERE value=?'%table, (new_name,), all=False)
+ if new_id is None or old_id == new_id:
+ self.conn.execute('UPDATE %s SET value=? WHERE id=?'%table, (new_name, old_id))
+ else:
+ # New id exists. If the column is_multiple, then process like
+ # tags, otherwise process like publishers (see database2)
+ if data['is_multiple']:
+ books = self.conn.get('''SELECT book from %s
+ WHERE value=?'''%lt, (old_id,))
+ for (book_id,) in books:
+ self.conn.execute('''DELETE FROM %s
+ WHERE book=? and value=?'''%lt, (book_id, new_id))
+ self.conn.execute('''UPDATE %s SET value=?
+ WHERE value=?'''%lt, (new_id, old_id,))
+ self.conn.execute('DELETE FROM %s WHERE id=?'%table, (old_id,))
+ self.conn.commit()
def delete_custom_item_using_id(self, id, label=None, num=None):
if id:
diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py
index 29e1901ce2..5868a782ad 100644
--- a/src/calibre/library/database2.py
+++ b/src/calibre/library/database2.py
@@ -9,12 +9,6 @@ The database used to store ebook metadata
import os, sys, shutil, cStringIO, glob,functools, traceback
from itertools import repeat
from math import floor
-try:
- from PIL import Image as PILImage
- PILImage
-except ImportError:
- import Image as PILImage
-
from PyQt4.QtGui import QImage
@@ -37,7 +31,7 @@ from calibre.utils.date import utcnow, now as nowf, utcfromtimestamp
from calibre.utils.config import prefs
from calibre.utils.search_query_parser import saved_searches
from calibre.ebooks import BOOK_EXTENSIONS, check_ebook_format
-
+from calibre.utils.magick_draw import save_cover_data_to
if iswindows:
import calibre.utils.winshell as winshell
@@ -475,11 +469,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
if callable(getattr(data, 'save', None)):
data.save(path)
else:
- f = data
- if not callable(getattr(data, 'read', None)):
- f = cStringIO.StringIO(data)
- im = PILImage.open(f)
- im.convert('RGB').save(path, 'JPEG')
+ if callable(getattr(data, 'read', None)):
+ data = data.read()
+ save_cover_data_to(data, path)
def book_on_device(self, id):
if callable(self.book_on_device_func):
@@ -1007,16 +999,38 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
return []
return result
- def rename_tag(self, id, new_name):
- if id:
- self.conn.execute('UPDATE tags SET name=? WHERE id=?', (new_name, id))
- self.conn.commit()
+ def rename_tag(self, old_id, new_name):
+ new_id = self.conn.get(
+ '''SELECT id from tags
+ WHERE name=?''', (new_name,), all=False)
+ if new_id is None or old_id == new_id:
+ # easy cases. Simply rename the tag. Do it even if equal, in case
+ # there is a change of case
+ self.conn.execute('''UPDATE tags SET name=?
+ WHERE id=?''', (new_name, old_id))
+ else:
+ # It is possible that by renaming a tag, the tag will appear
+ # twice on a book. This will throw an integrity error, aborting
+ # all the changes. To get around this, we first delete any links
+ # to the new_id from books referencing the old_id, so that
+ # renaming old_id to new_id will be unique on the book
+ books = self.conn.get('''SELECT book from books_tags_link
+ WHERE tag=?''', (old_id,))
+ for (book_id,) in books:
+ self.conn.execute('''DELETE FROM books_tags_link
+ WHERE book=? and tag=?''', (book_id, new_id))
+
+ # Change the link table to point at the new tag
+ self.conn.execute('''UPDATE books_tags_link SET tag=?
+ WHERE tag=?''',(new_id, old_id,))
+ # Get rid of the no-longer used publisher
+ self.conn.execute('DELETE FROM tags WHERE id=?', (old_id,))
+ self.conn.commit()
def delete_tag_using_id(self, id):
- if id:
- self.conn.execute('DELETE FROM books_tags_link WHERE tag=?', (id,))
- self.conn.execute('DELETE FROM tags WHERE id=?', (id,))
- self.conn.commit()
+ self.conn.execute('DELETE FROM books_tags_link WHERE tag=?', (id,))
+ self.conn.execute('DELETE FROM tags WHERE id=?', (id,))
+ self.conn.commit()
def get_series_with_ids(self):
result = self.conn.get('SELECT id,name FROM series')
@@ -1024,19 +1038,44 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
return []
return result
- def rename_series(self, id, new_name):
- if id:
- self.conn.execute('UPDATE series SET name=? WHERE id=?', (new_name, id))
- self.conn.commit()
+ def rename_series(self, old_id, new_name):
+ new_id = self.conn.get(
+ '''SELECT id from series
+ WHERE name=?''', (new_name,), all=False)
+ if new_id is None or old_id == new_id:
+ self.conn.execute('UPDATE series SET name=? WHERE id=?',
+ (new_name, old_id))
+ else:
+ # New series exists. Must update the link, then assign a
+ # new series index to each of the books.
+
+ # Get the list of books where we must update the series index
+ books = self.conn.get('''SELECT books.id
+ FROM books, books_series_link as lt
+ WHERE books.id = lt.book AND lt.series=?
+ ORDER BY books.series_index''', (old_id,))
+ # Get the next series index
+ index = self.get_next_series_num_for(new_name)
+ # Now update the link table
+ self.conn.execute('''UPDATE books_series_link
+ SET series=?
+ WHERE series=?''',(new_id, old_id,))
+ # Now set the indices
+ for (book_id,) in books:
+ self.conn.execute('''UPDATE books
+ SET series_index=?
+ WHERE id=?''',(index, book_id,))
+ index = index + 1
+ self.conn.commit()
+
def delete_series_using_id(self, id):
- if id:
- books = self.conn.get('SELECT book from books_series_link WHERE series=?', (id,))
- self.conn.execute('DELETE FROM books_series_link WHERE series=?', (id,))
- self.conn.execute('DELETE FROM series WHERE id=?', (id,))
- self.conn.commit()
- for (book_id,) in books:
- self.conn.execute('UPDATE books SET series_index=1.0 WHERE id=?', (book_id,))
+ books = self.conn.get('SELECT book from books_series_link WHERE series=?', (id,))
+ self.conn.execute('DELETE FROM books_series_link WHERE series=?', (id,))
+ self.conn.execute('DELETE FROM series WHERE id=?', (id,))
+ self.conn.commit()
+ for (book_id,) in books:
+ self.conn.execute('UPDATE books SET series_index=1.0 WHERE id=?', (book_id,))
def get_publishers_with_ids(self):
result = self.conn.get('SELECT id,name FROM publishers')
@@ -1044,43 +1083,118 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
return []
return result
- def rename_publisher(self, id, new_name):
- if id:
- self.conn.execute('UPDATE publishers SET name=? WHERE id=?', (new_name, id))
- self.conn.commit()
+ def rename_publisher(self, old_id, new_name):
+ new_id = self.conn.get(
+ '''SELECT id from publishers
+ WHERE name=?''', (new_name,), all=False)
+ if new_id is None or old_id == new_id:
+ # New name doesn't exist. Simply change the old name
+ self.conn.execute('UPDATE publishers SET name=? WHERE id=?', \
+ (new_name, old_id))
+ else:
+ # Change the link table to point at the new one
+ self.conn.execute('''UPDATE books_publishers_link
+ SET publisher=?
+ WHERE publisher=?''',(new_id, old_id,))
+ # Get rid of the no-longer used publisher
+ self.conn.execute('DELETE FROM publishers WHERE id=?', (old_id,))
+ self.conn.commit()
- def delete_publisher_using_id(self, id):
- if id:
- self.conn.execute('DELETE FROM books_publishers_link WHERE publisher=?', (id,))
- self.conn.execute('DELETE FROM publishers WHERE id=?', (id,))
- self.conn.commit()
+ def delete_publisher_using_id(self, old_id):
+ self.conn.execute('''DELETE FROM books_publishers_link
+ WHERE publisher=?''', (old_id,))
+ self.conn.execute('DELETE FROM publishers WHERE id=?', (old_id,))
+ self.conn.commit()
# There is no editor for author, so we do not need get_authors_with_ids or
# delete_author_using_id.
- def rename_author(self, id, new_name):
- if id:
- # Make sure that any commas in new_name are changed to '|'!
- new_name = new_name.replace(',', '|')
- self.conn.execute('UPDATE authors SET name=? WHERE id=?', (new_name, id))
- self.conn.commit()
- # now must fix up the books
- books = self.conn.get('SELECT book from books_authors_link WHERE author=?', (id,))
- for (book_id,) in books:
- # First, must refresh the cache to see the new authors
- self.data.refresh_ids(self, [book_id])
- # now fix the filesystem paths
- self.set_path(book_id, index_is_id=True)
- # Next fix the author sort. Reset it to the default
+
+ def rename_author(self, old_id, new_name):
+ # Make sure that any commas in new_name are changed to '|'!
+ new_name = new_name.replace(',', '|')
+
+ # Get the list of books we must fix up, one way or the other
+ # Save the list so we can use it twice
+ bks = self.conn.get('SELECT book from books_authors_link WHERE author=?', (old_id,))
+ books = []
+ for (book_id,) in bks:
+ books.append(book_id)
+
+ # check if the new author already exists
+ new_id = self.conn.get('SELECT id from authors WHERE name=?',
+ (new_name,), all=False)
+ if new_id is None or old_id == new_id:
+ # No name clash. Go ahead and update the author's name
+ self.conn.execute('UPDATE authors SET name=? WHERE id=?',
+ (new_name, old_id))
+ else:
+ # First check for the degenerate case -- changing a value to itself.
+ # Update it in case there is a change of case, but do nothing else
+ if old_id == new_id:
+ self.conn.execute('UPDATE authors SET name=? WHERE id=?',
+ (new_name, old_id))
+ self.conn.commit()
+ return
+ # Author exists. To fix this, we must replace all the authors
+ # instead of replacing the one. Reason: db integrity checks can stop
+ # the rename process, which would leave everything half-done. We
+ # can't do it the same way as tags (delete and add) because author
+ # order is important.
+
+ for book_id in books:
+ # Get the existing list of authors
authors = self.conn.get('''
- SELECT authors.name
- FROM authors, books_authors_link as bl
- WHERE bl.book = ? and bl.author = authors.id
- ''' , (book_id,))
- # unpack the double-list structure
+ SELECT author from books_authors_link
+ WHERE book=?
+ ORDER BY id''',(book_id,))
+
+ # unpack the double-list structure, replacing the old author
+ # with the new one while we are at it
for i,aut in enumerate(authors):
- authors[i] = aut[0]
- ss = authors_to_sort_string(authors)
- self.conn.execute('UPDATE books SET author_sort=? WHERE id=?', (ss, id))
+ authors[i] = aut[0] if aut[0] != old_id else new_id
+ # Delete the existing authors list
+ self.conn.execute('''DELETE FROM books_authors_link
+ WHERE book=?''',(book_id,))
+ # Change the authors to the new list
+ for aid in authors:
+ try:
+ self.conn.execute('''
+ INSERT INTO books_authors_link(book, author)
+ VALUES (?,?)''', (book_id, aid))
+ except IntegrityError:
+ # Sometimes books specify the same author twice in their
+ # metadata. Ignore it.
+ pass
+ # Now delete the old author from the DB
+ bks = self.conn.get('SELECT book FROM books_authors_link WHERE author=?', (old_id,))
+ self.conn.execute('DELETE FROM authors WHERE id=?', (old_id,))
+ self.conn.commit()
+ # the authors are now changed, either by changing the author's name
+ # or replacing the author in the list. Now must fix up the books.
+ for book_id in books:
+ # First, must refresh the cache to see the new authors
+ self.data.refresh_ids(self, [book_id])
+ # now fix the filesystem paths
+ self.set_path(book_id, index_is_id=True)
+ # Next fix the author sort. Reset it to the default
+ authors = self.conn.get('''
+ SELECT authors.name
+ FROM authors, books_authors_link as bl
+ WHERE bl.book = ? and bl.author = authors.id
+ ORDER BY bl.id
+ ''' , (book_id,))
+ # unpack the double-list structure
+ for i,aut in enumerate(authors):
+ authors[i] = aut[0]
+ ss = authors_to_sort_string(authors)
+ # Change the '|'s to ','
+ ss = ss.replace('|', ',')
+ self.conn.execute('''UPDATE books
+ SET author_sort=?
+ WHERE id=?''', (ss, book_id))
+ self.conn.commit()
+ # the caller will do a general refresh, so we don't need to
+ # do one here
# end convenience methods
diff --git a/src/calibre/library/server/__init__.py b/src/calibre/library/server/__init__.py
index 441aee9b60..5050dfaa99 100644
--- a/src/calibre/library/server/__init__.py
+++ b/src/calibre/library/server/__init__.py
@@ -38,6 +38,12 @@ def server_config(defaults=None):
c.add_opt('max_opds_items', ['--max-opds-items'], default=30,
help=_('The maximum number of matches to return per OPDS query. '
'This affects Stanza, WordPlayer, etc. integration.'))
+ c.add_opt('max_opds_ungrouped_items', ['--max-opds-ungrouped-items'],
+ default=100,
+ help=_('Group items in categories such as author/tags '
+ 'by first letter when there are more than this number '
+ 'of items. Default: %default. Set to a large number '
+ 'to disable grouping.'))
return c
def main():
diff --git a/src/calibre/library/server/content.py b/src/calibre/library/server/content.py
index 12bd786322..4dd32eb284 100644
--- a/src/calibre/library/server/content.py
+++ b/src/calibre/library/server/content.py
@@ -127,10 +127,7 @@ class ContentServer(object):
cherrypy.log('User agent: '+ua)
if want_opds:
- return self.stanza(search=kwargs.get('search', None), sortby=kwargs.get('sortby',None), authorid=kwargs.get('authorid',None),
- tagid=kwargs.get('tagid',None),
- seriesid=kwargs.get('seriesid',None),
- offset=kwargs.get('offset', 0))
+ return self.opds(version=0)
if want_mobile:
return self.mobile()
diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py
index f32f60a6dd..d396d73af2 100644
--- a/src/calibre/library/server/opds.py
+++ b/src/calibre/library/server/opds.py
@@ -445,7 +445,7 @@ class OPDSServer(object):
id_ = 'calibre-category-feed:'+which
- MAX_ITEMS = 50
+ MAX_ITEMS = self.opts.max_opds_ungrouped_items
if len(items) <= MAX_ITEMS:
max_items = self.opts.max_opds_items
@@ -459,8 +459,6 @@ class OPDSServer(object):
self.text, self.count = text, count
starts = set([x.name[0] for x in items])
- if len(starts) > MAX_ITEMS:
- starts = set([x.name[:2] for x in items])
category_groups = OrderedDict()
for x in sorted(starts, cmp=lambda x,y:cmp(x.lower(), y.lower())):
category_groups[x] = len([y for y in items if
diff --git a/src/calibre/manual/customize.rst b/src/calibre/manual/customize.rst
index abf3165a69..f875b0e648 100644
--- a/src/calibre/manual/customize.rst
+++ b/src/calibre/manual/customize.rst
@@ -8,16 +8,33 @@ Customizing |app|
==================================
|app| has a highly modular design. Various parts of it can be customized. You can learn how to create
-*recipes* to add new sources of online content to |app| in the Section :ref:`news`. Here, you will learn how to
-use *plugins* to customize and control various aspects of |app|'s behavior.
-
-Theer are different kinds of plugins, corresponding to different aspects of |app|. As more and more aspects of |app|
-are modularized, new plugin types will be added.
+*recipes* to add new sources of online content to |app| in the Section :ref:`news`. Here, you will learn,
+first, how to use environment variables and *tweaks* to customize |app|'s behavior and then how to
+use *plugins* to add funtionality to |app|.
.. contents::
:depth: 2
:local:
+Environment variables
+-----------------------
+
+ * ``CALIBRE_CONFIG_DIRECTORY`` - sets the directory where configuration files are stored/read.
+ * ``CALIBRE_OVERRIDE_DATABASE_PATH`` - allows you to specify the full path to metadata.db. Using this variable you can have metadata.db be in a location other than the library folder. Useful if your library folder is on a networked drive that does not support file locking.
+ * ``CALIBRE_DEVELOP_FROM`` - Used to run from a calibre development environment. See :ref:`develop`.
+ * ``CALIBRE_OVERRIDE_LANG`` - Used to force the language used by the interface (ISO 639 language code)
+ * ``SYSFS_PATH`` - Use if sysfs is mounted somewhere other than /sys
+ * ``http_proxy`` - Used on linux to specify an HTTP proxy
+
+Tweaks
+------------
+
+Tweaks are small changes that you can specify to control various aspects of |app|'s behavior. You specify them by editing the 2tweaks.py file in the config directory.
+The default tweaks.py file is reproduced below
+
+.. literalinclude:: ../../../resources/default_tweaks.py
+
+
A Hello World plugin
------------------------
diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst
index 99afc32b18..833d99f28e 100644
--- a/src/calibre/manual/faq.rst
+++ b/src/calibre/manual/faq.rst
@@ -157,7 +157,9 @@ If you get timeout errors while browsing the calibre catalog in Stanza, try incr
Alternative for the iPad
^^^^^^^^^^^^^^^^^^^^^^^^^^^
-As of |app| version 0.7.0, on windows and OS X you can plugin your iPad into the computer using its charging cable, and |app| will detect it and show you a list of books on the iPad. You can then use the Send to device button to send books directly to iBooks on the iPad.
+As of |app| version 0.7.0, you can plugin your iPad into the computer using its charging cable, and |app| will detect it and show you a list of books on the iPad. You can then use the Send to device button to send books directly to iBooks on the iPad.
+
+This method only works on Windows XP and higher and OS X 10.5 and higher. Linux is not supported (iTunes is not available in linux) and OS X 10.4 is not supported.
How do I use |app| with my Android phone?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/src/calibre/translations/ar.po b/src/calibre/translations/ar.po
index 26b60f586d..378fa227fa 100644
--- a/src/calibre/translations/ar.po
+++ b/src/calibre/translations/ar.po
@@ -7,166 +7,166 @@ msgid ""
msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2010-05-29 18:54+0000\n"
-"PO-Revision-Date: 2010-05-28 23:23+0000\n"
+"POT-Creation-Date: 2010-06-05 01:06+0000\n"
+"PO-Revision-Date: 2010-06-04 16:43+0000\n"
"Last-Translator: Kovid Goyal \n"
"Language-Team: Arabic \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-05-30 03:40+0000\n"
+"X-Launchpad-Export-Date: 2010-06-05 03:32+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
-#: /home/kovid/work/trunk/src/calibre/customize/__init__.py:43
+#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
msgid "Does absolutely nothing"
msgstr "لا يفعل شيءً"
-#: /home/kovid/work/trunk/src/calibre/customize/__init__.py:46
-#: /home/kovid/work/trunk/src/calibre/devices/jetbook/driver.py:72
-#: /home/kovid/work/trunk/src/calibre/devices/kindle/driver.py:54
-#: /home/kovid/work/trunk/src/calibre/devices/nook/driver.py:70
-#: /home/kovid/work/trunk/src/calibre/devices/nook/driver.py:71
-#: /home/kovid/work/trunk/src/calibre/devices/prs500/books.py:267
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/books.py:58
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/books.py:199
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:204
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/input.py:98
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/input.py:101
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/metadata.py:56
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:428
-#: /home/kovid/work/trunk/src/calibre/ebooks/fb2/input.py:67
-#: /home/kovid/work/trunk/src/calibre/ebooks/fb2/input.py:69
-#: /home/kovid/work/trunk/src/calibre/ebooks/html/input.py:329
-#: /home/kovid/work/trunk/src/calibre/ebooks/html/input.py:332
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:1894
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:1896
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:24
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:230
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:261
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:264
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:364
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/ereader.py:36
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/ereader.py:61
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/fb2.py:46
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/meta.py:36
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/meta.py:62
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/meta.py:64
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/meta.py:118
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/meta.py:120
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/opf.py:329
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/opf.py:444
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/opf2.py:921
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/pdb.py:39
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/pdf.py:28
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/pml.py:23
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/pml.py:49
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/txt.py:14
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/reader.py:38
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/reader.py:64
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/reader.py:77
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/reader.py:118
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/reader.py:152
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/reader.py:610
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/reader.py:816
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/reader.py:818
-#: /home/kovid/work/trunk/src/calibre/ebooks/odt/input.py:49
-#: /home/kovid/work/trunk/src/calibre/ebooks/odt/input.py:51
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:909
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:914
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:980
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/reader.py:137
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/reader.py:139
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/transforms/jacket.py:108
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/ereader/writer.py:173
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/ereader/writer.py:174
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/input.py:39
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/palmdoc/writer.py:29
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/ztxt/writer.py:27
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/crop.py:82
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/crop.py:83
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/decrypt.py:73
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/decrypt.py:74
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/encrypt.py:63
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/encrypt.py:64
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/info.py:52
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/merge.py:65
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/merge.py:66
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/reverse.py:63
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/reverse.py:64
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/rotate.py:62
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/rotate.py:63
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/split.py:81
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/split.py:82
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/writer.py:97
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/writer.py:98
-#: /home/kovid/work/trunk/src/calibre/ebooks/rtf/input.py:233
-#: /home/kovid/work/trunk/src/calibre/ebooks/rtf/input.py:235
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:279
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:286
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:170
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:177
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/__init__.py:21
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:107
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:132
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:134
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:574
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:583
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:862
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:865
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf.py:48
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:123
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:158
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:460
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:173
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:419
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:441
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:969
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:1096
-#: /home/kovid/work/trunk/src/calibre/gui2/ui.py:1694
-#: /home/kovid/work/trunk/src/calibre/gui2/ui.py:1697
-#: /home/kovid/work/trunk/src/calibre/gui2/viewer/main.py:185
-#: /home/kovid/work/trunk/src/calibre/library/cli.py:311
-#: /home/kovid/work/trunk/src/calibre/library/database.py:913
-#: /home/kovid/work/trunk/src/calibre/library/database2.py:248
-#: /home/kovid/work/trunk/src/calibre/library/database2.py:260
-#: /home/kovid/work/trunk/src/calibre/library/database2.py:680
-#: /home/kovid/work/trunk/src/calibre/library/database2.py:717
-#: /home/kovid/work/trunk/src/calibre/library/database2.py:1111
-#: /home/kovid/work/trunk/src/calibre/library/database2.py:1113
-#: /home/kovid/work/trunk/src/calibre/library/database2.py:1235
-#: /home/kovid/work/trunk/src/calibre/library/server.py:671
-#: /home/kovid/work/trunk/src/calibre/library/server.py:747
-#: /home/kovid/work/trunk/src/calibre/library/server.py:794
-#: /home/kovid/work/trunk/src/calibre/utils/localization.py:114
-#: /home/kovid/work/trunk/src/calibre/utils/podofo/__init__.py:45
-#: /home/kovid/work/trunk/src/calibre/utils/podofo/__init__.py:63
-#: /home/kovid/work/trunk/src/calibre/utils/podofo/__init__.py:77
-#: /home/kovid/work/trunk/src/calibre/web/feeds/recipes/collection.py:47
-#: /home/kovid/work/trunk/src/calibre/web/feeds/recipes/collection.py:50
+#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46
+#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:72
+#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:54
+#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70
+#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71
+#: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:347
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:98
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:101
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:428
+#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67
+#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69
+#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:329
+#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:332
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:230
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:270
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:273
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:373
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:19
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:20
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:46
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:62
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:118
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:120
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:943
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1055
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:28
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:49
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:14
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:38
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:64
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:77
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:118
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:152
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:610
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:816
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:818
+#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49
+#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:908
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:979
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:137
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:139
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:108
+#: /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:39
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/palmdoc/writer.py:29
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ztxt/writer.py:27
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:82
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:83
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:73
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:74
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/encrypt.py:63
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/encrypt.py:64
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:52
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/merge.py:65
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/merge.py:66
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/reverse.py:63
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/reverse.py:64
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:62
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:63
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:81
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:82
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:97
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98
+#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:233
+#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:235
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:273
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:280
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:170
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:177
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:21
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:107
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:134
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:657
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:666
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:946
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:158
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:489
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:172
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:338
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:358
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:823
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:986
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1797
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1800
+#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:185
+#: /home/kovid/work/calibre/src/calibre/library/cli.py:213
+#: /home/kovid/work/calibre/src/calibre/library/database.py:913
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:308
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:320
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:884
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:921
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1400
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1402
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1524
+#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:268
+#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:131
+#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:134
+#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:68
+#: /home/kovid/work/calibre/src/calibre/utils/localization.py:114
+#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45
+#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63
+#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77
+#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:47
+#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:50
msgid "Unknown"
msgstr "مجهول"
-#: /home/kovid/work/trunk/src/calibre/customize/__init__.py:64
+#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:64
msgid "Base"
msgstr "قاعدة"
-#: /home/kovid/work/trunk/src/calibre/customize/__init__.py:172
+#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:172
msgid "File type"
msgstr "نوع الملف"
-#: /home/kovid/work/trunk/src/calibre/customize/__init__.py:206
+#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:206
msgid "Metadata reader"
msgstr "قارئ دليل المعلومات"
-#: /home/kovid/work/trunk/src/calibre/customize/__init__.py:237
+#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:235
msgid "Metadata writer"
msgstr "كاتب دليل المعلومات"
-#: /home/kovid/work/trunk/src/calibre/customize/__init__.py:267
+#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:263
msgid "Catalog generator"
msgstr "مولد الكاتالوج"
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:15
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15
msgid ""
"Follow all local links in an HTML file and create a ZIP file containing all "
"linked files. This plugin is run every time you add an HTML file to the "
@@ -175,7 +175,7 @@ msgstr ""
"إلتحاق بكل الوصلات المحلية في ملف HTML وإنشاء ملف ZIP ليحتوي كل الملفات "
"الموصولة. هذا الملحق ينفّذ كل مرة تضيف ملف HTML إلى المكتبة."
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:50
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:50
msgid ""
"Character encoding for the input HTML files. Common choices include: cp1252, "
"latin1, iso-8859-1 and utf-8."
@@ -183,7 +183,7 @@ msgstr ""
"رمزالحروف لاجل ملفات HTML المدخلة, تشتمل على الخيارات التالية : cp1252, "
"latin1, iso-8859-1 وutf-8"
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:57
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:57
msgid ""
"Create a PMLZ archive containing the PML file and all images in the "
"directory pmlname_img or images. This plugin is run every time you add a PML "
@@ -193,57 +193,57 @@ msgstr ""
"pmlname_img او صور. هذا المضاف يتم تشغيله كل مرة اضيف فيها ملف PML الى "
"المكتبة"
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:89
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:89
msgid "Extract cover from comic files"
msgstr "استخرج الغلاف من ملف الرسومات"
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:116
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:127
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:139
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:149
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:159
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:170
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:180
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:190
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:200
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:210
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:220
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:231
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:242
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:254
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:275
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:286
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:296
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:306
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:116
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:127
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:139
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:149
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:159
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:170
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:180
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:190
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:200
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:210
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:220
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:231
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:242
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:254
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:275
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:286
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:296
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:306
msgid "Read metadata from %s files"
msgstr "يقرأ دليل المعلومات من الملفات %s"
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:265
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:265
msgid "Read metadata from ebooks in RAR archives"
msgstr "إقرأ دليل المعلومات لكتب في أرشيفات RAR"
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:317
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:317
msgid "Read metadata from ebooks in ZIP archives"
msgstr "إقرأ ميتاداتا لكتب في أرشيفات ZIP"
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:328
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:338
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:348
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:370
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:381
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:391
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:328
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:338
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:348
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:370
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:381
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:391
msgid "Set metadata in %s files"
msgstr "ضبط دليل المعلومات في الملفات %s"
-#: /home/kovid/work/trunk/src/calibre/customize/builtins.py:359
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:359
msgid "Set metadata from %s files"
msgstr "ضبط دليل المعلومات من ملفات %s"
-#: /home/kovid/work/trunk/src/calibre/customize/conversion.py:102
+#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102
msgid "Conversion Input"
msgstr "دخل التحويل"
-#: /home/kovid/work/trunk/src/calibre/customize/conversion.py:125
+#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:125
msgid ""
"Specify the character encoding of the input document. If set this option "
"will override any encoding declared by the document itself. Particularly "
@@ -254,11 +254,11 @@ msgstr ""
"متجاوزاً خيارات المستند, هذا الخيار للمستندان التي لا تعلن عن ترميزها أو "
"التي ليس لها ترميز خاطىء."
-#: /home/kovid/work/trunk/src/calibre/customize/conversion.py:241
+#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:241
msgid "Conversion Output"
msgstr "خرج التحويل"
-#: /home/kovid/work/trunk/src/calibre/customize/conversion.py:255
+#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:255
msgid ""
"If specified, the output plugin will try to create output that is as human "
"readable as possible. May not have any effect for some output plugins."
@@ -266,11 +266,11 @@ msgstr ""
"اذا تم اختيارها , سوف يتم جعل المخرجات مقروءة بشرياً قدر الامكان, و قد لا "
"يكون لا تأثير لبعض المخرجات ."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:45
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:45
msgid "Input profile"
msgstr "طور الدخل"
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:49
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:49
msgid ""
"This profile tries to provide sane defaults and is useful if you know "
"nothing about the input document."
@@ -278,83 +278,83 @@ msgstr ""
"ملف تعريف هذا يحاول تقديم افتراضات عاقلة ومفيدة إذا كنت لا تعرف شيئا عن "
"وثيقة الإدخال."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:57
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:258
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:57
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:266
msgid ""
"This profile is intended for the SONY PRS line. The 500/505/600/700 etc."
msgstr ""
"ملف التعريف هذا هو المقصود لجهاز سوني من خط إنتاج PRS . الـ500/505/600/700 "
"إلخ."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:69
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:69
msgid "This profile is intended for the SONY PRS 300."
msgstr "ملف التعريف هذا هو المقصود لجهاز سوني PRS 300."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:78
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:292
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:78
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:300
msgid "This profile is intended for the SONY PRS-900."
msgstr "ملف التعريف هذا هو المقصود لجهاز سوني PRS 900."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:86
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:322
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:86
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:330
msgid "This profile is intended for the Microsoft Reader."
msgstr "هذا الطور يستخدم مع Microsoft Reader"
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:97
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:333
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:97
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:341
msgid "This profile is intended for the Mobipocket books."
msgstr "ملف التعريف هذا يستخدم مع كتب Mobipocket ."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:110
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:346
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:110
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:354
msgid "This profile is intended for the Hanlin V3 and its clones."
msgstr "ملف التعريف هذا يستخدم مع Hanlin V3 وأمثاله."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:122
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:358
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:122
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:366
msgid "This profile is intended for the Hanlin V5 and its clones."
msgstr "ملف التعريف هذا يستخدم مع Hanlin V5 وأمثاله."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:132
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:366
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:132
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:374
msgid "This profile is intended for the Cybook G3."
msgstr "ملف التعريف هذا يستخدم مع Cybook G3"
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:145
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:379
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:145
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:387
msgid "This profile is intended for the Cybook Opus."
msgstr "ملف التعريف هذا يستخدم مع Cybook Opus ."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:157
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:390
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:157
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:398
msgid "This profile is intended for the Amazon Kindle."
msgstr "ملف التعريف هذا يستخدم مع Amazon Kindle ."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:169
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:425
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:169
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:433
msgid "This profile is intended for the Irex Illiad."
msgstr "ملف التعريف هذا يستخدم مع Irex Illiad ."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:181
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:438
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:181
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:446
msgid "This profile is intended for the IRex Digital Reader 1000."
msgstr "ملف التعريف هذا يستخدم مع IRex Digital Reader 1000 ."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:194
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:452
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:194
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:460
msgid "This profile is intended for the IRex Digital Reader 800."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:206
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:466
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:206
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:474
msgid "This profile is intended for the B&N Nook."
msgstr "ملف التعريف هذا يستخدم مع B&N Nook ."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:226
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:226
msgid "Output profile"
msgstr "المخرجات"
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:230
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:230
msgid ""
"This profile tries to provide sane defaults and is useful if you want to "
"produce a document intended to be read at a computer or on a range of "
@@ -363,24 +363,24 @@ msgstr ""
"ملف التعريف هذا يحاول تقديم افتراضات عاقلة و مفيدة إذا كنت ترغب في إصدار "
"وثيقة للقراءة في جهاز الكمبيوتر أو على مجموعة من الأجهزة."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:248
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:254
msgid ""
"Intended for the iPad and similar devices with a resolution of 768x1024"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:271
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:279
msgid "This profile is intended for the Kobo Reader."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:283
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:291
msgid "This profile is intended for the SONY PRS-300."
msgstr "ملف التعريف هذا يستخدم مع سوني PRS-300 ."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:301
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:309
msgid "This profile is intended for the 5-inch JetBook."
msgstr "ملف التعريف هذا يستخدم مع الخمسة بوصة JetBook ."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:310
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:318
msgid ""
"This profile is intended for the SONY PRS line. The 500/505/700 etc, in "
"landscape mode. Mainly useful for comics."
@@ -388,35 +388,35 @@ msgstr ""
"ملف التعريف هذا يستخدم مع سوني خط إنتاج PRS . الـ500/505/700 الخ ، في وضع "
"أفقي.غالباً مفيد للكاريكاتيرات."
-#: /home/kovid/work/trunk/src/calibre/customize/profiles.py:408
+#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:416
msgid "This profile is intended for the Amazon Kindle DX."
msgstr "ملف التعريف هذا يستخدم مع Amazon Kindle DX"
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:31
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:31
msgid "Installed plugins"
msgstr "ملحقات مثبتة"
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:32
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:32
msgid "Mapping for filetype plugins"
msgstr "تعيين لملحقات أنواع الملفات"
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:33
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:33
msgid "Local plugin customization"
msgstr "تخصيص الملحقات المحلية"
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:34
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34
msgid "Disabled plugins"
msgstr "ملحقات معطلة"
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:77
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:77
msgid "No valid plugin found in "
msgstr "لا يجد ملحق صالح "
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:278
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:278
msgid "Initialization of plugin %s failed with traceback:"
msgstr "فشل استهلال الملحق %s مع اقتفاء الأثر:"
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:433
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:433
msgid ""
" %prog options\n"
"\n"
@@ -428,209 +428,250 @@ msgstr ""
" المقدرة على التخصيص بتحميل الملحقات الخارجية .\n"
" "
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:439
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:439
msgid "Add a plugin by specifying the path to the zip file containing it."
msgstr "إضافة ملحق يتخصيص مسار إلى ملف zip الذي يحتويه."
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:441
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:441
msgid "Remove a custom plugin by name. Has no effect on builtin plugins"
msgstr "حذف الملحق المخصص عن طريق اسمه. لا يؤثر على الملحقات المضمنة"
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:443
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:443
msgid ""
"Customize plugin. Specify name of plugin and customization string separated "
"by a comma."
msgstr "تخصيص الملحق . حدد اسم الملحق وسلسلة التخصيص وفرقهما بفاصلة."
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:445
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:445
msgid "List all installed plugins"
msgstr "قائمة كل الملحقات المثبتة"
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:447
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:447
msgid "Enable the named plugin"
msgstr "تمكين الملحق المسمى"
-#: /home/kovid/work/trunk/src/calibre/customize/ui.py:449
+#: /home/kovid/work/calibre/src/calibre/customize/ui.py:449
msgid "Disable the named plugin"
msgstr "تعطيل الملحق المسمى"
-#: /home/kovid/work/trunk/src/calibre/devices/android/driver.py:13
+#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:13
msgid "Communicate with Android phones."
msgstr "التواصل مع هواتف أندرويد ."
-#: /home/kovid/work/trunk/src/calibre/devices/android/driver.py:39
+#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:39
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/trunk/src/calibre/devices/android/driver.py:68
+#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:68
msgid "Communicate with S60 phones."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/binatone/driver.py:17
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:57
+msgid "Communicate with iBooks through iTunes."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:63
+msgid "Apple device detected, launching iTunes, please wait ..."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:125
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:143
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:146
+msgid "Updating device metadata listing..."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:211
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:242
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:827
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:964
+msgid "%d of %d"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:248
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:969
+msgid "finished"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:421
+msgid ""
+"Some books not found in iTunes database.\n"
+"Delete using the iBooks app.\n"
+"Click 'Show Details' for a list."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:614
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:28
+msgid "settings for device drivers"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:616
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:30
+msgid "Ordered list of formats the device will accept"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:729
+msgid ""
+"Some cover art could not be converted.\n"
+"Click 'Show Details' for a list."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/binatone/driver.py:17
msgid "Communicate with the Binatone Readme eBook reader."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/blackberry/driver.py:13
+#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13
msgid "Communicate with the Blackberry smart phone."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/blackberry/driver.py:14
-#: /home/kovid/work/trunk/src/calibre/devices/nuut2/driver.py:18
-#: /home/kovid/work/trunk/src/calibre/devices/prs500/driver.py:90
+#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:14
+#: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18
+#: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:90
msgid "Kovid Goyal"
msgstr "Kovid Goyal"
-#: /home/kovid/work/trunk/src/calibre/devices/cybook/driver.py:22
+#: /home/kovid/work/calibre/src/calibre/devices/cybook/driver.py:22
msgid "Communicate with the Cybook Gen 3 / Opus eBook reader."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/eb600/driver.py:24
+#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:24
msgid "Communicate with the EB600 eBook reader."
msgstr "التواصل مع القارئ الكتاب الاليكترونى EB600 ."
-#: /home/kovid/work/trunk/src/calibre/devices/edge/driver.py:17
+#: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17
msgid "Entourage Edge"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/edge/driver.py:18
+#: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:18
msgid "Communicate with the Entourage Edge."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/eslick/driver.py:16
+#: /home/kovid/work/calibre/src/calibre/devices/eslick/driver.py:16
msgid "Communicate with the ESlick eBook reader."
msgstr "التواصل مع القارئ الكتاب الاليكترونى ESlick ."
-#: /home/kovid/work/trunk/src/calibre/devices/hanlin/driver.py:19
-msgid "Communicate with Hanlin V3 eBook readers."
-msgstr "التواصل مع القارئ الكتاب الاليكترونى Hanlin V3 ."
-
-#: /home/kovid/work/trunk/src/calibre/devices/hanlin/driver.py:78
-msgid "Communicate with Hanlin V5 eBook readers."
-msgstr "التواصل مع القارئ الكتاب الاليكترونى Hanlin V5 ."
-
-#: /home/kovid/work/trunk/src/calibre/devices/hanlin/driver.py:97
-msgid "Communicate with the BOOX eBook reader."
-msgstr "التواصل مع القارئ الكتاب الاليكترونى BOOX ."
-
-#: /home/kovid/work/trunk/src/calibre/devices/hanvon/driver.py:18
-msgid "Communicate with the Hanvon N520 eBook reader."
-msgstr "التواصل مع القارئ الكتاب الاليكترونى Hanvon N520 ."
-
-#: /home/kovid/work/trunk/src/calibre/devices/hanvon/driver.py:40
-msgid "Communicate with The Book reader."
+#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:16
+#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:30
+msgid "Use an arbitrary folder as a device."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/hanvon/driver.py:51
-msgid "Communicate with the SpringDesign Alex eBook reader."
-msgstr ""
-
-#: /home/kovid/work/trunk/src/calibre/devices/hanvon/driver.py:67
-msgid "Communicate with the Azbooka"
-msgstr ""
-
-#: /home/kovid/work/trunk/src/calibre/devices/hanvon/driver.py:80
-msgid "Communicate with the Elonex EB 511 eBook reader."
-msgstr "اﻹتصال مع الـElonex EB 511 القارئ اﻹلكتروني"
-
-#: /home/kovid/work/trunk/src/calibre/devices/iliad/driver.py:16
-msgid "Communicate with the IRex Iliad eBook reader."
-msgstr "التواصل مع القارئ الكتاب الاليكترونى IRex Iliad ."
-
-#: /home/kovid/work/trunk/src/calibre/devices/iliad/driver.py:17
-#: /home/kovid/work/trunk/src/calibre/devices/irexdr/driver.py:18
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:29
-msgid "John Schember"
-msgstr "John Schember"
-
-#: /home/kovid/work/trunk/src/calibre/devices/interface.py:23
+#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:26
+#: /home/kovid/work/calibre/src/calibre/devices/interface.py:23
msgid "Device Interface"
msgstr "واجهة الجهاز"
-#: /home/kovid/work/trunk/src/calibre/devices/irexdr/driver.py:16
+#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:19
+msgid "Communicate with Hanlin V3 eBook readers."
+msgstr "التواصل مع القارئ الكتاب الاليكترونى Hanlin V3 ."
+
+#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:90
+msgid "Communicate with Hanlin V5 eBook readers."
+msgstr "التواصل مع القارئ الكتاب الاليكترونى Hanlin V5 ."
+
+#: /home/kovid/work/calibre/src/calibre/devices/hanlin/driver.py:109
+msgid "Communicate with the BOOX eBook reader."
+msgstr "التواصل مع القارئ الكتاب الاليكترونى BOOX ."
+
+#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18
+msgid "Communicate with the Hanvon N520 eBook reader."
+msgstr "التواصل مع القارئ الكتاب الاليكترونى Hanvon N520 ."
+
+#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:40
+msgid "Communicate with The Book reader."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:51
+msgid "Communicate with the SpringDesign Alex eBook reader."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:67
+msgid "Communicate with the Azbooka"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:80
+msgid "Communicate with the Elonex EB 511 eBook reader."
+msgstr "اﻹتصال مع الـElonex EB 511 القارئ اﻹلكتروني"
+
+#: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:16
+msgid "Communicate with the IRex Iliad eBook reader."
+msgstr "التواصل مع القارئ الكتاب الاليكترونى IRex Iliad ."
+
+#: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17
+#: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:29
+msgid "John Schember"
+msgstr "John Schember"
+
+#: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:16
msgid "Communicate with the IRex Digital Reader 1000 eBook reader."
msgstr "التواصل مع القارئ الكتاب الاليكترونى IRex Digital Reader 1000 ."
-#: /home/kovid/work/trunk/src/calibre/devices/irexdr/driver.py:42
+#: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:42
msgid "Communicate with the IRex Digital Reader 800"
msgstr "اﻹتصال مع الـ IRex Digital Reader 800"
-#: /home/kovid/work/trunk/src/calibre/devices/iriver/driver.py:15
+#: /home/kovid/work/calibre/src/calibre/devices/iriver/driver.py:15
msgid "Communicate with the Iriver Story reader."
msgstr "التواصل مع القارئ الكتاب الاليكترونى Iriver Story ."
-#: /home/kovid/work/trunk/src/calibre/devices/jetbook/driver.py:20
+#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:20
msgid "Communicate with the JetBook eBook reader."
msgstr "التواصل مع القارئ الكتاب الاليكترونى JetBook ."
-#: /home/kovid/work/trunk/src/calibre/devices/kindle/driver.py:21
+#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:21
msgid "Communicate with the Kindle eBook reader."
msgstr "التواصل مع القارئ الكتاب الاليكترونى Kindle ."
-#: /home/kovid/work/trunk/src/calibre/devices/kindle/driver.py:152
+#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:147
msgid "Communicate with the Kindle 2 eBook reader."
msgstr "التواصل مع القارئ الكتاب الاليكترونى Kindle 2 ."
-#: /home/kovid/work/trunk/src/calibre/devices/kindle/driver.py:162
+#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:157
msgid "Communicate with the Kindle DX eBook reader."
msgstr "التواصل مع القارئ الكتاب الاليكترونى Kindle DX ."
-#: /home/kovid/work/trunk/src/calibre/devices/kobo/driver.py:14
+#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:14
msgid "Communicate with the Kobo Reader"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/misc.py:15
+#: /home/kovid/work/calibre/src/calibre/devices/misc.py:15
msgid "Communicate with the Palm Pre"
msgstr "الإتصال مع جهاز البالم بري"
-#: /home/kovid/work/trunk/src/calibre/devices/misc.py:35
+#: /home/kovid/work/calibre/src/calibre/devices/misc.py:35
msgid "Communicate with the Booq Avant"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/nokia/driver.py:17
+#: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17
msgid "Communicate with the Nokia 770 internet tablet."
msgstr "التواصل مع نوكيا 770"
-#: /home/kovid/work/trunk/src/calibre/devices/nokia/driver.py:40
+#: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:40
msgid "Communicate with the Nokia 810 internet tablet."
msgstr "التواصل مع نوكيا 810"
-#: /home/kovid/work/trunk/src/calibre/devices/nook/driver.py:20
+#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:20
msgid "The Nook"
msgstr "جهاز الـNook"
-#: /home/kovid/work/trunk/src/calibre/devices/nook/driver.py:21
+#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:21
msgid "Communicate with the Nook eBook reader."
msgstr "التواصل مع القارئ الكتاب الاليكترونى Nook ."
-#: /home/kovid/work/trunk/src/calibre/devices/nuut2/driver.py:17
+#: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17
msgid "Communicate with the Nuut2 eBook reader."
msgstr "التواصل مع القارئ الكتاب الاليكترونى Nuut2 ."
-#: /home/kovid/work/trunk/src/calibre/devices/prs500/driver.py:89
+#: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:89
msgid "Communicate with the Sony PRS-500 eBook reader."
msgstr "التواصل مع قارئ الكتاب الاليكتروني سوني PRS-500 ."
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/books.py:150
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:104
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:107
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:110
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:121
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:44
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:47
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:50
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:70
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:80
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:89
-msgid "Getting list of books on device..."
-msgstr "يجري إحصاء قائمة كتب من الجهاز..."
+#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:23
+msgid "Communicate with all the Sony eBook readers."
+msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:26
-msgid "Communicate with the Sony PRS-300/505/500 eBook reader."
-msgstr "التواصل مع قارئات الكتاب الاليكتروني سوني PRS-300/505/500 ."
-
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:58
+#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:61
msgid ""
"Comma separated list of metadata fields to turn into collections on the "
"device. Possibilities include: "
@@ -638,216 +679,214 @@ msgstr ""
"ضع علامة الفاصلة للفصل بين مجموعة من البيانات الوصفية لكي تكون مجموعة في "
"الجهاز . و تشمل الاحتمالات التالية: "
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:149
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:151
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:115
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:117
-msgid "Transferring books to device..."
-msgstr "يجري تحويل الكتب إلى الجهاز..."
+#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:140
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68
+msgid "Unnamed"
+msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:189
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:196
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:144
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:161
-msgid "Removing books from device..."
-msgstr "يجري حذف الكتب من الجهاز..."
-
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:224
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:176
-msgid "Sending metadata to device..."
-msgstr "يجري إرسال دليل المعلومات. إلى الجهاز..."
-
-#: /home/kovid/work/trunk/src/calibre/devices/prs505/driver.py:230
-msgid "Communicate with the Sony PRS-600/700/900 eBook reader."
-msgstr "التواصل مع قارئات الكتاب الاليكتروني سوني PRS-600/700/900 ."
-
-#: /home/kovid/work/trunk/src/calibre/devices/sne/driver.py:17
+#: /home/kovid/work/calibre/src/calibre/devices/sne/driver.py:17
msgid "Communicate with the Samsung SNE eBook reader."
msgstr "الإتصال مع جهاز قارئ الكتب الالكترونية Samsung SNE ."
-#: /home/kovid/work/trunk/src/calibre/devices/teclast/driver.py:11
+#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:11
msgid "Communicate with the Teclast K3 reader."
msgstr "اﻹتصال مع الـ Teclast K3 reader ."
-#: /home/kovid/work/trunk/src/calibre/devices/teclast/driver.py:37
+#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:37
msgid "Communicate with the Newsmy reader."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/teclast/driver.py:49
+#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:49
msgid "Communicate with the iPapyrus reader."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:246
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:247
msgid "Unable to detect the %s disk drive. Try rebooting."
msgstr "لم يتمكن من كشف القرص %s. حاول إعادة التشغيل."
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:426
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:427
msgid "Unable to detect the %s mount point. Try rebooting."
msgstr "غير قادر على الكشف عن %s نقطة التحميل. حاول إعادة التشغيل."
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:491
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:492
msgid "Unable to detect the %s disk drive."
msgstr "%s غير قادر على اكتشاف عن الذاكرة"
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:584
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:585
msgid "Could not find mount helper: %s."
msgstr "غير قادر على جلب المساعد : %s ."
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:596
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:597
msgid ""
"Unable to detect the %s disk drive. Your kernel is probably exporting a "
"deprecated version of SYSFS."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:604
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:605
msgid "Unable to mount main memory (Error code: %d)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:741
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:743
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:742
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:744
msgid "The reader has no storage card in this slot."
msgstr "لا يوجد بطاقات تخزين في القارئ ."
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:745
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:746
msgid "Selected slot: %s is not supported."
msgstr "الفتحة المختارة : %s ليست مدعومة ."
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:778
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:779
msgid "There is insufficient free space in main memory"
msgstr "لا توجد مساحة كافية في الذاكرة الرئيسية"
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:780
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:782
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:781
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:783
msgid "There is insufficient free space on the storage card"
msgstr "لا توجد مساحة كافية في بطاقة التخزين"
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:812
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:818
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/device.py:843
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:240
-#: /home/kovid/work/trunk/src/calibre/gui2/tag_view.py:151
-#: /home/kovid/work/trunk/src/calibre/library/database2.py:589
-#: /home/kovid/work/trunk/src/calibre/library/database2.py:995
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:813
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:819
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:847
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:239
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:147
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:158
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1284
+#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:120
msgid "News"
msgstr "الأخبار"
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/deviceconfig.py:12
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:12
msgid "Configure Device"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/deviceconfig.py:28
-msgid "settings for device drivers"
-msgstr ""
-
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/deviceconfig.py:30
-msgid "Ordered list of formats the device will accept"
-msgstr ""
-
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/deviceconfig.py:32
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:32
msgid "Place files in sub directories if the device supports them"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/deviceconfig.py:34
-#: /home/kovid/work/trunk/src/calibre/gui2/device_drivers/configwidget_ui.py:78
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:34
+#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78
msgid "Read metadata from files on device"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/deviceconfig.py:36
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:36
msgid "Template to control how books are saved"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/deviceconfig.py:39
-#: /home/kovid/work/trunk/src/calibre/gui2/device_drivers/configwidget_ui.py:80
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:39
+#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80
msgid "Extra customization"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:28
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:28
msgid "Communicate with an eBook reader."
msgstr "الاتصال مع جهاز قارئ إلكتروني ."
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:36
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:44
msgid "Get device information..."
msgstr "يجري إحصاء معلومات الجهاز..."
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:132
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:140
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:53
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:56
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:59
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:119
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:126
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:149
+msgid "Getting list of books on device..."
+msgstr "يجري إحصاء قائمة كتب من الجهاز..."
+
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:174
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:176
+msgid "Transferring books to device..."
+msgstr "يجري تحويل الكتب إلى الجهاز..."
+
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:191
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:220
msgid "Adding books to device metadata listing..."
msgstr "إضافة كتب لقائمة للبيانات الوصفية للجهاز"
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:165
-#: /home/kovid/work/trunk/src/calibre/devices/usbms/driver.py:170
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:224
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:242
+msgid "Removing books from device..."
+msgstr "يجري حذف الكتب من الجهاز..."
+
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:246
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:251
msgid "Removing books from device metadata listing..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:41
+#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:269
+msgid "Sending metadata to device..."
+msgstr "يجري إرسال دليل المعلومات. إلى الجهاز..."
+
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:41
msgid "%prog [options] mybook.chm"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:42
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:42
msgid "Output directory. Defaults to current directory"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:45
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:589
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:45
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:589
msgid "Set the book title"
msgstr "تحديد عنوان الكتاب"
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:47
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:591
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:47
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:591
msgid "Set sort key for the title"
msgstr "ضبط مفتاح الترتيب للعنوان"
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:49
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:593
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:49
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:593
msgid "Set the author"
msgstr "تحديد المؤلف"
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:51
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:595
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:51
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:595
msgid "Set sort key for the author"
msgstr "ضبط مفتاح الترتيب للمؤلف"
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:53
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:597
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:53
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:597
msgid "The category this book belongs to. E.g.: History"
msgstr "تصنيف الكتاب. مثلاً: تاريخ"
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:56
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:600
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:56
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:600
msgid "Path to a graphic that will be set as this files' thumbnail"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:59
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:59
msgid "Path to a txt file containing a comment."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:62
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:607
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:62
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607
msgid "Extract thumbnail from LRF file"
msgstr "استخراج الصورة المصغّرة من ملف LRF"
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:63
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:608
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:63
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608
msgid "Set the publisher"
msgstr "تحديد الناشر"
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:64
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:609
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:64
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609
msgid "Set the book classification"
msgstr "ضبط تصنيف الكتاب"
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:65
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:610
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:65
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610
msgid "Set the book creator"
msgstr "ضبط منشئ الكتاب"
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:66
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:611
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:66
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611
msgid "Set the book producer"
msgstr "تحديد منتج الكتاب"
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:68
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:613
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:68
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:613
msgid ""
"Extract cover from LRF file. Note that the LRF format has no defined cover, "
"so we use some heuristics to guess the cover."
@@ -855,24 +894,24 @@ msgstr ""
"استخراج الغلاف من ملف LRF. لاحظ أن تهيئة LRF لا يستخدم غلاف مخصص، فنستخدم "
"بعض الشروط لتخمينه."
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:70
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:615
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:70
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:615
msgid "Set book ID"
msgstr "تحديد هوية الكتاب"
-#: /home/kovid/work/trunk/src/calibre/ebooks/chm/reader.py:72
+#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:72
msgid "Set font delta"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:201
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:201
msgid "Rendered %s"
msgstr "تم تصوير %s"
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:204
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:204
msgid "Failed %s"
msgstr "فشل %s"
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:261
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:261
msgid ""
"Failed to process comic: \n"
"\n"
@@ -882,44 +921,44 @@ msgstr ""
"\n"
"%s ."
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:279
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:279
msgid ""
"Number of colors for grayscale image conversion. Default: %default. Values "
"of less than 256 may result in blurred text on your device if you are "
"creating your comics in EPUB format."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:283
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:283
msgid ""
"Disable normalize (improve contrast) color range for pictures. Default: False"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:286
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:286
msgid "Maintain picture aspect ratio. Default is to fill the screen."
msgstr "حافظ على نسبة وضوح الصورة . افتراضياً يجب تملأ الشاشة ."
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:288
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:288
msgid "Disable sharpening."
msgstr "تعطيل التشحيذ."
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:290
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:290
msgid ""
"Disable trimming of comic pages. For some comics, trimming might remove "
"content as well as borders."
msgstr ""
"تعطيل اقتصاص صفحات الرسم. لبعضهم، الاقتصاص قد يتسبب بحذف محتوى وحدود."
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:293
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:293
msgid "Don't split landscape images into two portrait images"
msgstr "لا تقسم صور عرضية إلى صورتين طوليتين."
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:295
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:295
msgid ""
"Keep aspect ratio and scale image using screen height as image width for "
"viewing in landscape mode."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:298
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:298
msgid ""
"Used for right-to-left publications like manga. Causes landscape pages to be "
"split into portrait pages from right to left."
@@ -927,13 +966,13 @@ msgstr ""
"تستخدم لمنشورات يمين إلى يسار مثل المانغا اليابانية، إلخ. يتسبب بتقسيم صور "
"عرضية إلى صور طولية من اليمين إلى اليسار."
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:302
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:302
msgid ""
"Enable Despeckle. Reduces speckle noise. May greatly increase processing "
"time."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:305
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:305
msgid ""
"Don't sort the files found in the comic alphabetically by name. Instead use "
"the order they were added to the comic."
@@ -941,27 +980,27 @@ msgstr ""
"لا ترتّب ملفات موجودة في الرسومات أبجدياً، بل استخدم الترتيب المستخدم في "
"الرسومات."
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:309
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:309
msgid ""
"The format that images in the created ebook are converted to. You can "
"experiment to see which format gives you optimal size and look on your "
"device."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:313
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:313
msgid "Apply no processing to the image"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:315
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:315
msgid "Do not convert the image to grayscale (black and white)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:452
-#: /home/kovid/work/trunk/src/calibre/ebooks/comic/input.py:463
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:452
+#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:463
msgid "Page"
msgstr "صفحة"
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:19
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:19
msgid ""
"input_file output_file [options]\n"
"\n"
@@ -987,58 +1026,58 @@ msgid ""
"For full documentation of the conversion system see\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:97
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:97
msgid "INPUT OPTIONS"
msgstr "خيارات الدخل"
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:98
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:98
msgid "Options to control the processing of the input %s file"
msgstr "خيارات للتحكم في معالجة الملف المدخل %s ."
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:104
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:104
msgid "OUTPUT OPTIONS"
msgstr "خيارات الخرج"
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:105
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:105
msgid "Options to control the processing of the output %s"
msgstr "خيارات للتحكم في معالجة الملف المُخرج %s ."
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:119
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:119
msgid "Options to control the look and feel of the output"
msgstr "خيارات للتحكم في الشكل و المظهر للمُخرجات ."
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:135
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:135
msgid "Control auto-detection of document structure."
msgstr "تحكّم بالكشف الآلي لبناء المستند"
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:145
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:145
msgid ""
"Control the automatic generation of a Table of Contents. By default, if the "
"source file has a Table of Contents, it will be used in preference to the "
"automatically generated one."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:155
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:155
msgid "Options to set metadata in the output"
msgstr "خيارات لوضع البيانات الوصفية في المُخرجات ."
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:158
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:158
msgid "Options to help with debugging the conversion"
msgstr "خيارات للمساعدة في تصحيح التحويل ."
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:183
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:183
msgid "List builtin recipes"
msgstr "قائمة من الوصفات المدمجة"
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/cli.py:256
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:256
msgid "Output saved to"
msgstr "المخرجات حُفِظت في"
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:95
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:95
msgid "Level of verbosity. Specify multiple times for greater verbosity."
msgstr "مستوى الايضاح . حدد أوقات متعددة لزيادة الايضاح ."
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:102
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:102
msgid ""
"Save the output from different stages of the conversion pipeline to the "
"specified directory. Useful if you are unsure at which stage of the "
@@ -1047,7 +1086,7 @@ msgstr ""
"احفظ المخرجات في مراحل مختلفة من عملية التحويل إلى الدليل المقصود . مفيدة "
"إذا كنت لا تعلم في أي مرحلة من مراحل التحويل تظهر العلة ."
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:111
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:111
msgid ""
"Specify the input profile. The input profile gives the conversion system "
"information on how to interpret various information in the input document. "
@@ -1055,7 +1094,7 @@ msgid ""
"are:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:122
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:122
msgid ""
"Specify the output profile. The output profile tells the conversion system "
"how to optimize the created document for the specified device. In some "
@@ -1063,7 +1102,7 @@ msgid ""
"a device. For example EPUB on the SONY reader. Choices are:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:133
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:133
msgid ""
"The base font size in pts. All font sizes in the produced book will be "
"rescaled based on this size. By choosing a larger size you can make the "
@@ -1071,7 +1110,7 @@ msgid ""
"chosen based on the output profile you chose."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:143
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:143
msgid ""
"Mapping from CSS font names to font sizes in pts. An example setting is "
"12,12,14,16,18,20,22,24. These are the mappings for the sizes xx-small to xx-"
@@ -1080,17 +1119,17 @@ msgid ""
"use a mapping based on the output profile you chose."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:155
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:155
msgid "Disable all rescaling of font sizes."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:162
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:162
msgid ""
"The line height in pts. Controls spacing between consecutive lines of text. "
"By default no line height manipulation is performed."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:170
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:170
msgid ""
"Some badly designed documents use tables to control the layout of text on "
"the page. When converted these documents often have text that runs off the "
@@ -1098,28 +1137,28 @@ msgid ""
"tables and present it in a linear fashion."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:180
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:180
msgid ""
"XPath expression that specifies all tags that should be added to the Table "
"of Contents at level one. If this is specified, it takes precedence over "
"other forms of auto-detection."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:189
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:189
msgid ""
"XPath expression that specifies all tags that should be added to the Table "
"of Contents at level two. Each entry is added under the previous level one "
"entry."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:197
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:197
msgid ""
"XPath expression that specifies all tags that should be added to the Table "
"of Contents at level three. Each entry is added under the previous level two "
"entry."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:205
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:205
msgid ""
"Normally, if the source file already has a Table of Contents, it is used in "
"preference to the auto-generated one. With this option, the auto-generated "
@@ -1128,11 +1167,11 @@ msgstr ""
"عادةً، إذا يوجد قائمة محتويات في الملف المصدر، يتم استخدامه بدلاً من القائمة "
"التي تم إنشاءه آلياً. بهذا الخيار، يتم استخدام القائمة المنشئة آلياً دوماً."
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:213
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:213
msgid "Don't add auto-detected chapters to the Table of Contents."
msgstr "لا تضف الفصول المكشوفة آلياً إلى قائمة المحتويات."
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:220
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:220
msgid ""
"If fewer than this number of chapters is detected, then links are added to "
"the Table of Contents. Default: %default"
@@ -1140,20 +1179,20 @@ msgstr ""
"إذا يتم كشف عدد أقل من هذا بين الفصول فسوف يضيف وصلات إلى قائمة المحتويات. "
"الإفتراضي هو: %default"
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:227
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:227
msgid ""
"Maximum number of links to insert into the TOC. Set to 0 to disable. Default "
"is: %default. Links are only added to the TOC if less than the threshold "
"number of chapters were detected."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:235
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:235
msgid ""
"Remove entries from the Table of Contents whose titles match the specified "
"regular expression. Matching entries and all their children are removed."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:246
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:246
msgid ""
"An XPath expression to detect chapter titles. The default is to consider "
" or tags that contain the words \"chapter\",\"book\",\"section\" or "
@@ -1163,7 +1202,7 @@ msgid ""
"User Manual for further help on using this feature."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:260
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:260
msgid ""
"Specify how to mark detected chapters. A value of \"pagebreak\" will insert "
"page breaks before chapters. A value of \"rule\" will insert a line before "
@@ -1171,39 +1210,39 @@ msgid ""
"\"both\" will use both page breaks and lines to mark chapters."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:270
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:270
msgid ""
"Either the path to a CSS stylesheet or raw CSS. This CSS will be appended to "
"the style rules from the source file, so it can be used to override those "
"rules."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:279
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:279
msgid ""
"An XPath expression. Page breaks are inserted before the specified elements."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:285
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:285
msgid ""
"Set the top margin in pts. Default is %default. Note: 72 pts equals 1 inch"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:290
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:290
msgid ""
"Set the bottom margin in pts. Default is %default. Note: 72 pts equals 1 inch"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:295
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:295
msgid ""
"Set the left margin in pts. Default is %default. Note: 72 pts equals 1 inch"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:300
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:300
msgid ""
"Set the right margin in pts. Default is %default. Note: 72 pts equals 1 inch"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:306
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:306
msgid ""
"Change text justification. A value of \"left\" converts all justified text "
"in the source to left aligned (i.e. unjustified) text. A value of "
@@ -1212,34 +1251,34 @@ msgid ""
"Note that only some output formats support justification."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:316
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:316
msgid ""
"Remove spacing between paragraphs. Also sets an indent on paragraphs of "
"1.5em. Spacing removal will not work if the source file does not use "
"paragraphs (
or
tags)."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:323
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:323
msgid ""
"When calibre removes inter paragraph spacing, it automatically sets a "
"paragraph indent, to ensure that paragraphs can be easily distinguished. "
"This option controls the width of that indent."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:330
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:330
msgid ""
"Use the cover detected from the source file in preference to the specified "
"cover."
msgstr ""
"استخدم الغلاف التي تم كشفه في ملف المصدر بدلاً من الغلاف الذي تم تخصيصه."
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:336
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:336
msgid ""
"Insert a blank line between paragraphs. Will not work if the source file "
"does not use paragraphs (
or
tags)."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:343
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:343
msgid ""
"Remove the first image from the input ebook. Useful if the first image in "
"the source file is a cover and you are specifying an external cover."
@@ -1247,41 +1286,41 @@ msgstr ""
"حذف أول صورة من دخل الكتاب الإلكتروني. هذا يفيد حين تريد استخدام غلاف مختلف "
"من الغلاف المضمون."
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:351
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:351
msgid ""
"Insert the book metadata at the start of the book. This is useful if your "
"ebook reader does not support displaying/searching metadata directly."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:359
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:359
msgid ""
"Attempt to detect and correct hard line breaks and other problems in the "
"source file. This may make things worse, so use with care."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:367
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:367
msgid "Use a regular expression to try and remove the header."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:374
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:374
msgid "The regular expression to use to remove the header."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:380
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:380
msgid "Use a regular expression to try and remove the footer."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:387
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:387
msgid "The regular expression to use to remove the footer."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:394
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:394
msgid ""
"Read metadata from the specified OPF file. Metadata read from this file will "
"override any metadata in the source file."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:401
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:401
msgid ""
"Transliterate unicode characters to an ASCII representation. Use with care "
"because this will replace unicode characters with ASCII. For instance it "
@@ -1291,7 +1330,7 @@ msgid ""
"number of people will be used (Chinese in the previous example)."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:416
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:416
msgid ""
"Preserve ligatures present in the input document. A ligature is a special "
"rendering of a pair of characters like ff, fi, fl et cetera. Most readers do "
@@ -1301,111 +1340,111 @@ msgid ""
"instead."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:428
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:38
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:428
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:38
msgid "Set the title."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:432
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:432
msgid "Set the authors. Multiple authors should be separated by ampersands."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:437
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:437
msgid "The version of the title to be used for sorting. "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:441
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:441
msgid "String to be used when sorting by author. "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:445
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445
msgid "Set the cover to the specified file or URL"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:449
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:54
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:54
msgid "Set the ebook description."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:453
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:56
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:56
msgid "Set the ebook publisher."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:457
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:60
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:457
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:60
msgid "Set the series this ebook belongs to."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:461
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:62
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:461
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:62
msgid "Set the index of the book in this series."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:465
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:64
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:465
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:64
msgid "Set the rating. Should be a number between 1 and 5."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:469
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:66
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:469
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:66
msgid "Set the ISBN of the book."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:473
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:68
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:473
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:68
msgid "Set the tags for the book. Should be a comma separated list."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:477
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:70
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:477
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:70
msgid "Set the book producer."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:481
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:72
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:481
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:72
msgid "Set the language."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:485
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:485
msgid "Set the publication date."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:489
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:489
msgid "Set the book timestamp (used by the date column in calibre)."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:589
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:589
msgid "Could not find an ebook inside the archive"
msgstr "لم يتمكّن من الحصول على كتاب داخل الأرشيف"
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:647
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:647
msgid "Values of series index and rating must be numbers. Ignoring"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:654
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:654
msgid "Failed to parse date/time"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:802
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:802
msgid "Converting input to HTML..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:829
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:829
msgid "Running transforms on ebook..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/conversion/plumber.py:916
+#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:916
msgid "Creating"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/epub/output.py:56
+#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:56
msgid ""
"Extract the contents of the generated EPUB file to the specified directory. "
"The contents of the directory are first deleted, so be careful."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/epub/output.py:62
+#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:62
msgid ""
"Turn off splitting at page breaks. Normally, input files are automatically "
"split at every page break into two files. This gives an output ebook that "
@@ -1414,21 +1453,21 @@ msgid ""
"turn off splitting on page breaks."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/epub/output.py:73
+#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:73
msgid ""
"Split all HTML files larger than this size (in KB). This is necessary as "
"most EPUB readers cannot handle large file sizes. The default of %defaultKB "
"is the size required for Adobe Digital Editions."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/epub/output.py:80
+#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:80
msgid ""
"Normally, if the input file has no cover and you don't specify one, a "
"default cover is generated with the title, authors, etc. This option "
"disables the generation of this cover."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/epub/output.py:86
+#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:86
msgid ""
"Do not use SVG for the book cover. Use this option if your EPUB is going to "
"be used ona device that does not support SVG, like the iPhone or the "
@@ -1436,7 +1475,7 @@ msgid ""
"blank page."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/epub/output.py:94
+#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:94
msgid ""
"When using an SVG cover, this option will cause the cover to scale to cover "
"the available screen area, but still preserve its aspect ratio (ratio of "
@@ -1445,42 +1484,42 @@ msgid ""
"option the image may be slightly distorted, but there will be no borders."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/epub/output.py:169
+#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:169
msgid "Start"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/fb2/fb2ml.py:144
-#: /home/kovid/work/trunk/src/calibre/ebooks/rb/rbml.py:102
-#: /home/kovid/work/trunk/src/calibre/ebooks/txt/txtml.py:77
+#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:144
+#: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102
+#: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:77
msgid "Table of Contents:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/fb2/input.py:32
+#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:32
msgid "Do not insert a Table of Contents at the beginning of the book."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/fb2/output.py:21
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/output.py:32
-#: /home/kovid/work/trunk/src/calibre/ebooks/pml/output.py:37
-#: /home/kovid/work/trunk/src/calibre/ebooks/rb/output.py:21
-#: /home/kovid/work/trunk/src/calibre/ebooks/txt/output.py:35
+#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:21
+#: /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:35
msgid "Add Table of Contents to beginning of the book."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/html/input.py:243
+#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:243
msgid ""
"Traverse links in HTML files breadth first. Normally, they are traversed "
"depth first."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/html/input.py:250
+#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:250
msgid ""
"Maximum levels of recursion when following links in HTML files. Must be non-"
"negative. 0 implies that no links in the root HTML file are followed. "
"Default is %default."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/html/input.py:259
+#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:259
msgid ""
"Normally this input plugin re-arranges all the input files into a standard "
"folder hierarchy. Only use this option if you know what you are doing as it "
@@ -1488,66 +1527,66 @@ msgid ""
"pipeline."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/html/input.py:267
+#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:267
msgid ""
"Average line length for line breaking if the HTML is from a previous partial "
"conversion of a PDF file. Default is %default which disables this."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lit/from_any.py:47
+#: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:47
msgid "Creating LIT file from EPUB..."
msgstr "إنشاء ملف LIT من EPUB..."
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:320
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:320
msgid "\tBook Designer file detected."
msgstr "\tتم اكتشاف ملف Book Designer."
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:322
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:322
msgid "\tParsing HTML..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:345
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:345
msgid "\tBaen file detected. Re-parsing..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:361
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:361
msgid "Written preprocessed HTML to "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:379
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:379
msgid "Processing %s"
msgstr "يعالج %s"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:393
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:393
msgid "\tConverting to BBeB..."
msgstr "\tتحويل لـBBeB..."
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:539
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:552
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:539
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:552
msgid "Could not parse file: %s"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:544
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544
msgid "%s is an empty file"
msgstr "%s ملف فارغ"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:564
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:564
msgid "Failed to parse link %s %s"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:608
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:608
msgid "Cannot add link %s to TOC"
msgstr "لا يمكن إضافة وصلات %s لقائمة المحتويات"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:957
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:957
msgid "Unable to process image %s. Error: %s"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:1002
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002
msgid "Unable to process interlaced PNG %s"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:1017
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1017
msgid ""
"Could not process image: %s\n"
"%s"
@@ -1555,12 +1594,12 @@ msgstr ""
"لم يتمكن من معالجة: %s\n"
"%s"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:1772
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1772
msgid ""
"An error occurred while processing a table: %s. Ignoring table markup."
msgstr "حدث خطأ حين تنفيذ الجدول: %s. سيتم تجاهل توسيم الجدول."
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:1774
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1774
msgid ""
"Bad table:\n"
"%s"
@@ -1568,76 +1607,76 @@ msgstr ""
"جدول غير صالح:\n"
"%s"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:1796
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796
msgid "Table has cell that is too large"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:1862
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1862
msgid "Could not read cover image: %s"
msgstr "لم يتمكن من قراءة صورة الغلاف: %s"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:1865
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1865
msgid "Cannot read from: %s"
msgstr "لا يمكن القراءة من: %s"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/html/convert_from.py:1994
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1994
msgid "Failed to process opf file"
msgstr "فشل في معالجة ملف opf"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/lrfparser.py:136
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:136
msgid ""
"%prog book.lrf\n"
"Convert an LRF file into an LRS (XML UTF-8 encoded) file"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/lrfparser.py:137
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:137
msgid "Output LRS file"
msgstr "خرج ملف LRS"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/lrfparser.py:139
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:139
msgid "Do not save embedded image and font files to disk"
msgstr "لا تحفظ ملفات الصور والخظوظ المضمنة في القرص"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/lrfparser.py:158
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:158
msgid "Parsing LRF..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/lrfparser.py:161
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:161
msgid "Creating XML..."
msgstr "إنشاء XML..."
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/lrfparser.py:163
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:163
msgid "LRS written to "
msgstr "تم كتابة LRS في "
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/lrs/convert_from.py:267
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:267
msgid "Could not read from thumbnail file:"
msgstr "لم يتمكّن من قراءة ملف الصورة المصغّرة:"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/lrs/convert_from.py:287
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:287
msgid ""
"%prog [options] file.lrs\n"
"Compile an LRS file into an LRF file."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/lrs/convert_from.py:288
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:288
msgid "Path to output file"
msgstr "المسار إلى ملف الخرج"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/lrs/convert_from.py:290
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/isbndb.py:113
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113
msgid "Verbose processing"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/lrs/convert_from.py:292
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:292
msgid "Convert LRS to LRS, useful for debugging."
msgstr "تحويل LRS إلى LRS، يفيد في التنقيح."
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:457
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:457
msgid "Invalid LRF file. Could not set metadata."
msgstr "ملف LRF غير صالح. لم يتمكّن ضبط الميتاداتا."
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:582
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:582
msgid ""
"%prog [options] mybook.lrf\n"
"\n"
@@ -1651,40 +1690,40 @@ msgstr ""
"إظهار/تحرير الميتاداتا في ملف LRF.\n"
"\n"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/meta.py:603
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:603
msgid ""
"Path to a txt file containing the comment to be stored in the lrf file."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:90
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:90
msgid "Enable autorotation of images that are wider than the screen width."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:94
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:94
msgid "Set the space between words in pts. Default is %default"
msgstr "ضبط المساحة بين الكلمات بنقاط. الإفتراضي هو %default"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:97
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:97
msgid "Add a header to all the pages with title and author."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:100
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:100
msgid ""
"Set the format of the header. %a is replaced by the author and %t by the "
"title. Default is %default"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:104
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:104
msgid "Add extra spacing below the header. Default is %default pt."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:107
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:107
msgid ""
"Minimum paragraph indent (the indent of the first line of a paragraph) in "
"pts. Default: %default"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:112
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:112
msgid ""
"Render tables in the HTML as images (useful if the document has large or "
"complex tables)"
@@ -1692,120 +1731,124 @@ msgstr ""
"تحويل الجداول في الـHTML كصور (هذا يفيد إذا كان للمستند جداول كبيرة أو "
"معقّدة)"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:117
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:117
msgid ""
"Multiply the size of text in rendered tables by this factor. Default is "
"%default"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:121
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:121
msgid "The serif family of fonts to embed"
msgstr "ضم أسرة الخطوط بالترويس"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:124
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:124
msgid "The sans-serif family of fonts to embed"
msgstr "ضم أسرة الخطوط بدون الترويس"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:127
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:127
msgid "The monospace family of fonts to embed"
msgstr "ضم أسرة الخطوط أحادية القياس"
-#: /home/kovid/work/trunk/src/calibre/ebooks/lrf/output.py:152
+#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:152
msgid "Comic"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:363
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/info.py:45
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info.py:97
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info.py:98
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:61
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:174
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:416
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:1159
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:372
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:46
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:335
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:828
+#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:538
msgid "Title"
msgstr "العنوان"
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:364
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:62
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:175
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:421
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:1160
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:373
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:48
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:340
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:829
msgid "Author(s)"
msgstr "المؤلف أو المؤلفون"
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:365
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:64
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:180
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:374
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:53
msgid "Publisher"
msgstr "الناشر"
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:366
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/info.py:49
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:375
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49
msgid "Producer"
msgstr "المنتج"
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:367
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:184
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info.py:99
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info_ui.py:67
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:377
-#: /home/kovid/work/trunk/src/calibre/gui2/status.py:95
-#: /home/kovid/work/trunk/src/calibre/gui2/status.py:137
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:376
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:99
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:67
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:296
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1005
+#: /home/kovid/work/calibre/src/calibre/gui2/status.py:107
+#: /home/kovid/work/calibre/src/calibre/gui2/status.py:149
msgid "Comments"
msgstr "التعليقات"
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:375
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:181
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:366
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:1104
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:1163
-#: /home/kovid/work/trunk/src/calibre/gui2/status.py:97
-#: /home/kovid/work/trunk/src/calibre/gui2/tag_view.py:151
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:384
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:54
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:285
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1001
+#: /home/kovid/work/calibre/src/calibre/gui2/status.py:106
+#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:130
msgid "Tags"
msgstr "الوسوم"
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:377
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:182
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:382
-#: /home/kovid/work/trunk/src/calibre/gui2/status.py:96
-#: /home/kovid/work/trunk/src/calibre/gui2/tag_view.py:151
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:386
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:55
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:301
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1010
+#: /home/kovid/work/calibre/src/calibre/gui2/status.py:105
+#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:82
msgid "Series"
msgstr "السلسلة"
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:378
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:387
msgid "Language"
msgstr "اللغة"
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:380
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:1103
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:389
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:993
msgid "Timestamp"
msgstr "ختم التوقيت"
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:382
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:66
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:178
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:391
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:66
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:51
msgid "Published"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/__init__.py:384
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:393
msgid "Rights"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/amazon.py:85
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazon.py:85
msgid "EDITORIAL REVIEW"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/archive.py:22
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:22
msgid ""
"Extract common e-book formats from archives (zip/rar) files. Also try to "
"autodetect if they are actually cbz/cbr files."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:20
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:20
msgid "options"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:21
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:21
msgid ""
"\n"
"Read/Write metadata from/to ebook files.\n"
@@ -1819,120 +1862,120 @@ msgid ""
"silently ignored.\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:40
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:40
msgid ""
"Set the authors. Multiple authors should be separated by the & character. "
"Author names should be in the order Firstname Lastname."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:44
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:44
msgid ""
"The version of the title to be used for sorting. If unspecified, and the "
"title is specified, it will be auto-generated from the title."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:48
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:48
msgid ""
"String to be used when sorting by author. If unspecified, and the author(s) "
"are specified, it will be auto-generated from the author(s)."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:52
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:52
msgid "Set the cover to the specified file."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:58
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:58
msgid "Set the book category."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:74
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:74
msgid "Set the published date."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:77
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:77
msgid "Get the cover from the ebook and save it at as the specified file."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:80
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:80
msgid ""
"Specify the name of an OPF file. The metadata will be written to the OPF "
"file."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:83
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:83
msgid ""
"Read metadata from the specified OPF file and use it to set metadata in the "
"ebook. Metadata specified on the command line will override metadata read "
"from the OPF file"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:88
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:88
msgid "Set the BookID in LRF files"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:153
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:153
msgid "No file specified"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:168
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:168
msgid "Original metadata"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:185
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:185
msgid "Changed metadata"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:197
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:197
msgid "OPF created in"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:203
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:203
msgid "Cover saved to"
msgstr "تم حفظ الغلاف في"
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/cli.py:205
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:205
msgid "No cover found"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/fetch.py:34
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:33
msgid "Metadata download"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/fetch.py:111
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110
msgid "ratings"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/fetch.py:111
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:110
msgid "tags"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/fetch.py:112
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111
msgid "description/reviews"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/fetch.py:113
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:112
msgid "Download %s from %s"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/fetch.py:137
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:136
msgid "Downloads metadata from Google Books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/fetch.py:153
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:152
msgid "Downloads metadata from isbndb.com"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/fetch.py:181
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:180
msgid ""
"To use isbndb.com you must sign up for a %sfree account%s and enter your "
"access key below."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/fetch.py:189
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:188
msgid "Downloads social metadata from amazon.com"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/isbndb.py:94
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94
msgid ""
"\n"
"%prog [options] key\n"
@@ -1946,41 +1989,41 @@ msgid ""
"\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/isbndb.py:105
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:105
msgid "The ISBN ID of the book you want metadata for."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/isbndb.py:107
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107
msgid "The author whose book to search for."
msgstr "المؤلف الذي تريد البحث عنه."
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/isbndb.py:109
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109
msgid "The title of the book to search for."
msgstr "العنوان الذي تريد البحث عنه."
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/isbndb.py:111
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:111
msgid "The publisher of the book to search for."
msgstr "الناشر الذي تريد البحث عنه."
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/library_thing.py:53
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:53
msgid "LibraryThing.com timed out. Try again later."
msgstr "LibraryThing.com لم يرد. حاول لاحقاً."
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/library_thing.py:60
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:60
msgid ""
"Could not fetch cover as server is experiencing high load. Please try again "
"later."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/library_thing.py:61
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:61
msgid " not found."
msgstr " لم يوجد."
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/library_thing.py:64
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:64
msgid "LibraryThing.com server error. Try again later."
msgstr "خطأ في خادم LibraryThing.com. حاول لاحقاً."
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/library_thing.py:71
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:71
msgid ""
"\n"
"%prog [options] ISBN\n"
@@ -1988,166 +2031,162 @@ msgid ""
"Fetch a cover image for the book identified by ISBN from LibraryThing.com\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/metadata/opf2.py:1112
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1372
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1220
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1371
msgid "Cover"
msgstr "الغلاف"
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/output.py:22
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:22
msgid "Modify images to meet Palm device size limitations."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/output.py:26
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:26
msgid "When present, use author sort field as author."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/output.py:30
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:30
msgid ""
"Don't add Table of Contents to end of book. Useful if the book has its own "
"table of contents."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/output.py:33
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/transforms/htmltoc.py:56
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:33
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:56
msgid "Title for any generated in-line table of contents."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/output.py:37
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:37
msgid "Disable compression of the file contents."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/output.py:40
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:40
msgid "Tag marking book to be filed with Personal Docs"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/output.py:108
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:108
msgid "All articles"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/mobi/reader.py:258
+#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:258
msgid "This is an Amazon Topaz book. It cannot be processed."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1373
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1372
msgid "Title Page"
msgstr "صقحة العنوان"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1374
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/transforms/htmltoc.py:15
-#: /home/kovid/work/trunk/src/calibre/gui2/viewer/main.py:53
-#: /home/kovid/work/trunk/src/calibre/gui2/viewer/main_ui.py:194
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1373
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15
+#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:53
+#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:194
msgid "Table of Contents"
msgstr "المحتويات"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1375
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1374
msgid "Index"
msgstr "الفهرس"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1376
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1375
msgid "Glossary"
msgstr "المسرد"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1377
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1376
msgid "Acknowledgements"
msgstr "شكر وتقدير"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1378
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1377
msgid "Bibliography"
msgstr "ببليوغرافيا"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1379
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1378
msgid "Colophon"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1380
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1379
msgid "Copyright"
msgstr "حقوق المؤلف"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1381
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1380
msgid "Dedication"
msgstr "الإهداء"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1382
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1381
msgid "Epigraph"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1383
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1382
msgid "Foreword"
msgstr "افتتاحية"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1384
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1383
msgid "List of Illustrations"
msgstr "قائمة الرسوم"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1385
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1384
msgid "List of Tables"
msgstr "قائمة الجداول"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1386
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1385
msgid "Notes"
msgstr "الملاحظات"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1387
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1386
msgid "Preface"
msgstr "افتتاحية"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/base.py:1388
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1387
msgid "Main Text"
msgstr "النصّ الرئيسي"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/iterator.py:41
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/iterator.py:41
msgid "%s format books are not supported"
msgstr "الكتب بتهيئة %s ليست مدعومة"
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/transforms/htmltoc.py:54
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:54
msgid "HTML TOC generation options."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/transforms/jacket.py:113
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:113
msgid "Book Jacket"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/transforms/split.py:34
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/split.py:34
msgid ""
"Could not find reasonable point at which to split: %s Sub-tree size: %d KB"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/transforms/structure.py:68
-msgid "Unnamed"
-msgstr ""
-
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/writer.py:32
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/writer.py:32
msgid "OPF/NCX/etc. generation options."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/writer.py:35
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/writer.py:35
msgid "OPF version to generate. Default is %default."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/oeb/writer.py:37
+#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/writer.py:37
msgid ""
"Generate an Adobe \"page-map\" file if pagination information is available."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/ereader/reader132.py:128
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/reader132.py:128
msgid "Footnotes"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/ereader/reader132.py:135
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/reader132.py:135
msgid "Sidebar"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/input.py:22
-#: /home/kovid/work/trunk/src/calibre/ebooks/tcr/input.py:23
-#: /home/kovid/work/trunk/src/calibre/ebooks/txt/input.py:22
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:22
+#: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:23
+#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:23
msgid ""
"Normally calibre treats blank lines as paragraph markers. With this option "
"it will assume that every line represents a paragraph instead."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/input.py:26
-#: /home/kovid/work/trunk/src/calibre/ebooks/tcr/input.py:27
-#: /home/kovid/work/trunk/src/calibre/ebooks/txt/input.py:26
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26
+#: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:27
+#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:27
msgid ""
"Normally calibre treats blank lines as paragraph markers. With this option "
"it will assume that every line starting with an indent (either a tab or 2+ "
@@ -2155,32 +2194,32 @@ msgid ""
"starts with an indent is reached."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/output.py:23
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/output.py:23
msgid "Format to use inside the pdb container. Choices are:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdb/output.py:27
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/output.py:27
msgid ""
"Specify the character encoding of the output document. The default is "
"cp1252. Note: This option is not honored by all formats."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/input.py:24
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/input.py:24
msgid "Do not extract images from the document"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/input.py:26
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/input.py:26
msgid ""
"Scale used to determine the length at which a line should be unwrapped. "
"Valid values are a decimal between 0 and 1. The default is 0.5, this is the "
"median line length."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/input.py:30
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/input.py:30
msgid "Use the new PDF conversion engine."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/cli.py:31
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/cli.py:31
msgid ""
"command ...\n"
"\n"
@@ -2192,114 +2231,114 @@ msgid ""
"Manipulate a PDF.\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/crop.py:29
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:29
msgid ""
"[options] file.pdf\n"
"\n"
"Crop a PDF file.\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/crop.py:38
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/decrypt.py:32
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/encrypt.py:34
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/merge.py:36
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/reverse.py:34
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/rotate.py:33
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/split.py:41
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:38
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:32
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/encrypt.py:34
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/merge.py:36
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/reverse.py:34
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:33
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:41
msgid ""
"Path to output file. By default a file is created in the current directory."
msgstr "مسار إلى ملف الخرج. الإفتراضي أن يكون الملف منشئ في الدليل الحالي."
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/crop.py:41
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:41
msgid "Number of pixels to crop from the left most x (default is %s)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/crop.py:44
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:44
msgid "Number of pixels to crop from the left most y (default is %s)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/crop.py:47
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:47
msgid "Number of pixels to crop from the right most x (default is %s)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/crop.py:50
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:50
msgid "Number of pixels to crop from the right most y (default is %s)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/crop.py:53
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:53
msgid ""
"A file generated by ghostscript which allows each page to be individually "
"cropped `gs -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox file.pdf 2> bounding`"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/crop.py:73
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:73
msgid "Crop Options:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/crop.py:73
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/decrypt.py:60
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/encrypt.py:54
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/merge.py:56
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/reverse.py:54
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/rotate.py:53
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/split.py:61
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:73
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:60
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/encrypt.py:54
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/merge.py:56
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/reverse.py:54
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:53
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:61
msgid "Options to control the transformation of pdf"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/decrypt.py:23
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:23
msgid ""
"[options] file.pdf password\n"
"\n"
"Decrypt a PDF.\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/decrypt.py:60
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:60
msgid "Decrypt Options:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/encrypt.py:25
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/encrypt.py:25
msgid ""
"[options] file.pdf password\n"
"\n"
"Encrypt a PDF.\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/encrypt.py:54
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/encrypt.py:54
msgid "Encrypt Options:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/info.py:21
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:21
msgid ""
"file.pdf ...\n"
"\n"
"Get info about a PDF.\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/info.py:46
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:46
msgid "Author"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/info.py:47
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:47
msgid "Subject"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/info.py:48
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:48
msgid "Creator"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/info.py:50
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:50
msgid "Pages"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/info.py:51
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:51
msgid "File Size"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/info.py:52
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:52
msgid "PDF Version"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/merge.py:25
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/merge.py:25
msgid ""
"[options] file1.pdf file2.pdf ...\n"
"\n"
@@ -2308,33 +2347,33 @@ msgid ""
"Merges individual PDFs.\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/merge.py:56
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/merge.py:56
msgid "Merge Options:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/reverse.py:25
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/reverse.py:25
msgid ""
"[options] file.pdf\n"
"\n"
"Reverse a PDF.\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/reverse.py:54
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/reverse.py:54
msgid "Reverse Options:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/rotate.py:24
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:24
msgid ""
"file.pdf degrees\n"
"\n"
"Rotate pages of a PDF clockwise.\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/rotate.py:53
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:53
msgid "Rotate Options:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/split.py:25
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:25
msgid ""
"\n"
"%prog %%name [options] file.pdf page_to_split_on ...\n"
@@ -2349,90 +2388,96 @@ msgid ""
"Split a PDF.\n"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/manipulate/split.py:61
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:61
msgid "Split Options:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/output.py:31
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:31
msgid ""
"The unit of measure. Default is inch. Choices are %s Note: This does not "
"override the unit for margins!"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/output.py:36
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:36
msgid ""
"The size of the paper. This size will be overridden when an output profile "
"is used. Default is letter. Choices are %s"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/output.py:40
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:40
msgid ""
"Custom size of the document. Use the form widthxheight EG. `123x321` to "
"specify the width and height. This overrides any specified paper-size."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/output.py:45
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:45
msgid "The orientation of the page. Default is portrait. Choices are %s"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/output.py:49
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/output.py:49
msgid ""
"Preserve the aspect ratio of the cover, instead of stretching it to fill the "
"ull first page of the generated pdf."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pdf/pdftohtml.py:55
+#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftohtml.py:55
msgid "Could not find pdftohtml, check it is in your PATH"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/pml/output.py:33
+#: /home/kovid/work/calibre/src/calibre/ebooks/pml/output.py:33
msgid ""
"Specify the character encoding of the output document. The default is cp1252."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/rtf/input.py:199
+#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:199
msgid ""
"This RTF file has a feature calibre does not support. Convert it to HTML "
"first and then try it.\n"
"%s"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/tcr/output.py:23
+#: /home/kovid/work/calibre/src/calibre/ebooks/tcr/output.py:23
msgid ""
"Specify the character encoding of the output document. The default is utf-8."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/tcr/output.py:27
+#: /home/kovid/work/calibre/src/calibre/ebooks/tcr/output.py:27
msgid ""
"Specify the compression level to use. Scale 1 - 10. 1 being the lowest "
"compression but the fastest and 10 being the highest compression but the "
"slowest."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/txt/input.py:32
+#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:33
+msgid ""
+"Normally extra spaces are condensed into a single space. With this option "
+"all spaces will be displayed."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:36
msgid ""
"Run the text input through the markdown pre-processor. To learn more about "
"markdown see"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/txt/input.py:35
+#: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:39
msgid "Do not insert a Table of Contents into the output text."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/txt/output.py:24
+#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:24
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/trunk/src/calibre/ebooks/txt/output.py:30
+#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:30
msgid ""
"Specify the character encoding of the output document. The default is utf-8. "
"Note: This option is not honored by all formats."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/txt/output.py:38
+#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:38
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 "
@@ -2440,296 +2485,443 @@ msgid ""
"minimum of 25 characters. Use 0 to disable line splitting."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/ebooks/txt/output.py:45
+#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:45
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/trunk/src/calibre/gui2/__init__.py:31
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:33
msgid "Send file to storage card instead of main memory by default"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:33
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:35
msgid "Confirm before deleting"
msgstr "تأكيد قبل الحذف"
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:35
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:37
msgid "Toolbar icon size"
msgstr "حجم أيقونات شريط الأدوات"
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:37
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:39
msgid "Show button labels in the toolbar"
msgstr "إظهار تسميات الأزرار في شريط الأدوات"
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:39
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:41
msgid "Main window geometry"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:41
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:43
msgid "Notify when a new version is available"
msgstr "Notify when a new version is available"
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:43
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:45
msgid "Use Roman numerals for series number"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:45
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47
msgid "Sort tags list by popularity"
msgstr "ترتيب الوسوم حسب الشهرة"
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:47
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:49
msgid "Number of covers to show in the cover browsing mode"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:49
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:51
msgid "Defaults for conversion to LRF"
msgstr "الإفتراضي للتحويل إلى LRF"
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:51
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:53
msgid "Options for the LRF ebook viewer"
msgstr "الخيارات لمستعرض كتب LRF"
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:54
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:56
msgid "Formats that are viewed using the internal viewer"
msgstr "تهيئات التي تعرض عن طريق المستعرض الداخلي"
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:56
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:58
msgid "Columns to be displayed in the book list"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:57
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:59
msgid "Automatically launch content server on application startup"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:58
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:60
msgid "Oldest news kept in database"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:59
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:61
msgid "Show system tray icon"
msgstr "إظهار أيقونة صينية النظام"
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:61
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:63
msgid "Upload downloaded news to device"
msgstr "رفع أخبار تم تنزيلها إلى الجهاز"
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:63
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65
msgid "Delete books from library after uploading to device"
msgstr "حذف كتب من المكتبة بعد رفعها إلى الجهاز"
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:65
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67
msgid ""
"Show the cover flow in a separate window instead of in the main calibre "
"window"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:67
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69
msgid "Disable notifications from the system tray icon"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:69
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71
msgid "Default action to perform when send to device button is clicked"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:91
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93
msgid "Maximum number of waiting worker processes"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:93
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95
msgid "Download social metadata (tags/rating/etc.)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:95
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97
msgid "Overwrite author and title with new metadata"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:97
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99
msgid "Limit max simultaneous jobs to number of CPUs"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:135
-#: /home/kovid/work/trunk/src/calibre/gui2/wizard/__init__.py:482
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101
+msgid "tag browser categories not to display"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:138
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:476
msgid "Copied"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:169
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:172
msgid "Copy"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:169
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:172
msgid "Copy to Clipboard"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/__init__.py:407
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:382
msgid "Choose Files"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:54
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:54
msgid "Searching in"
msgstr "يتم البحث في"
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:225
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:229
msgid "Adding..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:238
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:242
msgid "Searching in all sub-directories..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:251
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:255
msgid "Path error"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:252
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:256
msgid "The specified directory could not be processed."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:256
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:517
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:260
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:599
msgid "No books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:257
-#: /home/kovid/work/trunk/src/calibre/gui2/ui.py:1822
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:261
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1929
msgid "No books found"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:323
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:327
msgid "Added"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:336
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:340
msgid "Adding failed"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:337
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:341
msgid ""
"The add books process seems to have hung. Try restarting calibre and adding "
"the books in smaller increments, until you find the problem book."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:349
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:353
msgid "Duplicates found!"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:350
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:354
msgid ""
"Books with the same title as the following already exist in the database. "
"Add them anyway?"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:353
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357
msgid "Adding duplicates..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:419
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:423
msgid "Saving..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/add.py:472
+#: /home/kovid/work/calibre/src/calibre/gui2/add.py:476
msgid "Saved"
msgstr "تم الحفظ"
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_csv_xml.py:16
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:57
+msgid "Searching for sub-folders"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:62
+msgid "Searching for books"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:74
+msgid "Looking for duplicates based on file hash"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:109
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:65
+msgid "Choose root folder"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:137
+msgid "Invalid root folder"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:138
+msgid "is not a valid root folder"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:148
+msgid "Add books to calibre"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:21
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:57
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:45
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:41
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:49
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:41
+msgid "WizardPage"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:22
+msgid "Scanning root folder for books"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:23
+msgid "This may take a few minutes"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:58
+msgid "Choose the location to add books from"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:59
+msgid "Select a folder on your hard disk"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:60
+msgid ""
+"
calibre can scan your computer for existing books automatically. These "
+"books will then be copied into the calibre library. This wizard will "
+"help you customize the scanning and import process for your existing book "
+"collection.
\n"
+"
Choose a root folder. Books will be searched for only inside this folder "
+"and any sub-folders.
\n"
+"
Make sure that the folder you chose for your calibre library is "
+"not under the root folder you choose.
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63
+msgid "&Root folder:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64
+msgid ""
+"This folder and its sub-folders will be scanned for books to import into "
+"calibre's library"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:66
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:52
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:53
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:52
+#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:76
+#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:77
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:530
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:544
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:545
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:566
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:568
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:604
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:87
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:90
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:156
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:159
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:163
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:166
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:126
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:74
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:76
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:267
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:269
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:270
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:393
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:398
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:404
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:407
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:409
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:411
+#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:75
+#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:80
+#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:186
+msgid "..."
+msgstr "..."
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:67
+msgid "Handle multiple files per book"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68
+msgid ""
+"&One book per folder, assumes every ebook file in a folder is the same book "
+"in a different format"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:69
+msgid ""
+"&Multiple books per folder, assumes every ebook file is a different book"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:16
msgid "CSV/XML Options"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_csv_xml.py:17
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi.py:18
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input.py:16
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/epub_output.py:16
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/fb2_input.py:13
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/fb2_output.py:15
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output.py:20
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output.py:21
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_input.py:13
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_output.py:17
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_input.py:13
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_output.py:18
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/rb_output.py:15
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_input.py:13
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_output.py:17
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:17
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:18
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:16
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:16
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output.py:15
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:20
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:21
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input.py:13
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:17
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input.py:13
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_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:17
msgid "Options specific to"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_csv_xml.py:17
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi.py:18
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/epub_output.py:16
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/fb2_output.py:15
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output.py:20
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output.py:21
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_output.py:17
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_output.py:18
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/rb_output.py:15
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_output.py:17
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:17
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:18
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:16
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output.py:15
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:20
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:21
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:17
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:15
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:17
msgid "output"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:37
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:68
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_tab_template_ui.py:27
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:88
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/debug_ui.py:49
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/epub_output_ui.py:48
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/fb2_input_ui.py:28
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/fb2_output_ui.py:28
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:119
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:115
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:166
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output_ui.py:66
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:115
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_input_ui.py:31
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_output_ui.py:35
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_input_ui.py:38
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_output_ui.py:42
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/rb_output_ui.py:28
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection_ui.py:59
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc_ui.py:62
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_input_ui.py:42
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_output_ui.py:45
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xexp_edit_ui.py:49
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:67
-#: /home/kovid/work/trunk/src/calibre/gui2/device_drivers/configwidget_ui.py:74
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/save_template_ui.py:41
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_item_ui.py:35
-#: /home/kovid/work/trunk/src/calibre/gui2/filename_pattern_ui.py:106
-#: /home/kovid/work/trunk/src/calibre/gui2/wizard/send_email_ui.py:107
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:37
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:68
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:27
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:88
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:48
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:28
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:28
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:119
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:166
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:66
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:31
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:35
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:38
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:42
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:28
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:59
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:45
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:45
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:49
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67
+#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:74
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:41
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35
+#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107
msgid "Form"
msgstr "استمارة"
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:38
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:38
msgid "Fields to include in output:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi.py:17
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:17
msgid "E-book options"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi.py:20
-#: /home/kovid/work/trunk/src/calibre/library/catalog.py:282
-#: /home/kovid/work/trunk/src/calibre/library/database2.py:958
-#: /home/kovid/work/trunk/src/calibre/library/database2.py:976
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20
+#: /home/kovid/work/calibre/src/calibre/library/catalog.py:222
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1247
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:1265
msgid "Catalog"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:69
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:69
msgid "'Don't include this book' tag:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:70
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:70
msgid "'Mark this book as read' tag:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:71
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:71
msgid "Additional note tag prefix:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:72
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:72
msgid "Regex pattern describing tags to exclude as genres:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:73
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:73
msgid ""
"Regex tips:\n"
"- The default regex - \\[[\\w ]*\\] - excludes genre tags of the form [tag], "
@@ -2738,135 +2930,135 @@ msgid ""
"Genre Section"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:76
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:76
msgid "Include 'Titles' Section"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:77
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:77
msgid "Include 'Recently Added' Section"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:78
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:78
msgid "Sort numbers as text"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28
+#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28
msgid "Tab template for catalog.ui"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/bulk.py:36
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36
msgid ""
"For settings that cannot be specified in this dialog, use the values saved "
"in a previous conversion (if they exist) instead of using the defaults "
"specified in the Preferences"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/bulk.py:67
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:67
msgid "Bulk Convert"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/bulk.py:80
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/single.py:185
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:80
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185
msgid "Options specific to the output format."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input.py:15
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:15
msgid "Comic Input"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input.py:16
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/fb2_input.py:13
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_input.py:13
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_input.py:13
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_input.py:13
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:16
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input.py:13
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input.py:13
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input.py:13
msgid "input"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:89
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:94
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:89
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:94
msgid "&Number of Colors:"
msgstr "&عدد الألوان:"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:90
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:96
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:90
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:96
msgid "Disable &normalize"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:91
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:97
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:91
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97
msgid "Keep &aspect ratio"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:92
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:98
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:92
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:98
msgid "Disable &Sharpening"
msgstr "تعطيل تشحيذ&"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:93
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:104
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:93
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:104
msgid "Disable &Trimming"
msgstr "تعطيل اقتصاص&"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:94
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:103
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:94
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:103
msgid "&Wide"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:95
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:99
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:95
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:99
msgid "&Landscape"
msgstr "&عرضي"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:96
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:101
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:96
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:101
msgid "&Right to left"
msgstr "&يمين إلى يسار"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:97
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:100
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:97
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:100
msgid "Don't so&rt"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:98
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:102
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:98
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:102
msgid "De&speckle"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:99
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:99
msgid "&Disable comic processing"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:100
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/single_ui.py:111
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:100
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:111
msgid "&Output format:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/comic_input_ui.py:101
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:101
msgid "Disable conversion of images to &black and white"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/debug.py:19
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:19
msgid "Debug"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/debug.py:21
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:21
msgid "Debug the conversion process."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/debug.py:38
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/debug_ui.py:51
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:38
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:51
msgid "Choose debug folder"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/debug.py:57
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:57
msgid "Invalid debug directory"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/debug.py:58
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:58
msgid "Failed to create debug directory"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/debug_ui.py:50
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:50
msgid ""
"Choose a folder to put the debug output into. If you specify a folder, "
"calibre will place a lot of debug output into it. This will be useful in "
@@ -2874,105 +3066,65 @@ msgid ""
"conversion parameters like Table of Contents and Chapter Detection."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/debug_ui.py:52
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/debug_ui.py:53
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:125
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:171
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xexp_edit_ui.py:52
-#: /home/kovid/work/trunk/src/calibre/gui2/device_drivers/configwidget_ui.py:76
-#: /home/kovid/work/trunk/src/calibre/gui2/device_drivers/configwidget_ui.py:77
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:507
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:521
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:522
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:538
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:539
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:574
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:359
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:364
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:378
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:389
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:391
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:393
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:398
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:400
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:126
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:128
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:131
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:135
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:267
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:269
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:270
-#: /home/kovid/work/trunk/src/calibre/gui2/main_ui.py:365
-#: /home/kovid/work/trunk/src/calibre/gui2/main_ui.py:367
-#: /home/kovid/work/trunk/src/calibre/gui2/main_ui.py:374
-#: /home/kovid/work/trunk/src/calibre/gui2/main_ui.py:377
-#: /home/kovid/work/trunk/src/calibre/gui2/main_ui.py:379
-#: /home/kovid/work/trunk/src/calibre/gui2/main_ui.py:381
-#: /home/kovid/work/trunk/src/calibre/gui2/shortcuts_ui.py:75
-#: /home/kovid/work/trunk/src/calibre/gui2/shortcuts_ui.py:80
-#: /home/kovid/work/trunk/src/calibre/gui2/viewer/main_ui.py:186
-msgid "..."
-msgstr "..."
-
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/debug_ui.py:54
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54
msgid ""
"The debug process outputs the intermediate HTML generated at various stages "
"of the conversion process. This HTML can sometimes serve as a good starting "
"point for hand editing a conversion."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/epub_output.py:15
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:15
msgid "EPUB Output"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/epub_output_ui.py:49
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:49
msgid "Do not &split on page breaks"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/epub_output_ui.py:50
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:50
msgid "No default &cover"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/epub_output_ui.py:51
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:51
msgid "No &SVG cover"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/epub_output_ui.py:52
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:52
msgid "Preserve cover &aspect ratio"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/epub_output_ui.py:53
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:53
msgid "Split files &larger than:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/epub_output_ui.py:54
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:54
msgid " KB"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/fb2_input.py:12
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:12
msgid "FB2 Input"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/fb2_input_ui.py:29
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:29
msgid "Do not insert a &Table of Contents at the beginning of the book."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/fb2_output.py:14
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output.py:14
msgid "FB2 Output"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/fb2_output_ui.py:29
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_output_ui.py:37
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/rb_output_ui.py:29
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_output_ui.py:47
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:29
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:37
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:29
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:47
msgid "&Inline TOC"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:99
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:99
msgid "Font rescaling wizard"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:100
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:100
msgid ""
"
This wizard will help you choose an appropriate font size key for your "
"needs. Just enter the base font size of the input document and then enter an "
@@ -2988,292 +3140,292 @@ msgid ""
"for a discussion of how font size rescaling works.
"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:103
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:103
msgid "&Output document"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:104
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:109
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:104
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:109
msgid "&Base font size:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:105
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:105
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:123
msgid "Font size &key:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:106
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:110
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:112
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:122
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:127
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:118
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:120
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:125
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:121
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:123
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:125
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:106
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:110
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:112
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:118
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:127
msgid " pt"
msgstr " pt"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:107
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:107
msgid "Use &default values"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:108
msgid "&Input document"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:111
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:111
msgid "&Font size: "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:113
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113
msgid " will map to size: "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/font_key_ui.py:114
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114
msgid "0.0 pt"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel.py:16
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel.py:16
msgid "Look & Feel"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel.py:18
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel.py:18
msgid "Control the look and feel of the output"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel.py:30
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel.py:30
msgid "Original"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel.py:31
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel.py:31
msgid "Left align"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel.py:32
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel.py:32
msgid "Justify text"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:120
msgid "&Disable font size rescaling"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:121
msgid "Base &font size:"
msgstr "حجم الخط& الأساسي:"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124
msgid "Wizard to help you choose an appropriate font size key"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:126
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126
msgid "Line &height:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128
msgid "Input character &encoding:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129
msgid "Remove &spacing between paragraphs"
msgstr "حذف الفراغات& بين الفقرات"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:130
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130
msgid "Indent size:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:131
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131
msgid ""
"
When calibre removes inter paragraph spacing, it automatically sets a "
"paragraph indent, to ensure that paragraphs can be easily distinguished. "
"This option controls the width of that indent."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132
msgid " em"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:133
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133
msgid "Text justification:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:134
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134
msgid "&Linearize tables"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:135
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135
msgid "Extra &CSS"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:136
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136
msgid "&Transliterate unicode characters to ASCII"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:137
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137
msgid "Insert &blank line"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/look_and_feel_ui.py:138
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138
msgid "Keep &ligatures"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output.py:19
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19
msgid "LRF Output"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:116
msgid "Enable &autorotation of wide images"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:117
msgid "&Wordspace:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:119
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:119
msgid "Minimum para. &indent:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:121
msgid "Render &tables as images"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:122
msgid "Text size multiplier for text in rendered tables:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:123
msgid "Add &header"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:124
msgid "Header &separation:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:126
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:126
msgid "Header &format:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:127
msgid "&Embed fonts"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:128
msgid "&Serif font family:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:129
msgid "S&ans-serif font family:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/lrf_output_ui.py:130
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:130
msgid "&Monospaced font family:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:41
-#: /home/kovid/work/trunk/src/calibre/gui2/viewer/main.py:114
-#: /home/kovid/work/trunk/src/calibre/gui2/viewer/main_ui.py:195
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41
+#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:114
+#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:195
msgid "Metadata"
msgstr "ميتاداتا"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:43
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:43
msgid ""
"Set the metadata. The output file will contain as much of this metadata as "
"possible."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:161
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:99
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:161
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:101
msgid "Choose cover for "
msgstr "إختار الغلاف لـ "
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:168
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:106
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:108
msgid "Cannot read"
msgstr "لا يمكن القراءة"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:169
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:107
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:169
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109
msgid "You do not have permission to read the file: "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:177
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:184
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:177
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117
msgid "Error reading file"
msgstr "خطأ في قراءة الملف"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:178
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:178
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:118
msgid "
There was an error reading from file:
"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata.py:185
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126
msgid " is not a valid picture"
msgstr " ليست صورة صالحة"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:167
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:395
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:167
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405
msgid "Book Cover"
msgstr "غلاف الكتاب"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:168
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168
msgid "Use cover from &source file"
msgstr "استخدم غلاف من المصدر&"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:169
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:396
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:169
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406
msgid "Change &cover image:"
msgstr "تغيير صورة الغلاف&:"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:170
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:397
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:170
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407
msgid "Browse for an image to use as the cover of this book."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:172
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:356
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366
msgid "&Title: "
msgstr ":ال&عنوان "
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:173
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:357
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367
msgid "Change the title of this book"
msgstr "تغيير عنوان هذا الكتاب"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:174
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:145
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:360
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:158
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370
msgid "&Author(s): "
msgstr "ال&مؤلف: "
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:175
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175
msgid "Author So&rt:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:176
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176
msgid ""
"Change the author(s) of this book. Multiple authors should be separated by a "
"comma"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:177
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:154
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:369
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:167
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379
msgid "&Publisher: "
msgstr "&الناشر: "
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:178
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:370
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380
msgid "Ta&gs: "
msgstr "الو&سوم: "
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:179
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:156
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:371
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:169
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381
msgid ""
"Tags categorize the book. This is particularly useful while searching. "
"
They can be any words or phrases, separated by commas."
@@ -3281,441 +3433,445 @@ msgstr ""
"الوسوم تصنّف الكتاب. هذا يفيد كثيراً في البحث.
ممكن تكون أي كلمة أو "
"مجموعة كلمات، مفرقة بفاصلة."
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:180
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:161
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:374
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:174
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384
msgid "&Series:"
msgstr "&سلسلات:"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:181
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:182
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:162
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:163
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:375
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:376
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:175
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386
msgid "List of known series. You can add new series."
msgstr "قائمة السلسلات المعروفة. بإمكانك إضافة سلسلات جديدة."
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/metadata_ui.py:183
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:381
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391
msgid "Book "
msgstr "الكتاب "
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output.py:20
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:20
msgid "MOBI Output"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output.py:42
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:42
msgid "Default"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output_ui.py:67
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:67
msgid "&Title for Table of Contents:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output_ui.py:68
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:68
msgid "Rescale images for &Palm devices"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output_ui.py:69
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:69
msgid "Use author &sort for author"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output_ui.py:70
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:70
msgid "Disable compression of the file contents"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output_ui.py:71
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:71
msgid "Do not add Table of Contents to book"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output_ui.py:72
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:72
msgid "Kindle options"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output_ui.py:73
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:73
msgid "Periodical masthead font:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/mobi_output_ui.py:74
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:74
msgid "Personal Doc tag:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup.py:35
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup.py:35
msgid "Page Setup"
msgstr "ضبط الصفحة"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:116
msgid "&Output profile:"
msgstr "طور ال&خرج:"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:117
msgid "Profile description"
msgstr "وصف الطور"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:118
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:118
msgid "&Input profile:"
msgstr "طور ال&دخل"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:119
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:119
msgid "Margins"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:120
msgid "&Left:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:122
msgid "&Top:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:124
msgid "&Right:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/page_setup_ui.py:126
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:126
msgid "&Bottom:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_input.py:12
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input.py:12
msgid "PDB Input"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_input_ui.py:32
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_input_ui.py:43
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:32
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46
msgid "Treat each &line as a paragraph"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_input_ui.py:33
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_input_ui.py:44
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:33
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47
msgid "Assume print formatting"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_output.py:16
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:16
msgid "PDB Output"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdb_output_ui.py:36
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:36
msgid "&Format:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_input.py:12
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input.py:12
msgid "PDF Input"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_input_ui.py:39
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:39
msgid "Line &Un-Wrapping Factor:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_input_ui.py:40
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:40
msgid "No &Images"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_output.py:17
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:17
msgid "PDF Output"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_output_ui.py:43
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:43
msgid "&Paper Size:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_output_ui.py:44
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:44
msgid "&Orientation:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/pdf_output_ui.py:45
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:45
msgid "Preserve &aspect ratio of cover"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/rb_output.py:14
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:14
msgid "RB Output"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/regex_builder.py:75
-#: /home/kovid/work/trunk/src/calibre/gui2/ui.py:2067
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:76
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2174
msgid "Choose the format to view"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/regex_builder.py:81
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:82
msgid "Cannot build regex using the GUI builder without a book."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/regex_builder.py:81
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:82
msgid "No formats available"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/regex_builder.py:97
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:100
msgid "Open book"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/regex_builder_ui.py:52
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:52
msgid "Regex Builder"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/regex_builder_ui.py:53
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:53
msgid "Preview"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/regex_builder_ui.py:54
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:54
msgid "Regex:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/regex_builder_ui.py:55
-#: /home/kovid/work/trunk/src/calibre/gui2/filename_pattern_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:55
+#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:117
msgid "Test"
msgstr "تجربة"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/single.py:171
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:171
msgid "Convert"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/single.py:196
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:196
msgid "Options specific to the input format."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/single_ui.py:108
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info_ui.py:64
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:91
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/progress_ui.py:48
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:64
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:91
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:48
msgid "Dialog"
msgstr "حوار"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/single_ui.py:109
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:109
msgid "&Input format:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/single_ui.py:110
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:110
msgid "Use &saved conversion settings for individual books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection.py:17
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:17
msgid ""
"Structure\n"
"Detection"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection.py:19
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:19
msgid ""
"Fine tune the detection of chapter headings and other document structure."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection.py:34
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:34
msgid "Detect chapters at (XPath expression):"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection.py:35
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:35
msgid "Insert page breaks before (XPath expression):"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection.py:37
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:37
msgid "Header regular expression:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection.py:40
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:40
msgid "Footer regular expression:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection.py:56
-#: /home/kovid/work/trunk/src/calibre/gui2/widgets.py:71
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:56
+#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
msgid "Invalid regular expression"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection.py:57
-#: /home/kovid/work/trunk/src/calibre/gui2/widgets.py:72
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57
+#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:72
msgid "Invalid regular expression: %s"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection.py:62
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc.py:38
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:62
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:38
msgid "Invalid XPath"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection.py:63
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc.py:39
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:63
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:39
msgid "The XPath expression %s is invalid."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection_ui.py:60
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:60
msgid "Chapter &mark:"
msgstr "ع&لامة الفصل:"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection_ui.py:61
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:61
msgid "Remove first &image"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection_ui.py:62
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:62
msgid "Insert &metadata as page at start of book"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection_ui.py:63
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:63
msgid "&Preprocess input file to possibly improve structure detection"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection_ui.py:64
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:64
msgid "Remove F&ooter"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/structure_detection_ui.py:65
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:65
msgid "Remove H&eader"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc.py:16
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:16
msgid ""
"Table of\n"
"Contents"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc.py:18
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:18
msgid "Control the creation/conversion of the Table of Contents."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc.py:29
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:29
msgid "Level &1 TOC (XPath expression):"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc.py:30
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:30
msgid "Level &2 TOC (XPath expression):"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc.py:31
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:31
msgid "Level &3 TOC (XPath expression):"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc_ui.py:63
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:63
msgid "Do not add &detected chapters to the Table of Contents"
msgstr "لا تضف فصول مك&شوفة إلى قائمة المحتويات"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc_ui.py:64
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:64
msgid "Number of &links to add to Table of Contents"
msgstr "عدد الوصلات& لإضافتها لقائمة المحتويات"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc_ui.py:65
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:65
msgid "Chapter &threshold"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc_ui.py:66
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:66
msgid "&Force use of auto-generated Table of Contents"
msgstr "ألزم& استخدام قائمة المحتويات المنشئة آلياً"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/toc_ui.py:67
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:67
msgid "TOC &Filter:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_input.py:12
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input.py:12
msgid "TXT Input"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_input_ui.py:45
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:48
msgid "Process using markdown"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_input_ui.py:46
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:49
msgid ""
"
Markdown is a simple markup language for text files, that allows for "
"advanced formatting. To learn more visit markdown."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_input_ui.py:47
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:50
msgid "Do not insert Table of Contents into output text when using markdown"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_output.py:16
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51
+msgid "Preserve &spaces"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:16
msgid "TXT Output"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_output_ui.py:46
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:46
msgid "&Line ending style:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_output_ui.py:48
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:48
msgid "&Maximum line length:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/txt_output_ui.py:49
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:49
msgid "Force maximum line lenght"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xexp_edit_ui.py:50
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info_ui.py:65
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info_ui.py:66
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/choose_format_ui.py:41
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/confirm_delete_ui.py:49
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/password_ui.py:57
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/progress_ui.py:49
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/progress_ui.py:50
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:50
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:65
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:66
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:41
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:49
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:57
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:49
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:50
msgid "TextLabel"
msgstr "تسمية النصّ"
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xexp_edit_ui.py:51
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:51
msgid "Use a wizard to help construct the XPath expression"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:68
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:68
msgid "Match HTML &tags with tag name:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:69
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:69
msgid "*"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:70
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:70
msgid "a"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:71
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:71
msgid "br"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:72
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:72
msgid "div"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:73
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:73
msgid "h1"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:74
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:74
msgid "h2"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:75
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:75
msgid "h3"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:76
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:76
msgid "h4"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:77
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:77
msgid "h5"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:78
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:78
msgid "h6"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:79
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:79
msgid "hr"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:80
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:80
msgid "span"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:81
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:81
msgid "Having the &attribute:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:82
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:82
msgid "With &value:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:83
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:83
msgid "(A regular expression)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/convert/xpath_wizard_ui.py:84
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:84
msgid ""
"
For example, to match all h2 tags that have class=\"chapter\", set tag to "
"h2, attribute to class and value to "
@@ -3725,354 +3881,415 @@ msgid ""
"href=\"http://calibre-ebook.com/user_manual/xpath.html\">XPath Tutorial."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:38
-#: /home/kovid/work/trunk/src/calibre/utils/ipc/job.py:135
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:52
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:77
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:101
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:143
+#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:110
+#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:130
+#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:238
+#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:242
+msgid "Undefined"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:52
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:131
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:133
+msgid "Yes"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:52
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:134
+msgid "No"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:110
+msgid "star(s)"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:111
+msgid "Unrated"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:352
+msgid "Remove all tags"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:373
+msgid "tags to add"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:378
+msgid "tags to remove"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:39
+#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:135
msgid "No details available."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:138
msgid "Device no longer connected."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:208
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:243
msgid "Get device information"
msgstr "احصل على معلومات الجهاز"
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:219
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:269
msgid "Get list of books on device"
msgstr "احصل على قائمة الكتب على الجهاز"
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:229
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:279
msgid "Get annotations from device"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:238
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:288
msgid "Send metadata to device"
msgstr "ارسل الميتاداتا إلى الجهاز"
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:247
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:297
msgid "Upload %d books to device"
msgstr "رفع %d كتاب إلى الجهاز"
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:262
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:312
msgid "Delete books from device"
msgstr "حذف كتب من الجهاز"
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:279
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:329
msgid "Download books from device"
msgstr "تنزيل الكتب من الجهاز"
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:289
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:339
msgid "View book on device"
msgstr "عرض كتاب على الجهاز"
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:296
-msgid "and delete from library"
-msgstr ""
-
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:319
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:373
msgid "Set default send to device action"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:324
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:331
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:333
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:335
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:379
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:386
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:388
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:390
msgid "Email to"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:346
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:353
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:401
msgid "Send to main memory"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:348
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:355
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:403
msgid "Send to storage card A"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:350
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:357
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:405
msgid "Send to storage card B"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:360
-msgid "Send specific format to main memory"
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:410
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:419
+msgid "Main Memory"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:362
-msgid "Send specific format to storage card A"
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:412
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:421
+msgid "Storage Card A"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:364
-msgid "Send specific format to storage card B"
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:414
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:423
+msgid "Storage Card B"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:408
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437
+msgid "Send and delete from library"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:438
+msgid "Send specific format"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477
+msgid "Connect to folder"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:482
+msgid "Disconnect from folder"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:490
msgid "Fetch annotations (experimental)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:518
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:600
msgid "selected to send"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:523
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605
msgid "Choose format to send to device"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:530
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:613
msgid "No device"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:531
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:614
msgid "Cannot send: No device is connected"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:534
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:538
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:617
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:621
msgid "No card"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:535
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:539
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:618
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:622
msgid "Cannot send: Device has no storage card"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:581
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:664
msgid "E-book:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:584
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:667
msgid "Attached, you will find the e-book"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:585
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:177
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:668
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180
msgid "by"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:586
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:669
msgid "in the %s format."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:599
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:682
msgid "Sending email to"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:629
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:636
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:728
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:788
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:904
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:911
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:712
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:719
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:871
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997
msgid "No suitable formats"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:630
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:713
msgid "Auto convert the following books before sending via email?"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:637
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720
msgid ""
"Could not email the following books as no suitable formats were found:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:655
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:738
msgid "Failed to email books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:656
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:739
msgid "Failed to email the following books:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:660
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:743
msgid "Sent by email:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:687
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:770
msgid "News:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:688
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:771
msgid "Attached is the"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:699
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:782
msgid "Sent news to"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:729
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:789
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:905
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:991
msgid "Auto convert the following books before uploading to the device?"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:758
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:841
msgid "Sending catalogs to device."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:819
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:902
msgid "Sending news to device."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:873
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:957
msgid "Sending books to device."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:912
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:998
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/trunk/src/calibre/gui2/device.py:960
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1046
msgid "No space on device"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device.py:961
+#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1047
msgid ""
"
Cannot upload books to device there is no more free space available "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device_drivers/configwidget_ui.py:75
+#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:75
msgid "Select available formats and their order for this device"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device_drivers/configwidget_ui.py:79
+#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:79
msgid "Use sub directories"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/device_drivers/configwidget_ui.py:81
+#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81
msgid "Save &template:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info.py:114
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info.py:115
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info.py:116
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:373
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:1101
-#: /home/kovid/work/trunk/src/calibre/gui2/status.py:93
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:292
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:991
+#: /home/kovid/work/calibre/src/calibre/gui2/status.py:102
msgid "Path"
msgstr "المسار"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info.py:117
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info.py:118
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info.py:119
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info.py:122
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:216
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:372
-#: /home/kovid/work/trunk/src/calibre/gui2/status.py:94
-#: /home/kovid/work/trunk/src/calibre/gui2/tag_view.py:151
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:118
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:291
+#: /home/kovid/work/calibre/src/calibre/gui2/status.py:103
+#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:91
msgid "Formats"
msgstr "التهيئات"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info_ui.py:68
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68
msgid "Fit &cover to view"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info_ui.py:69
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69
msgid "&Previous"
msgstr "ال&سابق"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/book_info_ui.py:70
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70
msgid "&Next"
msgstr "ال&تالي"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/catalog.py:38
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog.py:38
msgid "My Books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/catalog_ui.py:69
-#: /home/kovid/work/trunk/src/calibre/gui2/tools.py:287
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69
+#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:287
msgid "Generate catalog"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/catalog_ui.py:70
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:70
msgid "Generate catalog for {0} books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/catalog_ui.py:71
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:71
msgid "Catalog &format:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/catalog_ui.py:72
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:72
msgid ""
"Catalog &title (existing catalog with the same title will be replaced):"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/catalog_ui.py:73
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:73
msgid "&Send catalog to device automatically"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/catalog_ui.py:74
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:74
msgid "Catalog options"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/choose_format_ui.py:40
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:40
msgid "Choose Format"
msgstr "إختيار التهيئة"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf.py:34
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:33
msgid "Set defaults for conversion of comics (CBR/CBZ files)"
msgstr "ضبط الإفتراضي في تحويل الرسومات (ملفات CBZ/CBR)"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf.py:49
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:48
msgid "Set options for converting %s"
msgstr "ضبط الخيارات لتحويل %s"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:92
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:92
msgid "&Title:"
msgstr ":ال&عنوان"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:93
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:93
msgid "&Author(s):"
msgstr "ال&مؤلف:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/comicconf_ui.py:95
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:95
msgid "&Profile:"
msgstr "&طور:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:170
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comments_dialog_ui.py:41
+msgid "Edit Comments"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:173
msgid "%(plugin_type)s %(plugins)s"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:171
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:174
msgid "plugins"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:180
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:183
msgid ""
"\n"
"Customization: "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:196
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199
msgid "Conversion"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:196
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199
msgid "General"
msgstr "عام"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:196
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199
msgid "Interface"
msgstr "الواجهة"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:197
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200
msgid "Add/Save"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:197
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200
msgid ""
"Email\n"
"Delivery"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:198
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201
msgid "Advanced"
msgstr "متقدّم"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:198
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201
msgid ""
"Content\n"
"Server"
@@ -4080,164 +4297,191 @@ msgstr ""
"محتوى\n"
"خادم"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:198
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201
msgid "Plugins"
msgstr "الملحقات"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:216
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219
msgid "Auto send"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:216
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219
msgid "Email"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:224
msgid "Formats to email. The first matching format will be sent."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:222
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:225
msgid ""
"If checked, downloaded news will be automatically mailed
to this email "
"address (provided it is in one of the listed formats)."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:296
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:299
msgid "new email address"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:472
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:489
msgid "System port selected"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:473
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:490
msgid ""
"The value %d you have chosen for the content server port is a system "
"port. Your operating system may not allow the server to run on this "
"port. To be safe choose a port number larger than 1024."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:492
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:837
-#: /home/kovid/work/trunk/src/calibre/gui2/ui.py:176
-#: /home/kovid/work/trunk/src/calibre/gui2/ui.py:1538
-#: /home/kovid/work/trunk/src/calibre/utils/ipc/job.py:53
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:930
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:190
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1641
+#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53
msgid "Error"
msgstr "خطأ"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:493
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:510
msgid "Failed to install command line tools."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:496
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:513
msgid "Command line tools installed"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:497
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:514
msgid "Command line tools installed in"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:498
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515
msgid ""
"If you move calibre.app, you have to re-install the command line tools."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:549
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:566
msgid "No valid plugin path"
msgstr "مسار الملحق غير صالح"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:550
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:567
msgid "%s is not a valid plugin path"
msgstr "%s ليس مسار لملحق صالح"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:553
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:570
msgid "Choose plugin"
msgstr "إختيار الملحق"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:565
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:582
msgid "Plugin cannot be disabled"
msgstr "لا يمكن تعطيل الملحق"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:566
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:583
msgid "The plugin: %s cannot be disabled"
msgstr "الملحق: %s لا يمكن تعطيله"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:575
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:592
msgid "Plugin not customizable"
msgstr "لا يمكن تخصيص الملحق"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:576
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:593
msgid "Plugin: %s does not need customization"
msgstr "الملحق: %s لا يحتاج التخصيص"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:584
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:601
msgid "Customize"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:622
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:639
msgid "Cannot remove builtin plugin"
msgstr "لم يمكن حذف الملحق المضمن"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:623
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:640
msgid " cannot be removed. It is a builtin plugin. Try disabling it instead."
msgstr " لا يمكن حذفه. هذا ملحق مضمن في البرنامج. حاول تعطيله بدلاً من حذفه."
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:656
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:671
+msgid "You must select a column to delete it"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:676
+msgid "The selected column is not a custom column"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:677
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:48
+msgid "Are you sure?"
+msgstr "هل أنت متأكّد؟"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:678
+msgid "Do you really want to delete column %s and all its data?"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:745
msgid "Error log:"
msgstr "سجل الأخطاء:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:663
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:752
msgid "Access log:"
msgstr "سجل النفاذ:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:691
-#: /home/kovid/work/trunk/src/calibre/gui2/ui.py:701
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:780
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:767
msgid "Failed to start content server"
msgstr "فشل في تشغيل خادم المحتوى"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:715
-#: /home/kovid/work/trunk/src/calibre/gui2/wizard/__init__.py:593
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:804
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:587
msgid "Select location for books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:723
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:811
msgid "Invalid size"
msgstr "حجم غير صالح"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:724
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:812
msgid "The size %s is invalid. must be of the form widthxheight"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:778
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:783
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:865
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:870
msgid "Invalid database location"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:779
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:866
msgid "Invalid database location "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:780
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:867
msgid "
Must be a directory."
msgstr "
يجب أن يكون دليل."
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:784
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:871
msgid "Invalid database location.
Cannot write to "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:818
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:876
+msgid "Must restart"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:877
+msgid ""
+"The changes you made require that Calibre be restarted. Please restart as "
+"soon as practical."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:911
msgid "Checking database integrity"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:838
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:931
msgid "Failed to check database integrity"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:843
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:936
msgid "Some inconsistencies found"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/__init__.py:844
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:937
msgid ""
"The following books had formats listed in the database that are not actually "
"available. The entries for the formats have been removed. You should check "
@@ -4245,32 +4489,32 @@ msgid ""
"folder directly."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:103
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:103
msgid "TabWidget"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:104
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:104
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/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:105
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:105
msgid "Read metadata only from &file name"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:106
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:106
msgid ""
"Swap the firstname and lastname of the author. This affects only metadata "
"read from file names."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:107
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:107
msgid "&Swap author firstname and lastname"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:108
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"
@@ -4281,327 +4525,343 @@ msgid ""
"punctuation, case, etc. Author match is exact."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:112
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:112
msgid ""
"If books with similar titles and authors found, &merge the new files "
"automatically"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:113
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:113
msgid "&Configure metadata from file name"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:114
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:114
msgid "&Adding books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:115
msgid ""
"Here you can control how calibre will save your books when you click the "
"Save to Disk button:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:116
msgid "Save &cover separately"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:117
msgid "Update &metadata in saved copies"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:118
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:118
msgid "Save metadata in &OPF file"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:119
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:119
msgid "Convert non-English characters to &English equivalents"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:120
msgid "Format &dates as:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:121
msgid "File &formats to save:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122
msgid "Replace space with &underscores"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:123
msgid "Change paths to &lowercase"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:124
msgid "&Saving books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:125
msgid ""
"Here you can control how calibre will save your books when you click the "
"Send to Device button. This setting can be overriden for individual devices "
"by customizing the device interface plugins in Preferences->Plugins"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/add_save_ui.py:126
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:126
msgid "Sending to &device"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:504
-#: /home/kovid/work/trunk/src/calibre/gui2/main_ui.py:409
-#: /home/kovid/work/trunk/src/calibre/gui2/viewer/main_ui.py:201
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:527
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:441
+#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201
msgid "Preferences"
msgstr "التفضيلات"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:505
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:528
msgid ""
"&Location of ebooks (The ebooks are stored in folders sorted by author and "
"metadata is stored in the file metadata.db)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:506
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:529
msgid "Browse for the new database location"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:508
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:531
msgid "Show notification when &new version is available"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:509
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:532
msgid "Download &social metadata (tags/ratings/etc.) by default"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:510
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:533
msgid "&Overwrite author and title by default when fetching metadata"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:511
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:534
msgid "Default network &timeout:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:512
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:535
msgid ""
"Set the default timeout for network fetches (i.e. anytime we go out to the "
"internet to get information)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:513
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:536
msgid " seconds"
msgstr " ثانية"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:514
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:537
msgid "Choose &language (requires restart):"
msgstr "إختر ال&لغة (يحتاج إعادة تشغيل):"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:515
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:538
msgid "Normal"
msgstr "عادي"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:516
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:539
msgid "High"
msgstr "مرتفع"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:517
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:540
msgid "Low"
msgstr "منخفض"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:518
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:541
msgid "Job &priority:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:519
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:542
msgid "Preferred &output format:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:520
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:543
msgid "Preferred &input format order:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:523
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:546
msgid "Use &Roman numerals for series number"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:524
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:547
msgid "Enable system &tray icon (needs restart)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:525
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:548
msgid "Show ¬ifications in system tray"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:526
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:549
+msgid "Show &splash screen at startup"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:550
msgid "Show cover &browser in a separate window (needs restart)"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:527
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:551
msgid "Search as you type"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:528
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:552
msgid "Automatically send downloaded &news to ebook reader"
msgstr "إرسال الأخبار& التي تم تنزيلها آلياً إلى قارئ الكتب الإلكترونية"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:529
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:553
msgid "&Delete news from library when it is automatically sent to reader"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:530
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:554
msgid "&Number of covers to show in browse mode (needs restart):"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:531
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555
msgid "Toolbar"
msgstr "شريط الأدوات"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:532
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556
msgid "Large"
msgstr "كبير"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:533
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:557
msgid "Medium"
msgstr "متوسط"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:534
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:558
msgid "Small"
msgstr "صغير"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:535
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:559
msgid "&Button size in toolbar"
msgstr "&حجم الأزرار على شريط الأدوات"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:536
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:560
msgid "Show &text in toolbar buttons"
msgstr "إظهار النص& على أزرار شريط الأدوات"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:537
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561
msgid "Select visible &columns in library view"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:540
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:563
+msgid "Remove a user-defined column"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:565
+msgid "Add a user-defined column"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:567
+msgid "Edit settings of a user-defined column"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:570
msgid "Use internal &viewer for:"
msgstr "استخدم المستعرض& الداخلي في:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:541
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571
msgid "Add an email address to which to send books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:542
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572
msgid "&Add email"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:543
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:573
msgid "Make &default"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:544
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:574
msgid "&Remove email"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:545
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575
msgid ""
"calibre can send your books to you (or your reader) by email. Emails will be "
"automatically sent for downloaded news to all email addresses that have Auto-"
"send checked."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:546
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:576
msgid "&Maximum number of waiting worker processes (needs restart):"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:547
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:577
msgid "&Check database integrity"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:548
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:578
msgid "&Install command line tools"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:549
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:579
msgid "Open calibre &configuration directory"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:550
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:580
msgid "Limit the max. simultaneous jobs to the available CPU &cores"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:551
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:581
msgid "Debug &device detection"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:552
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:582
msgid ""
"calibre contains a network server that allows you to access your book "
"collection using a browser from anywhere in the world. Any changes to the "
"settings will only take effect after a server restart."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:553
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:583
msgid "Server &port:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:554
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/password_ui.py:58
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:212
-#: /home/kovid/work/trunk/src/calibre/gui2/wizard/send_email_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:584
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117
msgid "&Username:"
msgstr "&اسم المستخدم:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:555
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/password_ui.py:59
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:213
-#: /home/kovid/work/trunk/src/calibre/gui2/wizard/send_email_ui.py:119
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:585
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119
msgid "&Password:"
msgstr "&كلمة السرّ"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:556
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:586
msgid ""
"If you leave the password blank, anyone will be able to access your book "
"collection using the web interface."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:557
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:587
msgid ""
"The maximum size (widthxheight) for displayed covers. Larger covers are "
"resized. "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:558
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:588
msgid "Max. &cover size:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:559
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/password_ui.py:60
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:214
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:589
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:60
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214
msgid "&Show password"
msgstr "إظهار& كلمة السرّ"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:560
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:590
msgid "Max. &OPDS items per query:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:561
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:591
msgid "&Start Server"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:562
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:592
msgid "St&op Server"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:563
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:593
msgid "&Test Server"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:564
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:594
msgid "Run server &automatically on startup"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:565
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:595
msgid "View &server logs"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:566
-#: /home/kovid/work/trunk/src/calibre/gui2/wizard/stanza_ui.py:46
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:596
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46
msgid ""
"
Remember to leave calibre running as the server only runs as long as "
"calibre is running.\n"
@@ -4611,121 +4871,234 @@ msgid ""
"the IP address of the computer calibre is running on."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:568
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:598
msgid ""
"Here you can customize the behavior of Calibre by controlling what plugins "
"it uses."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:569
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:599
msgid "Enable/&Disable plugin"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:570
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:600
msgid "&Customize plugin"
msgstr "ت&خصيص الملحق"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:571
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:601
msgid "&Remove plugin"
msgstr "&حذف الملحق"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:572
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:602
msgid "Add new plugin"
msgstr "إضافة ملحق جديد"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:573
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:603
msgid "Plugin &file:"
msgstr "&ملف الملحق:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/config_ui.py:575
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:605
msgid "&Add"
msgstr "&إضافة"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:125
msgid "Create Tag-based Column"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:126
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:126
msgid "Lookup name"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:127
msgid "Column heading"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:128
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:128
msgid "Column type"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:129
msgid "Use brackets"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:130
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:130
msgid "Values can be edited"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:131
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:133
-msgid "Yes"
-msgstr ""
-
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:132
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:134
-msgid "No"
-msgstr ""
-
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:135
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:135
msgid "Text"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:136
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:136
msgid "Number"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:137
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:177
-#: /home/kovid/work/trunk/src/calibre/gui2/library.py:1162
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:137
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:27
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:50
+#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:830
+#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:537
msgid "Date"
msgstr "تاريخ"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:138
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:138
msgid "Tag on book"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:139
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:139
msgid "Explanation text added in create_ct_column.py"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:140
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:140
msgid "Create and edit tag-based columns"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/device_debug.py:21
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:18
+msgid "Text, column shown in the tag browser"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:21
+msgid "Comma separated text, like tags, shown in the tag browser"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:24
+msgid "Long text, like comments, not shown in the tag browser"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:29
+msgid "Floating point numbers"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:31
+msgid "Integers"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:33
+msgid "Ratings, shown with stars"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:36
+msgid "Yes/No"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:60
+msgid "No column selected"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:61
+msgid "No column has been selected"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:65
+msgid "Selected column is not a user-defined column"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:96
+msgid "No lookup name was provided"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:98
+msgid ""
+"The label must contain only letters and digits, and start with a letter"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:107
+msgid "No column heading was provided"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:113
+msgid "The lookup name %s is already used"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:123
+msgid "The heading %s is already used"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:125
+msgid ""
+"The lookup name must be lower case and cannot contain \":\"s or spaces"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:101
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:117
+msgid "Create or edit custom columns"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:102
+msgid "&Lookup name"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:103
+msgid "Column &heading"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:104
+msgid ""
+"Used for searching the column. Must contain only digits and lower case "
+"letters."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:105
+msgid ""
+"Column heading in the library view and category name in the tag browser"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:106
+msgid "Column &type"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:107
+msgid "What kind of information will be kept in the column."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:108
+msgid ""
+"
Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's "
+"for year.
\n"
+"
For example:\n"
+"
\n"
+"- ddd, d MMM yyyy gives Mon, 5 Jan 2010
- \n"
+"
- dd MMMM yy gives 05 January 10
\n"
+"
"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:114
+msgid "Use MMM yyyy for month + year, yyyy for year only"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:115
+msgid "Default: dd MMM yyyy."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column_ui.py:116
+msgid "Format for &dates"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:21
msgid "Getting debug information"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/device_debug.py:22
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:22
msgid "Copy to &clipboard"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/device_debug.py:24
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:24
msgid "Debug device detection"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/save_template.py:44
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:44
msgid "Invalid template"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/save_template.py:45
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:45
msgid "The template %s is invalid:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/save_template_ui.py:42
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:42
msgid "Save &template"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/save_template_ui.py:43
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:43
msgid ""
"By adjusting the template below, you can control what folders the files are "
"saved in and what filenames they are given. You can use the / character to "
@@ -4734,68 +5107,64 @@ msgid ""
"by the empty string."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/save_template_ui.py:44
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:44
msgid "Available variables:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/config/social.py:34
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/social.py:34
msgid "Downloading social metadata, please wait..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/confirm_delete_ui.py:48
-msgid "Are you sure?"
-msgstr "هل أنت متأكّد؟"
-
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/conversion_error_ui.py:42
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:42
msgid "ERROR"
msgstr "خطأ"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:63
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63
msgid "Author Sort"
msgstr "ترتيب المؤلف"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:65
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65
msgid "ISBN"
msgstr "ISBN"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:165
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:165
msgid "Finding metadata..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:179
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:179
msgid "Could not find metadata"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:180
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:180
msgid "The metadata download seems to have stalled. Try again later."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:189
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:189
msgid "Warning"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:190
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:190
msgid "Could not fetch metadata from:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:194
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:194
msgid "No metadata found"
msgstr "لم يوجد ميتاداتا"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata.py:195
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:195
msgid ""
"No metadata found, try adjusting the title and author or the ISBN key."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata_ui.py:85
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:85
msgid "Fetch metadata"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata_ui.py:86
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:86
msgid ""
"
calibre can find metadata for your books from two locations: Google "
"Books and isbndb.com.
To use isbndb.com you must sign up for a "
@@ -4803,128 +5172,123 @@ msgid ""
"below."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata_ui.py:87
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:87
msgid "&Access Key:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata_ui.py:88
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:88
msgid "Fetch"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata_ui.py:89
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:89
msgid "Matches"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90
msgid ""
"Select the book that most closely matches your copy from the list below"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91
msgid "Download &social metadata (tags/rating/etc.) for the selected book"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92
msgid "Overwrite author and title with author and title of selected book"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/job_view_ui.py:37
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:37
msgid "Details of job"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/jobs_ui.py:44
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:44
msgid "Active Jobs"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/jobs_ui.py:45
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:45
msgid "&Stop selected job"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/jobs_ui.py:46
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:46
msgid "Show job &details"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/jobs_ui.py:47
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:47
msgid "Stop &all jobs"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk.py:22
-msgid "Editing meta information for %d books"
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:24
+msgid "Editing meta information for %d books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:143
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:157
msgid "Edit Meta information"
msgstr "تحرير معلومات الميتا"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:144
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:355
-msgid "Meta information"
-msgstr "معلومات الميتا"
-
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:146
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:159
msgid "A&utomatically set author sort"
msgstr "ضبط& ترتيب المؤلف آلياً"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:147
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160
msgid "Author s&ort: "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:148
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:362
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:161
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372
msgid ""
"Specify how the author(s) of this book should be sorted. For example Charles "
"Dickens should be sorted as Dickens, Charles."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:149
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:365
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:162
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375
msgid "&Rating:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:150
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:151
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:366
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:367
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:163
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:164
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377
msgid "Rating of this book. 0-5 stars"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:152
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165
msgid "No change"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:153
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:368
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378
msgid " stars"
msgstr " نجمة"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:155
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168
msgid "Add ta&gs: "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:157
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:158
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:372
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:373
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383
msgid "Open Tag Editor"
msgstr "فتح محرر الوسوم"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:159
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172
msgid "&Remove tags:"
msgstr "حذف& الوسوم:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173
msgid "Comma separated list of tags to remove from the books. "
msgstr "قائمة من الوسوم مفرقة بالفاصلة لحذفها من الكتب. "
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:164
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177
msgid "Remove &format:"
msgstr "حذف الت&هيئة:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:178
msgid "&Swap title and author"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179
msgid ""
"Selected books will be automatically numbered,\n"
"in the order you selected them.\n"
@@ -4932,460 +5296,586 @@ msgid ""
"Book A will have series number 1 and Book B series number 2."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183
msgid "Automatically number books in this series"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184
+msgid ""
+"Remove stored conversion settings for the selected books.\n"
+"\n"
+"Future conversion of these books will use the default settings."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:187
+msgid "Remove &stored conversion settings for the selected books"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412
+msgid "&Basic metadata"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413
+msgid "&Custom metadata"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125
msgid "Not a valid picture"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:136
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:138
msgid "Choose formats for "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:137
-#: /home/kovid/work/trunk/src/calibre/gui2/ui.py:1284
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:139
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1382
msgid "Books"
msgstr "كتب"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:165
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:167
msgid "No permission"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:166
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:168
msgid "You do not have permission to read the following files:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:193
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:194
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:196
msgid "No format selected"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:207
msgid "Could not read metadata"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:206
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:208
msgid "Could not read metadata from %s format"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:254
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:260
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:256
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:262
msgid "Could not read cover"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:255
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:257
msgid "Could not read cover from %s format"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:261
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:263
msgid "The cover in the %s format is invalid"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:298
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:300
msgid "Abort the editing of all remaining books"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:413
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:418
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:442
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:447
msgid "This ISBN number is valid"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:421
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:450
msgid "This ISBN number is invalid"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:517
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:546
msgid "Downloading cover..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:529
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:534
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:540
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:558
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:563
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:569
msgid "Cannot fetch cover"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:530
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:541
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:559
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:570
msgid "Could not fetch cover.
"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:531
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:560
msgid "The download timed out."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:535
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:564
msgid "Could not find cover for this book. Try specifying the ISBN first."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:547
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:576
msgid "Bad cover"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:548
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:577
msgid "The cover is not a valid picture"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:581
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:610
msgid "There were errors"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:582
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611
msgid "There were errors downloading social metadata"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:611
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:640
msgid "Cannot fetch metadata"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:612
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641
msgid "You must specify at least one of ISBN, Title, Authors or Publisher"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:681
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:712
msgid "Permission denied"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single.py:682
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:713
msgid "Could not open %s. Is it being used by another program?"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:354
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364
msgid "Edit Meta Information"
msgstr "تحرير معلومات الميتا"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:358
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365
+msgid "Meta information"
+msgstr "معلومات الميتا"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368
msgid "Swap the author and title"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:361
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371
msgid "Author S&ort: "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:363
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373
msgid ""
"Automatically create the author sort entry based on the current author entry"
msgstr "ينشئ مدخل ترتيب المؤلف حسب مدخل المؤلف الحالي"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:377
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387
msgid "Remove unused series (Series that have no books)"
msgstr "حذف سلسلات غير مستخدمة (سلسلات التي لا تحتوي على كتب)"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:379
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389
msgid "IS&BN:"
msgstr "IS&BN:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:380
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390
msgid "Publishe&d:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:383
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393
msgid "dd MMM yyyy"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:384
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394
msgid "&Date:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:385
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395
msgid "&Comments"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:386
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396
msgid "&Fetch metadata from server"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:387
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397
msgid "Available Formats"
msgstr "التهيئات المتوفرة"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:388
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398
msgid "Add a new format for this book to the database"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:390
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400
msgid "Remove the selected formats for this book from the database."
msgstr "حذف التهيئات المختارة لهذا الكتاب من قاعدة البيانات."
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:392
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402
msgid "Set the cover for the book from the selected format"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:394
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404
msgid "Update metadata from the metadata in the selected format"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:399
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409
msgid "Reset cover to default"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/metadata_single_ui.py:401
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411
msgid "Download &cover"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/password_ui.py:56
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56
msgid "Password needed"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/progress.py:52
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:52
msgid "Aborting..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor.py:54
+msgid ""
+"The current saved search will be permanently deleted. Are you sure?"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:83
+msgid "Saved Search Editor"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:84
+msgid "Saved Search: "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:85
+msgid "Select a saved search to edit"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:86
+msgid "Delete this selected saved search"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88
+msgid "Enter a new saved search name."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89
+msgid "Add the new saved search"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91
+msgid "Change the contents of the saved search"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:119
msgid "Need username and password"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:120
msgid "You must provide a username and/or password to use this news source."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:172
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:171
msgid "Created by: "
msgstr "أنشأه: "
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:179
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:178
msgid "Last downloaded: never"
msgstr "آخر تنزيل: لم ينزّل من قبل"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:194
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193
msgid "%d days, %d hours and %d minutes ago"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:196
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:195
msgid "Last downloaded"
msgstr "آخر تنزيل"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:217
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:192
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:216
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:192
msgid "Schedule news download"
msgstr "جدولة تنزيل الأخبار"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:220
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:219
msgid "Add a custom news source"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:225
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:224
msgid "Download all scheduled new sources"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:322
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:321
msgid "No internet connection"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler.py:323
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:322
msgid "Cannot download news as no internet connection is active"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:193
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:278
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:193
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:278
msgid "Recipes"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:194
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:194
msgid "Download all scheduled recipes at once"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:195
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:195
msgid "Download &all scheduled"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:196
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:196
msgid "blurb"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:197
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197
msgid "&Schedule for download:"
msgstr "ج&دولة للتنزيل:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:198
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:208
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208
msgid "Every "
msgstr "كل "
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:199
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199
msgid "day"
msgstr "اليوم"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:200
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200
msgid "Monday"
msgstr "الأثنين"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:201
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201
msgid "Tuesday"
msgstr "الثلاثاء"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:202
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202
msgid "Wednesday"
msgstr "الأربعاء"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:203
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203
msgid "Thursday"
msgstr "الخميس"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:204
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204
msgid "Friday"
msgstr "الجمعة"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:205
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205
msgid "Saturday"
msgstr "السبت"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:206
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206
msgid "Sunday"
msgstr "الأحد"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:207
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207
msgid "at"
msgstr "في"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:209
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209
msgid ""
"Interval at which to download this recipe. A value of zero means that the "
"recipe will be downloaded every hour."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:210
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:222
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:263
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:263
msgid " days"
msgstr " يوم"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:211
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211
msgid "&Account"
msgstr "&حساب"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:215
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215
msgid "For the scheduling to work, you must leave calibre running."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:216
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216
msgid "&Schedule"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:217
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217
msgid "Add &title as tag"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:218
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218
msgid "&Extra tags:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:219
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219
msgid "&Advanced"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:220
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220
msgid "&Download now"
msgstr "&تنزيل الآن"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:221
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221
msgid ""
"Delete downloaded news older than the specified number of days. Set to zero "
"to disable."
msgstr ""
"حذف الأخبار المنزّلة التي أقدم من العدد المخصص من الأيام. اضبطه بـ0 لتعطيله."
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/scheduler_ui.py:223
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223
msgid "Delete downloaded news older than "
msgstr "حذف أخبار أقدم من "
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_item_ui.py:36
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:36
msgid "contains"
msgstr "يحتوي على"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_item_ui.py:37
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:37
msgid "The text to search for. It is interpreted as a regular expression."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_item_ui.py:38
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:38
msgid ""
"
Negate this match. That is, only return results that do not match "
"this query."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_item_ui.py:39
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:39
msgid "Negate"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:113
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:113
msgid "Advanced Search"
msgstr "بحث متقدم"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:114
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:114
msgid "Find entries that have..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:115
msgid "&All these words:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:116
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:116
msgid "This exact &phrase:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:117
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:117
msgid "&One or more of these words:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:118
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118
msgid "But dont show entries that have..."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:119
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119
msgid "Any of these &unwanted words:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:120
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120
msgid "What kind of match to use:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:121
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121
msgid "Contains: the word or phrase matches anywhere in the metadata"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:122
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122
msgid "Equals: the word or phrase must match an entire metadata field"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123
msgid ""
"Regular expression: the expression must match anywhere in the metadata"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124
msgid " "
msgstr " "
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/search_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125
msgid ""
"See the User Manual for more help"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/select_formats.py:45
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45
msgid "Choose formats"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor.py:66
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46
+#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:72
+msgid "Authors"
+msgstr "المؤلفون"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:46
+#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:101
+msgid "Publishers"
+msgstr "الناشرون"
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:110
+msgid " (not on any book)"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:162
+msgid ""
+"The current tag category will be permanently deleted. Are you sure?"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:153
+msgid "User Categories Editor"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:154
+msgid "A&vailable items"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:155
+msgid "Apply tags to current tag category"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:157
+msgid "A&pplied items"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158
+msgid "Unapply (remove) tag from current tag category"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160
+msgid "Category name: "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161
+msgid "Select a category to edit"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162
+msgid "Delete this selected tag category"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164
+msgid "Enter a new category name. Select the kind before adding it."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:165
+msgid "Add the new category"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167
+msgid "Category filter: "
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168
+msgid "Select the content kind of the new category"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:68
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:93
msgid "Are your sure?"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor.py:67
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:69
msgid ""
"The following tags are used by one or more books. Are you certain you want "
"to delete them?"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123
msgid "Tag Editor"
msgstr "محرر الوسوم"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:124
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124
msgid "A&vailable tags"
msgstr "الوسوم المت&وفرة"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125
msgid ""
"Delete tag from database. This will unapply the tag from all books and then "
"remove it from the database."
@@ -5393,23 +5883,23 @@ msgstr ""
"حذف الوسم من قائمة البيانات. هذا سيحذف الوسم من الكتب وثم سيحذف الوسم تماماً "
"من القاعدة."
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127
msgid "Apply tag to current book"
msgstr "علّم الكتاب الحالي بالوسم"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129
msgid "A&pplied tags"
msgstr "الوسوم الم&علّمة"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:130
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130
msgid "Unapply (remove) tag from current book"
msgstr "حذف الوسم من الكتاب الحالي"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132
msgid "&Add tag:"
msgstr "إض&افة وسم:"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:133
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133
msgid ""
"If the tag you want is not in the available list, you can add it here. "
"Accepts a comma separated list of tags."
@@ -5417,135 +5907,195 @@ msgstr ""
"إذا الوسم الذي تريده ليس متوفر، بإمكانك إضافته هنا. يقبل قائمة من الوسوم "
"مفرّقة بفاصلات."
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/tag_editor_ui.py:134
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134
msgid "Add tag to available tags and apply it to current book"
msgstr "إضافة وسم إلى قائمة الوسوم المتوفرة وعلّم الكتاب الحالي به"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/test_email_ui.py:51
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:60
+#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:429
+msgid "Item is blank"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:61
+#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:430
+msgid "An item cannot be set to nothing. Delete it instead."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:66
+msgid "Item already used"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:67
+msgid "The item %s is already used."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:79
+msgid "No item selected"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:80
+msgid "You must select one item from the list of Available items."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:89
+msgid "No items selected"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:90
+msgid "You must select at least one items from the list."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:94
+msgid "Are you certain you want to delete the following items?"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:71
+msgid "Category Editor"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:72
+msgid "Items in use"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:73
+msgid ""
+"Delete item from database. This will unapply the item from all books and "
+"then remove it from the database."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:75
+msgid "Rename the item in every book where it is used."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77
+msgid "Ctrl+S"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51
msgid "Test email settings"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/test_email_ui.py:52
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:52
msgid "Send test mail from %s to:"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/test_email_ui.py:53
-#: /home/kovid/work/trunk/src/calibre/gui2/filename_pattern_ui.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:53
+#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115
msgid "&Test"
msgstr "&تجربة"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:127
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:127
msgid "No recipe selected"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:132
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:132
msgid "The attached file: %s is a recipe to download %s."
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:133
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:133
msgid "Recipe for "
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:150
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:161
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:255
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:150
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:161
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:255
msgid "Switch to Advanced mode"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:156
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:164
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:156
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
msgid "Switch to Basic mode"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:174
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:174
msgid "Feed must have a title"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:175
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:175
msgid "The feed must have a title"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:179
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
msgid "Feed must have a URL"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:180
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
msgid "The feed %s must have a URL"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:185
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185
msgid "Already exists"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:186
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:186
msgid "This feed has already been added to the recipe"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:227
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:236
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:286
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:227
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:286
msgid "Invalid input"
msgstr "دخل غير صالح"
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:228
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:237
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:287
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:237
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:287
msgid "
Could not create recipe. Error:
%s"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:241
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:263
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:290
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:241
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:263
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:290
msgid "Replace recipe?"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:242
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:264
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:291
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:242
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:264
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:291
msgid "A custom recipe named %s already exists. Do you want to replace it?"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:257
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:257
msgid "Pick recipe"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:257
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:257
msgid "Pick the recipe to customize"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles.py:277
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:277
msgid "Choose a recipe file"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:248
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:248
msgid "Add custom news source"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:249
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:249
msgid "Available user recipes"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:250
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:250
msgid "Add/Update &recipe"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:251
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:251
msgid "&Remove recipe"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:252
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:252
msgid "&Share recipe"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:253
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:253
msgid "Customize &builtin recipe"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:254
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:254
msgid "&Load recipe from file"
msgstr ""
-#: /home/kovid/work/trunk/src/calibre/gui2/dialogs/user_profiles_ui.py:256
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:256
msgid ""
"