mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
KG updates
This commit is contained in:
commit
1a6134ff7c
@ -1,15 +1,16 @@
|
||||
__license__ = 'GPL v3'
|
||||
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
|
||||
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>, Rogelio Domínguez <rogelio.dominguez@gmail.com>'
|
||||
'''
|
||||
www.jornada.unam.mx
|
||||
'''
|
||||
|
||||
import re
|
||||
from calibre import strftime
|
||||
from calibre.web.feeds.news import BasicNewsRecipe
|
||||
|
||||
class LaJornada_mx(BasicNewsRecipe):
|
||||
title = 'La Jornada (Mexico)'
|
||||
__author__ = 'Darko Miletic'
|
||||
__author__ = 'Darko Miletic/Rogelio Domínguez'
|
||||
description = 'Noticias del diario mexicano La Jornada'
|
||||
publisher = 'DEMOS, Desarrollo de Medios, S.A. de C.V.'
|
||||
category = 'news, Mexico'
|
||||
@ -20,12 +21,26 @@ class LaJornada_mx(BasicNewsRecipe):
|
||||
use_embedded_content = False
|
||||
language = 'es'
|
||||
remove_empty_feeds = True
|
||||
cover_url = strftime("http://www.jornada.unam.mx/%Y/%m/%d/planitas/portadita.jpg")
|
||||
cover_url = strftime("http://www.jornada.unam.mx/%Y/%m/%d/portada.pdf")
|
||||
masthead_url = 'http://www.jornada.unam.mx/v7.0/imagenes/la-jornada-trans.png'
|
||||
publication_type = 'newspaper'
|
||||
extra_css = """
|
||||
body{font-family: "Times New Roman",serif }
|
||||
.cabeza{font-size: xx-large; font-weight: bold }
|
||||
.credito-articulo{font-size: 1.3em}
|
||||
.documentFirstHeading{font-size: xx-large; font-weight: bold }
|
||||
.credito-articulo{font-variant: small-caps; font-weight: bold }
|
||||
.foto{text-align: center}
|
||||
.pie-foto{font-size: 0.9em}
|
||||
.credito{font-weight: bold; margin-left: 1em}
|
||||
.credito-autor{font-variant: small-caps; font-weight: bold }
|
||||
.credito-titulo{text-align: right}
|
||||
.hemero{text-align: right; font-size: 0.9em; margin-bottom: 0.5em }
|
||||
.loc{font-weight: bold}
|
||||
.carton{text-align: center}
|
||||
.credit{font-weight: bold}
|
||||
.text{margin-top: 1.4em}
|
||||
p.inicial{display: inline; font-size: xx-large; font-weight: bold}
|
||||
p.s-s{display: inline; text-indent: 0}
|
||||
"""
|
||||
|
||||
conversion_options = {
|
||||
@ -35,15 +50,21 @@ class LaJornada_mx(BasicNewsRecipe):
|
||||
, 'language' : language
|
||||
}
|
||||
|
||||
preprocess_regexps = [
|
||||
(re.compile( r'<div class="inicial">(.*)</div><p class="s-s">'
|
||||
,re.DOTALL|re.IGNORECASE)
|
||||
,lambda match: '<p class="inicial">' + match.group(1) + '</p><p class="s-s">')
|
||||
]
|
||||
|
||||
keep_only_tags = [
|
||||
dict(name='div', attrs={'class':['documentContent','cabeza','sumarios','text']})
|
||||
dict(name='div', attrs={'class':['documentContent','cabeza','sumarios','credito-articulo','text','carton']})
|
||||
,dict(name='div', attrs={'id':'renderComments'})
|
||||
]
|
||||
remove_tags = [dict(name='div', attrs={'class':'buttonbar'})]
|
||||
remove_tags = [dict(name='div', attrs={'class':['buttonbar','comment-cont']})]
|
||||
|
||||
feeds = [
|
||||
(u'Ultimas noticias' , u'http://www.jornada.unam.mx/ultimas/news/RSS' )
|
||||
,(u'Opinion' , u'http://www.jornada.unam.mx/rss/opinion.xml' )
|
||||
(u'Opinion' , u'http://www.jornada.unam.mx/rss/opinion.xml' )
|
||||
,(u'Cartones' , u'http://www.jornada.unam.mx/rss/cartones.xml' )
|
||||
,(u'Politica' , u'http://www.jornada.unam.mx/rss/politica.xml' )
|
||||
,(u'Economia' , u'http://www.jornada.unam.mx/rss/economia.xml' )
|
||||
,(u'Mundo' , u'http://www.jornada.unam.mx/rss/mundo.xml' )
|
||||
@ -55,6 +76,7 @@ class LaJornada_mx(BasicNewsRecipe):
|
||||
,(u'Gastronomia' , u'http://www.jornada.unam.mx/rss/gastronomia.xml' )
|
||||
,(u'Espectaculos' , u'http://www.jornada.unam.mx/rss/espectaculos.xml' )
|
||||
,(u'Deportes' , u'http://www.jornada.unam.mx/rss/deportes.xml' )
|
||||
,(u'Ultimas noticias' , u'http://www.jornada.unam.mx/ultimas/news/RSS' )
|
||||
]
|
||||
|
||||
def preprocess_html(self, soup):
|
||||
@ -62,3 +84,7 @@ class LaJornada_mx(BasicNewsRecipe):
|
||||
del item['style']
|
||||
return soup
|
||||
|
||||
def get_article_url(self, article):
|
||||
rurl = article.get('link', None)
|
||||
return rurl.rpartition('&partner=')[0]
|
||||
|
||||
|
@ -22,10 +22,19 @@ class NrcNextRecipe(BasicNewsRecipe):
|
||||
|
||||
remove_tags = []
|
||||
remove_tags.append(dict(name = 'div', attrs = {'class' : 'meta'}))
|
||||
remove_tags.append(dict(name = 'p', attrs = {'class' : 'meta'}))
|
||||
remove_tags.append(dict(name = 'div', attrs = {'class' : 'datumlabel'}))
|
||||
remove_tags.append(dict(name = 'div', attrs = {'class' : 'sharing-is-caring'}))
|
||||
remove_tags.append(dict(name = 'div', attrs = {'class' : 'navigation'}))
|
||||
remove_tags.append(dict(name = 'div', attrs = {'class' : 'reageer'}))
|
||||
remove_tags.append(dict(name = 'div', attrs = {'class' : 'comment odd alt thread-odd thread-alt depth-1 reactie '}))
|
||||
remove_tags.append(dict(name = 'div', attrs = {'class' : 'comment even thread-even depth-1 reactie '}))
|
||||
remove_tags.append(dict(name = 'ul', attrs = {'class' : 'cats single'}))
|
||||
remove_tags.append(dict(name = 'ul', attrs = {'class' : 'cats onderwerpen'}))
|
||||
remove_tags.append(dict(name = 'ul', attrs = {'class' : 'cats rubrieken'}))
|
||||
remove_tags.append(dict(name = 'h3', attrs = {'class' : 'reacties'}))
|
||||
|
||||
|
||||
|
||||
extra_css = '''
|
||||
body {font-family: verdana, arial, helvetica, geneva, sans-serif; text-align: left;}
|
||||
@ -41,20 +50,18 @@ class NrcNextRecipe(BasicNewsRecipe):
|
||||
feeds[u'koken'] = u'http://www.nrcnext.nl/koken/'
|
||||
feeds[u'geld & werk'] = u'http://www.nrcnext.nl/geld-en-werk/'
|
||||
feeds[u'vandaag'] = u'http://www.nrcnext.nl'
|
||||
feeds[u'city life in afrika'] = u'http://www.nrcnext.nl/city-life-in-afrika/'
|
||||
# feeds[u'city life in afrika'] = u'http://www.nrcnext.nl/city-life-in-afrika/'
|
||||
answer = []
|
||||
articles = {}
|
||||
indices = []
|
||||
|
||||
for index, feed in feeds.items() :
|
||||
soup = self.index_to_soup(feed)
|
||||
|
||||
for post in soup.findAll(True, attrs={'class' : 'post'}) :
|
||||
for post in soup.findAll(True, attrs={'class' : 'post '}) :
|
||||
# Find the links to the actual articles and rember the location they're pointing to and the title
|
||||
a = post.find('a', attrs={'rel' : 'bookmark'})
|
||||
href = a['href']
|
||||
title = self.tag_to_string(a)
|
||||
|
||||
if index == 'columnisten' :
|
||||
# In this feed/page articles can be written by more than one author.
|
||||
# It is nice to see their names in the titles.
|
||||
@ -74,7 +81,8 @@ class NrcNextRecipe(BasicNewsRecipe):
|
||||
indices.append(index)
|
||||
|
||||
# Now, sort the temporary list of feeds in the order they appear on the website
|
||||
indices = self.sort_index_by(indices, {u'columnisten' : 1, u'koken' : 3, u'geld & werk' : 2, u'vandaag' : 0, u'city life in afrika' : 4})
|
||||
# indices = self.sort_index_by(indices, {u'columnisten' : 1, u'koken' : 3, u'geld & werk' : 2, u'vandaag' : 0, u'city life in afrika' : 4})
|
||||
indices = self.sort_index_by(indices, {u'columnisten' : 1, u'koken' : 3, u'geld & werk' : 2, u'vandaag' : 0})
|
||||
# Apply this sort order to the actual list of feeds and articles
|
||||
answer = [(key, articles[key]) for key in indices if articles.has_key(key)]
|
||||
|
||||
|
@ -26,13 +26,13 @@ class NYTimes(BasicNewsRecipe):
|
||||
#TO LOGIN
|
||||
def get_browser(self):
|
||||
br = BasicNewsRecipe.get_browser()
|
||||
br.open('http://content.nejm.org/cgi/login?uri=/')
|
||||
br.select_form(nr=0)
|
||||
br['username'] = self.username
|
||||
br['code'] = self.password
|
||||
br.open('http://www.nejm.org/action/showLogin?uri=http://www.nejm.org/')
|
||||
br.select_form(name='frmLogin')
|
||||
br['login'] = self.username
|
||||
br['password'] = self.password
|
||||
response = br.submit()
|
||||
raw = response.read()
|
||||
if '<strong>Welcome' not in raw:
|
||||
if '>Sign Out<' not in raw:
|
||||
raise Exception('Login failed. Check your username and password')
|
||||
return br
|
||||
|
||||
|
@ -374,6 +374,13 @@ class InterfaceActionBase(Plugin): # {{{
|
||||
|
||||
class PreferencesPlugin(Plugin): # {{{
|
||||
|
||||
'''
|
||||
A plugin representing a widget displayed in the Preferences dialog.
|
||||
|
||||
This plugin has only one important method :meth:`create_widget`. The
|
||||
various fields of the plugin control how it is categorized in the UI.
|
||||
'''
|
||||
|
||||
supported_platforms = ['windows', 'osx', 'linux']
|
||||
author = 'Kovid Goyal'
|
||||
type = _('Preferences')
|
||||
@ -409,7 +416,8 @@ class PreferencesPlugin(Plugin): # {{{
|
||||
def create_widget(self, parent=None):
|
||||
'''
|
||||
Create and return the actual Qt widget used for setting this group of
|
||||
preferences. The widget must implement the ConfigWidgetInterface.
|
||||
preferences. The widget must implement the
|
||||
:class:`calibre.gui2.preferences.ConfigWidgetInterface`.
|
||||
|
||||
The default implementation uses :attr:`config_widget` to instantiate
|
||||
the widget.
|
||||
|
@ -177,7 +177,16 @@ class ChooseLibraryAction(InterfaceAction):
|
||||
return error_dialog(self.gui, _('Already exists'),
|
||||
_('The folder %s already exists. Delete it first.') %
|
||||
newloc, show=True)
|
||||
try:
|
||||
os.rename(loc, newloc)
|
||||
except:
|
||||
import traceback
|
||||
error_dialog(self.gui, _('Rename failed'),
|
||||
_('Failed to rename the library at %s. '
|
||||
'The most common cause for this is if one of the files'
|
||||
' in the library is open in another program.') % loc,
|
||||
det_msg=traceback.format_exc(), show=True)
|
||||
return
|
||||
self.stats.rename(location, newloc)
|
||||
self.build_menus()
|
||||
|
||||
|
@ -42,15 +42,4 @@ class PreferencesAction(InterfaceAction):
|
||||
d = Preferences(self.gui, initial_plugin=initial_plugin)
|
||||
d.show()
|
||||
|
||||
if d.committed:
|
||||
self.gui.must_restart_before_config = d.must_restart
|
||||
self.gui.tags_view.set_new_model() # in case columns changed
|
||||
self.gui.tags_view.recount()
|
||||
self.gui.create_device_menu()
|
||||
self.gui.set_device_menu_items_state(bool(self.gui.device_connected))
|
||||
self.gui.tool_bar.build_bar()
|
||||
self.gui.build_context_menus()
|
||||
self.gui.tool_bar.apply_settings()
|
||||
|
||||
|
||||
|
||||
|
@ -1306,16 +1306,26 @@ class DeviceMixin(object): # {{{
|
||||
self.library_view.model().refresh_ids(list(changed))
|
||||
|
||||
def book_on_device(self, id, format=None, reset=False):
|
||||
loc = [None, None, None]
|
||||
'''
|
||||
Return an indication of whether the given book represented by its db id
|
||||
is on the currently connected device. It returns a 4 element list. The
|
||||
first three elements represent memory locations main, carda, and cardb,
|
||||
and are true if the book is identifiably in that memory. The fourth
|
||||
is the a count of how many instances of the book were found across all
|
||||
the memory locations.
|
||||
'''
|
||||
loc = [None, None, None, 0]
|
||||
|
||||
if reset:
|
||||
self.book_db_title_cache = None
|
||||
self.book_db_uuid_cache = None
|
||||
self.book_db_id_counts = None
|
||||
return
|
||||
|
||||
if self.book_db_title_cache is None:
|
||||
self.book_db_title_cache = []
|
||||
self.book_db_uuid_cache = []
|
||||
self.book_db_id_counts = {}
|
||||
for i, l in enumerate(self.booklists()):
|
||||
self.book_db_title_cache.append({})
|
||||
self.book_db_uuid_cache.append(set())
|
||||
@ -1333,6 +1343,10 @@ class DeviceMixin(object): # {{{
|
||||
db_id = book.db_id
|
||||
if db_id is not None:
|
||||
self.book_db_title_cache[i][book_title]['db_ids'].add(db_id)
|
||||
# increment the count of books on the device with this
|
||||
# db_id.
|
||||
c = self.book_db_id_counts.get(db_id, 0)
|
||||
self.book_db_id_counts[db_id] = c + 1
|
||||
uuid = getattr(book, 'uuid', None)
|
||||
if uuid is not None:
|
||||
self.book_db_uuid_cache[i].add(uuid)
|
||||
@ -1351,7 +1365,13 @@ class DeviceMixin(object): # {{{
|
||||
if mi.authors and \
|
||||
re.sub('(?u)\W|[_]', '', authors_to_string(mi.authors).lower()) \
|
||||
in cache['authors']:
|
||||
# We really shouldn't get here, because set_books_in_library
|
||||
# should have set the db_ids for the books, and therefore
|
||||
# the if just above should have found them. Mark the book
|
||||
# anyway, and print a message about the situation
|
||||
loc[i] = True
|
||||
prints('book_on_device: matched title/author but not db_id!',
|
||||
mi.title, authors_to_string(mi.authors))
|
||||
continue
|
||||
# Also check author sort, because it can be used as author in
|
||||
# some formats
|
||||
@ -1360,9 +1380,16 @@ class DeviceMixin(object): # {{{
|
||||
in cache['authors']:
|
||||
loc[i] = True
|
||||
continue
|
||||
loc[3] = self.book_db_id_counts.get(id, 0)
|
||||
return loc
|
||||
|
||||
def set_books_in_library(self, booklists, reset=False):
|
||||
'''
|
||||
Set the ondevice indications in the device database.
|
||||
This method should be called before book_on_device is called, because
|
||||
it sets the application_id for matched books. Book_on_device uses that
|
||||
to both speed up matching and to count matches.
|
||||
'''
|
||||
# Force a reset if the caches are not initialized
|
||||
if reset or not hasattr(self, 'db_book_title_cache'):
|
||||
# It might be possible to get here without having initialized the
|
||||
@ -1393,10 +1420,12 @@ class DeviceMixin(object): # {{{
|
||||
self.db_book_uuid_cache[mi.uuid] = mi
|
||||
|
||||
# Now iterate through all the books on the device, setting the
|
||||
# in_library field Fastest and most accurate key is the uuid. Second is
|
||||
# in_library field. Fastest and most accurate key is the uuid. Second is
|
||||
# the application_id, which is really the db key, but as this can
|
||||
# accidentally match across libraries we also verify the title. The
|
||||
# db_id exists on Sony devices. Fallback is title and author match
|
||||
# db_id exists on Sony devices. Fallback is title and author match.
|
||||
# We set the application ID so that we can reproduce book matching,
|
||||
# necessary for identifying copies of books.
|
||||
|
||||
update_metadata = prefs['manage_device_metadata'] == 'on_connect'
|
||||
for booklist in booklists:
|
||||
@ -1418,12 +1447,15 @@ class DeviceMixin(object): # {{{
|
||||
if d is not None:
|
||||
if getattr(book, 'application_id', None) in d['db_ids']:
|
||||
book.in_library = True
|
||||
# application already matches db_id, so no need to set it
|
||||
if update_metadata:
|
||||
book.smart_update(d['db_ids'][book.application_id],
|
||||
replace_metadata=True)
|
||||
continue
|
||||
if book.db_id in d['db_ids']:
|
||||
book.in_library = True
|
||||
book.application_id = \
|
||||
d['db_ids'][book.db_id].application_id
|
||||
if update_metadata:
|
||||
book.smart_update(d['db_ids'][book.db_id],
|
||||
replace_metadata=True)
|
||||
@ -1435,11 +1467,15 @@ class DeviceMixin(object): # {{{
|
||||
book_authors = re.sub('(?u)\W|[_]', '', book_authors)
|
||||
if book_authors in d['authors']:
|
||||
book.in_library = True
|
||||
book.application_id = \
|
||||
d['authors'][book_authors].application_id
|
||||
if update_metadata:
|
||||
book.smart_update(d['authors'][book_authors],
|
||||
replace_metadata=True)
|
||||
elif book_authors in d['author_sort']:
|
||||
book.in_library = True
|
||||
book.application_id = \
|
||||
d['author_sort'][book_authors].application_id
|
||||
if update_metadata:
|
||||
book.smart_update(d['author_sort'][book_authors],
|
||||
replace_metadata=True)
|
||||
|
@ -32,6 +32,9 @@ class LibraryViewMixin(object): # {{{
|
||||
|
||||
def __init__(self, db):
|
||||
self.library_view.files_dropped.connect(self.iactions['Add Books'].files_dropped, type=Qt.QueuedConnection)
|
||||
self.library_view.add_column_signal.connect(partial(self.iactions['Preferences'].do_config,
|
||||
initial_plugin=('Interface', 'Custom Columns')),
|
||||
type=Qt.QueuedConnection)
|
||||
for func, args in [
|
||||
('connect_to_search_box', (self.search,
|
||||
self.search_done)),
|
||||
@ -145,20 +148,23 @@ class StatusBar(QStatusBar): # {{{
|
||||
self._font = QFont()
|
||||
self._font.setBold(True)
|
||||
self.setFont(self._font)
|
||||
self.defmsg = QLabel(self.default_message)
|
||||
self.defmsg.setFont(self._font)
|
||||
self.addWidget(self.defmsg)
|
||||
|
||||
def initialize(self, systray=None):
|
||||
self.systray = systray
|
||||
self.notifier = get_notifier(systray)
|
||||
self.messageChanged.connect(self.message_changed,
|
||||
type=Qt.QueuedConnection)
|
||||
self.message_changed('')
|
||||
|
||||
def device_connected(self, devname):
|
||||
self.device_string = _('Connected ') + devname
|
||||
self.defmsg.setText(self.default_message + ' ..::.. ' +
|
||||
self.device_string)
|
||||
self.clearMessage()
|
||||
|
||||
def device_disconnected(self):
|
||||
self.device_string = ''
|
||||
self.defmsg.setText(self.default_message)
|
||||
self.clearMessage()
|
||||
|
||||
def new_version_available(self, ver, url):
|
||||
@ -188,15 +194,6 @@ class StatusBar(QStatusBar): # {{{
|
||||
def clear_message(self):
|
||||
self.clearMessage()
|
||||
|
||||
def message_changed(self, msg):
|
||||
if not msg or msg.isEmpty() or msg.isNull() or \
|
||||
not unicode(msg).strip():
|
||||
extra = ''
|
||||
if self.device_string:
|
||||
extra = ' ..::.. ' + self.device_string
|
||||
self.showMessage(self.default_message + extra)
|
||||
|
||||
|
||||
# }}}
|
||||
|
||||
class LayoutMixin(object): # {{{
|
||||
|
@ -9,7 +9,7 @@ import os
|
||||
from functools import partial
|
||||
|
||||
from PyQt4.Qt import QTableView, Qt, QAbstractItemView, QMenu, pyqtSignal, \
|
||||
QModelIndex
|
||||
QModelIndex, QIcon
|
||||
|
||||
from calibre.gui2.library.delegates import RatingDelegate, PubDateDelegate, \
|
||||
TextDelegate, DateDelegate, TagsDelegate, CcTextDelegate, \
|
||||
@ -23,6 +23,7 @@ from calibre.gui2.library import DEFAULT_SORT
|
||||
class BooksView(QTableView): # {{{
|
||||
|
||||
files_dropped = pyqtSignal(object)
|
||||
add_column_signal = pyqtSignal()
|
||||
|
||||
def __init__(self, parent, modelcls=BooksModel):
|
||||
QTableView.__init__(self, parent)
|
||||
@ -54,6 +55,7 @@ class BooksView(QTableView): # {{{
|
||||
self.selectionModel().currentRowChanged.connect(self._model.current_changed)
|
||||
|
||||
# {{{ Column Header setup
|
||||
self.can_add_columns = True
|
||||
self.was_restored = False
|
||||
self.column_header = self.horizontalHeader()
|
||||
self.column_header.setMovable(True)
|
||||
@ -93,6 +95,8 @@ class BooksView(QTableView): # {{{
|
||||
self.sortByColumn(idx, Qt.DescendingOrder)
|
||||
elif action == 'defaults':
|
||||
self.apply_state(self.get_default_state())
|
||||
elif action == 'addcustcol':
|
||||
self.add_column_signal.emit()
|
||||
elif action.startswith('align_'):
|
||||
alignment = action.partition('_')[-1]
|
||||
self._model.change_alignment(column, alignment)
|
||||
@ -166,6 +170,13 @@ class BooksView(QTableView): # {{{
|
||||
partial(self.column_header_context_handler,
|
||||
action='defaults', column=col))
|
||||
|
||||
if self.can_add_columns:
|
||||
self.column_header_context_menu.addAction(
|
||||
QIcon(I('column.png')),
|
||||
_('Add your own columns'),
|
||||
partial(self.column_header_context_handler,
|
||||
action='addcustcol', column=col))
|
||||
|
||||
self.column_header_context_menu.popup(self.column_header.mapToGlobal(pos))
|
||||
# }}}
|
||||
|
||||
@ -494,6 +505,7 @@ class DeviceBooksView(BooksView): # {{{
|
||||
|
||||
def __init__(self, parent):
|
||||
BooksView.__init__(self, parent, DeviceBooksModel)
|
||||
self.can_add_columns = False
|
||||
self.columns_resized = False
|
||||
self.resize_on_select = False
|
||||
self.rating_delegate = None
|
||||
|
@ -18,18 +18,48 @@ class AbortCommit(Exception):
|
||||
|
||||
class ConfigWidgetInterface(object):
|
||||
|
||||
'''
|
||||
This class defines the interface that all widgets displayed in the
|
||||
Preferences dialog must implement. See :class:`ConfigWidgetBase` for
|
||||
a base class that implements this interface and defines various conveninece
|
||||
methods as well.
|
||||
'''
|
||||
|
||||
#: This signal must be emitted whenever the user changes a value in this
|
||||
#: widget
|
||||
changed_signal = None
|
||||
|
||||
#: Set to True iff the :meth:`restore_to_defaults` method is implemented.
|
||||
supports_restoring_to_defaults = True
|
||||
|
||||
#: The tooltip for the Restore to defaults button
|
||||
restore_defaults_desc = _('Restore settings to default values. '
|
||||
'You have to click Apply to actually save the default settings.')
|
||||
|
||||
#: If True the Preferences dialog will not allow the user to set any more
|
||||
#: preferences. Only has effect if :meth:`commit` returns True.
|
||||
restart_critical = False
|
||||
|
||||
def genesis(self, gui):
|
||||
'''
|
||||
Called once before the widget is displayed, should perform any
|
||||
necessary setup.
|
||||
|
||||
:param gui: The main calibre graphical user interface
|
||||
'''
|
||||
raise NotImplementedError()
|
||||
|
||||
def initialize(self):
|
||||
'''
|
||||
Should set all config values to their initial values (the values
|
||||
stored in the config files).
|
||||
'''
|
||||
raise NotImplementedError()
|
||||
|
||||
def restore_defaults(self):
|
||||
'''
|
||||
Should set all config values to their defaults.
|
||||
'''
|
||||
pass
|
||||
|
||||
def commit(self):
|
||||
@ -37,11 +67,17 @@ class ConfigWidgetInterface(object):
|
||||
Save any changed settings. Return True if the changes require a
|
||||
restart, False otherwise. Raise an :class:`AbortCommit` exception
|
||||
to indicate that an error occurred. You are responsible for giving the
|
||||
suer feedback about what the error is and how to correct it.
|
||||
user feedback about what the error is and how to correct it.
|
||||
'''
|
||||
return False
|
||||
|
||||
def refresh_gui(self, gui):
|
||||
'''
|
||||
Called once after this widget is committed. Responsible for causing the
|
||||
gui to reread any changed settings. Note that by default the GUI
|
||||
re-initializes various elements anyway, so most widgets won't need to
|
||||
use this method.
|
||||
'''
|
||||
pass
|
||||
|
||||
class Setting(object):
|
||||
@ -170,8 +206,23 @@ class CommaSeparatedList(Setting):
|
||||
|
||||
class ConfigWidgetBase(QWidget, ConfigWidgetInterface):
|
||||
|
||||
'''
|
||||
Base class that contains code to easily add standard config widgets like
|
||||
checkboxes, combo boxes, text fields and so on. See the :meth:`register`
|
||||
method.
|
||||
|
||||
This class automatically handles change notification, resetting to default,
|
||||
translation between gui objects and config objects, etc. for registered
|
||||
settings.
|
||||
|
||||
If your config widget inherits from this class but includes setting that
|
||||
are not registered, you should override the :class:`ConfigWidgetInterface` methods
|
||||
and call the base class methods inside the overrides.
|
||||
'''
|
||||
|
||||
changed_signal = pyqtSignal()
|
||||
supports_restoring_to_defaults = True
|
||||
restart_critical = False
|
||||
|
||||
def __init__(self, parent=None):
|
||||
QWidget.__init__(self, parent)
|
||||
@ -181,6 +232,21 @@ class ConfigWidgetBase(QWidget, ConfigWidgetInterface):
|
||||
|
||||
def register(self, name, config_obj, gui_name=None, choices=None,
|
||||
restart_required=False, empty_string_is_None=True, setting=Setting):
|
||||
'''
|
||||
Register a setting.
|
||||
|
||||
:param name: The setting name
|
||||
:param config: The config object that reads/writes the setting
|
||||
:param gui_name: The name of the GUI object that presents an interface
|
||||
to change the setting. By default it is assumed to be
|
||||
``'opt_' + name``.
|
||||
:param choices: If this setting is a multiple choice (combobox) based
|
||||
setting, the list of choices. The list is a list of two
|
||||
element tuples of the form: ``[(gui name, value), ...]``
|
||||
:param setting: The class responsible for managing this setting. The
|
||||
default class handles almost all cases, so this param
|
||||
is rarely used.
|
||||
'''
|
||||
setting = setting(name, config_obj, self, gui_name=gui_name,
|
||||
choices=choices, restart_required=restart_required,
|
||||
empty_string_is_None=empty_string_is_None)
|
||||
|
@ -16,6 +16,8 @@ from calibre.gui2 import error_dialog, question_dialog, ALL_COLUMNS
|
||||
|
||||
class ConfigWidget(ConfigWidgetBase, Ui_Form):
|
||||
|
||||
restart_critical = True
|
||||
|
||||
def genesis(self, gui):
|
||||
self.gui = gui
|
||||
db = self.gui.library_view.model().db
|
||||
@ -103,6 +105,9 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
|
||||
return
|
||||
self.opt_columns.item(idx).setCheckState(False)
|
||||
self.opt_columns.takeItem(idx)
|
||||
if self.custcols[col]['colnum'] is None:
|
||||
del self.custcols[col] # A newly-added column was deleted
|
||||
else:
|
||||
self.custcols[col]['*deleteme'] = True
|
||||
self.changed_signal.emit()
|
||||
|
||||
|
@ -161,7 +161,6 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn):
|
||||
else:
|
||||
idx = self.parent.opt_columns.currentRow()
|
||||
item = self.parent.opt_columns.item(idx)
|
||||
item.setData(Qt.UserRole, QVariant(key))
|
||||
item.setText(col_heading)
|
||||
self.parent.custcols[self.orig_column_name]['label'] = col
|
||||
self.parent.custcols[self.orig_column_name]['name'] = col_heading
|
||||
|
@ -13,7 +13,7 @@ from PyQt4.Qt import QMainWindow, Qt, QIcon, QStatusBar, QFont, QWidget, \
|
||||
QToolBar, QSize, pyqtSignal, QPixmap, QToolButton, QAction, \
|
||||
QDialogButtonBox, QHBoxLayout
|
||||
|
||||
from calibre.constants import __appname__, __version__, islinux, isosx
|
||||
from calibre.constants import __appname__, __version__, islinux
|
||||
from calibre.gui2 import gprefs, min_available_height, available_width, \
|
||||
warning_dialog
|
||||
from calibre.gui2.preferences import init_gui, AbortCommit, get_plugin
|
||||
@ -33,18 +33,13 @@ class StatusBar(QStatusBar): # {{{
|
||||
self._font.setBold(True)
|
||||
self.setFont(self._font)
|
||||
|
||||
self.messageChanged.connect(self.message_changed,
|
||||
type=Qt.QueuedConnection)
|
||||
self.message_changed('')
|
||||
|
||||
def message_changed(self, msg):
|
||||
if not msg or msg.isEmpty() or msg.isNull() or \
|
||||
not unicode(msg).strip():
|
||||
self.showMessage(self.default_message)
|
||||
self.w = QLabel(self.default_message)
|
||||
self.w.setFont(self._font)
|
||||
self.addWidget(self.w)
|
||||
|
||||
# }}}
|
||||
|
||||
class BarTitle(QWidget):
|
||||
class BarTitle(QWidget): # {{{
|
||||
|
||||
def __init__(self, parent=None):
|
||||
QWidget.__init__(self, parent)
|
||||
@ -70,6 +65,8 @@ class BarTitle(QWidget):
|
||||
self.setToolTip(tt)
|
||||
self.setWhatsThis(tt)
|
||||
|
||||
# }}}
|
||||
|
||||
class Category(QWidget): # {{{
|
||||
|
||||
plugin_activated = pyqtSignal(object)
|
||||
@ -164,7 +161,7 @@ class Preferences(QMainWindow):
|
||||
self.must_restart = False
|
||||
self.committed = False
|
||||
|
||||
self.resize(900, 760 if isosx else 710)
|
||||
self.resize(900, 720)
|
||||
nh, nw = min_available_height()-25, available_width()-10
|
||||
if nh < 0:
|
||||
nh = 800
|
||||
@ -201,7 +198,6 @@ class Preferences(QMainWindow):
|
||||
self.cw.layout().addWidget(self.bb)
|
||||
self.bb.rejected.connect(self.close, type=Qt.QueuedConnection)
|
||||
self.setCentralWidget(self.cw)
|
||||
self.bb.setVisible(isosx)
|
||||
self.browser = Browser(self)
|
||||
self.browser.show_plugin.connect(self.show_plugin)
|
||||
self.stack.addWidget(self.browser)
|
||||
@ -268,6 +264,7 @@ class Preferences(QMainWindow):
|
||||
self.bar_title.show_plugin(plugin)
|
||||
self.setWindowIcon(QIcon(plugin.icon))
|
||||
self.bar.setVisible(True)
|
||||
self.bb.setVisible(False)
|
||||
|
||||
|
||||
def hide_plugin(self):
|
||||
@ -277,6 +274,7 @@ class Preferences(QMainWindow):
|
||||
self.bar.setVisible(False)
|
||||
self.stack.setCurrentIndex(0)
|
||||
self.setWindowIcon(QIcon(I('config.png')))
|
||||
self.bb.setVisible(True)
|
||||
|
||||
def esc(self, *args):
|
||||
if self.stack.currentIndex() == 1:
|
||||
@ -289,15 +287,24 @@ class Preferences(QMainWindow):
|
||||
must_restart = self.showing_widget.commit()
|
||||
except AbortCommit:
|
||||
return
|
||||
rc = self.showing_widget.restart_critical
|
||||
self.committed = True
|
||||
if must_restart:
|
||||
self.must_restart = True
|
||||
warning_dialog(self, _('Restart needed'),
|
||||
_('Some of the changes you made require a restart.'
|
||||
' Please restart calibre as soon as possible.'),
|
||||
show=True, show_copy_button=False)
|
||||
msg = _('Some of the changes you made require a restart.'
|
||||
' Please restart calibre as soon as possible.')
|
||||
if rc:
|
||||
msg = _('The changes you have made require calibre be '
|
||||
'restarted immediately. You will not be allowed '
|
||||
'set any more preferences, until you restart.')
|
||||
|
||||
|
||||
warning_dialog(self, _('Restart needed'), msg, show=True,
|
||||
show_copy_button=False)
|
||||
self.showing_widget.refresh_gui(self.gui)
|
||||
self.hide_plugin()
|
||||
if must_restart and rc:
|
||||
self.close()
|
||||
|
||||
|
||||
def cancel(self, *args):
|
||||
@ -309,6 +316,16 @@ class Preferences(QMainWindow):
|
||||
def closeEvent(self, *args):
|
||||
gprefs.set('preferences_window_geometry',
|
||||
bytearray(self.saveGeometry()))
|
||||
if self.committed:
|
||||
self.gui.must_restart_before_config = self.must_restart
|
||||
self.gui.tags_view.set_new_model() # in case columns changed
|
||||
self.gui.tags_view.recount()
|
||||
self.gui.create_device_menu()
|
||||
self.gui.set_device_menu_items_state(bool(self.gui.device_connected))
|
||||
self.gui.tool_bar.build_bar()
|
||||
self.gui.build_context_menus()
|
||||
self.gui.tool_bar.apply_settings()
|
||||
|
||||
return QMainWindow.closeEvent(self, *args)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
@ -47,7 +47,8 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
|
||||
det_msg=traceback.format_exc(), show=True)
|
||||
raise AbortCommit('abort')
|
||||
write_tweaks(raw)
|
||||
return ConfigWidgetBase.commit(self)
|
||||
ConfigWidgetBase.commit(self)
|
||||
return True
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
@ -17,7 +17,7 @@
|
||||
<item>
|
||||
<widget class="QLabel" name="label_18">
|
||||
<property name="text">
|
||||
<string>Values for the tweaks are shown below. Edit them to change the behavior of calibre</string>
|
||||
<string>Values for the tweaks are shown below. Edit them to change the behavior of calibre. Your changes will only take effect after a restart of calibre.</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
|
@ -640,16 +640,17 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
||||
|
||||
def book_on_device_string(self, id):
|
||||
loc = []
|
||||
count = 0
|
||||
on = self.book_on_device(id)
|
||||
if on is not None:
|
||||
m, a, b = on
|
||||
m, a, b, count = on
|
||||
if m is not None:
|
||||
loc.append(_('Main'))
|
||||
if a is not None:
|
||||
loc.append(_('Card A'))
|
||||
if b is not None:
|
||||
loc.append(_('Card B'))
|
||||
return ', '.join(loc)
|
||||
return ', '.join(loc) + ((' (%s books)'%count) if count > 1 else '')
|
||||
|
||||
def set_book_on_device_func(self, func):
|
||||
self.book_on_device_func = func
|
||||
|
@ -28,7 +28,7 @@ Command Line Interface
|
||||
|
||||
.. image:: ../images/cli.png
|
||||
|
||||
On OS X you have to go to Preferences->Advanced and click install command line
|
||||
On OS X you have to go to Preferences->Advanced->Miscellaneous and click install command line
|
||||
tools to make the command line tools available. On other platforms, just start
|
||||
a terminal and type the command.
|
||||
|
||||
|
@ -11,7 +11,7 @@ Customizing |app|
|
||||
*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
|
||||
specify your own static resources like icons and templates to override the defaults and finally how to
|
||||
use *plugins* to add funtionality to |app|.
|
||||
use *plugins* to add functionality to |app|.
|
||||
|
||||
.. contents::
|
||||
:depth: 2
|
||||
@ -45,7 +45,7 @@ All static resources are stored in the resources sub-folder of the calibre insta
|
||||
from the calibre website it will be :file:`/opt/calibre/resources`. These paths can change depending on where you choose to install |app|.
|
||||
|
||||
You should not change the files in this resources folder, as your changes will get overwritten the next time you update |app|. Instead, go to
|
||||
:guilabel:`Preferences->Advanced` and click :guilabel:`Open calibre configuration directory`. In this configuration directory, create a sub-folder called resources and place the files you want to override in it. Place the files in the appropriate sub folders, for example place images in :file:`resources/images`, etc.
|
||||
:guilabel:`Preferences->Advanced->Miscellaneous` and click :guilabel:`Open calibre configuration directory`. In this configuration directory, create a sub-folder called resources and place the files you want to override in it. Place the files in the appropriate sub folders, for example place images in :file:`resources/images`, etc.
|
||||
|app| will automatically use your custom file in preference to the builtin one the next time it is started.
|
||||
|
||||
For example, if you wanted to change the icon for the :guilabel:`Remove books` action, you would first look in the builtin resources folder and see that the relevant file is
|
||||
|
@ -123,7 +123,7 @@ the previously checked out calibre code directory, for example::
|
||||
|
||||
cd /Users/kovid/work/calibre
|
||||
|
||||
calibre is the directory that contains the src and resources sub directories. Ensure you have installed the |app| commandline tools via Preferences->Advanced in the |app| GUI.
|
||||
calibre is the directory that contains the src and resources sub directories. Ensure you have installed the |app| commandline tools via :guilabel:Preferences->Advanced->Miscellaneous in the |app| GUI.
|
||||
|
||||
The next step is to set the environment variable ``CALIBRE_DEVELOP_FROM`` to the absolute path to the src directory.
|
||||
So, following the example above, it would be ``/Users/kovid/work/calibre/src``. Apple
|
||||
|
@ -62,7 +62,7 @@ How do I convert my file containing non-English characters, or smart quotes?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
There are two aspects to this problem:
|
||||
1. Knowing the encoding of the source file: |app| tries to guess what character encoding your source files use, but often, this is impossible, so you need to tell it what encoding to use. This can be done in the GUI via the :guilabel:`Input character encoding` field in the :guilabel:`Look & Feel` section. The command-line tools all have an :option:`--input-encoding` option.
|
||||
2. When adding HTML files to |app|, you may need to tell |app| what encoding the files are in. To do this go to Preferences->Plugins->File Type plugins and customize the HTML2Zip plugin, telling it what encoding your HTML files are in. Now when you add HTML files to |app| they will be correctly processed. HTML files from different sources often have different encodings, so you may have to change this setting repeatedly. A common encoding for many files from the web is ``cp1252`` and I would suggest you try that first. Note that when converting HTML files, leave the input encoding setting mentioned above blank. This is because the HTML2ZIP plugin automatically converts the HTML files to a standard encoding (utf-8).
|
||||
2. When adding HTML files to |app|, you may need to tell |app| what encoding the files are in. To do this go to :guilabel:`Preferences->Advanced->Plugins->File Type plugins` and customize the HTML2Zip plugin, telling it what encoding your HTML files are in. Now when you add HTML files to |app| they will be correctly processed. HTML files from different sources often have different encodings, so you may have to change this setting repeatedly. A common encoding for many files from the web is ``cp1252`` and I would suggest you try that first. Note that when converting HTML files, leave the input encoding setting mentioned above blank. This is because the HTML2ZIP plugin automatically converts the HTML files to a standard encoding (utf-8).
|
||||
3. Embedding fonts: If you are generating an LRF file to read on your SONY Reader, you are limited by the fact that the Reader only supports a few non-English characters in the fonts it comes pre-loaded with. You can work around this problem by embedding a unicode-aware font that supports the character set your file uses into the LRF file. You should embed atleast a serif and a sans-serif font. Be aware that embedding fonts significantly slows down page-turn speed on the reader.
|
||||
|
||||
|
||||
@ -92,7 +92,7 @@ We just need some information from you:
|
||||
* What e-book formats does your device support?
|
||||
* Is there a special directory on the device in which all e-book files should be placed?
|
||||
* We also need information about your device that |app| will collect automatically. First, if your
|
||||
device supports SD cards, insert them. Then connect your device. In calibre go to Preferences->Advanced
|
||||
device supports SD cards, insert them. Then connect your device. In calibre go to :guilabel:`Preferences->Advanced->Miscellaneous`
|
||||
and click the "Debug device detection" button. This will create some debug output. Copy it to a file
|
||||
and repeat the process, this time with your device disconnected.
|
||||
* Send both the above outputs to us with the other information and we will write a device driver for your
|
||||
@ -109,11 +109,11 @@ of which books are members are shown on the device view.
|
||||
|
||||
When you send a book to the reader, |app| will add the book to collections based on the metadata for that book. By
|
||||
default, collections are created from tags and series. You can control what metadata is used by going to
|
||||
Preferences->Plugins->Device Interface plugins and customizing the SONY device interface plugin. If you remove all
|
||||
:guilabel:`Preferences->Advanced->Plugins->Device Interface plugins` and customizing the SONY device interface plugin. If you remove all
|
||||
values, |app| will not add the book to any collection.
|
||||
|
||||
Collection management is largely controlled by the 'Metadata management' option found at
|
||||
Preferences->Add/Save->Sending to device. If set to 'Manual' (the default), managing collections is left to
|
||||
:guilabel:`Preferences->Import/Export->Sending books to devices`. If set to 'Manual' (the default), managing collections is left to
|
||||
the user; |app| will not delete already existing collections for a book on your reader when you resend the
|
||||
book to the reader, but |app| will add the book to collections if necessary. To ensure that the collections
|
||||
for a book are based only on current |app| metadata, first delete the books from the reader, then resend the
|
||||
@ -185,8 +185,8 @@ The easiest way to browse your |app| collection on your Apple device (iPad/iPhon
|
||||
|
||||
First perform the following steps in |app|
|
||||
|
||||
* Set the Preferred Output Format in |app| to EPUB (The output format can be set under Preferences->General)
|
||||
* Set the output profile to iPad (this will work for iPhone/iPods as well), under Preferences->Conversion->Page Setup
|
||||
* Set the Preferred Output Format in |app| to EPUB (The output format can be set under :guilabel:`Preferences->Interface->Behavior`)
|
||||
* Set the output profile to iPad (this will work for iPhone/iPods as well), under :guilabel:`Preferences->Conversion->Common Options->Page Setup`
|
||||
* Convert the books you want to read on your iPhone to EPUB format by selecting them and clicking the Convert button.
|
||||
* Turn on the Content Server in |app|'s preferences and leave |app| running.
|
||||
|
||||
@ -217,7 +217,7 @@ Can I access my |app| books using the web browser in my Kindle or other reading
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|app| has a *Content Server* that exports the books in |app| as a web page. You can turn it on under
|
||||
Preferences->Content Server. Then just point the web browser on your device to the computer running
|
||||
:guilabel:`Preferences->Network->Sharing over the net`. Then just point the web browser on your device to the computer running
|
||||
the Content Server and you will be able to browse your book collection. For example, if the computer running
|
||||
the server has IP address 63.45.128.5, in the browser, you would type::
|
||||
|
||||
@ -277,14 +277,14 @@ In |app|, you would instead use tags to mark genre and read status and then just
|
||||
|
||||
Why doesn't |app| have a column for foo?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|app| is designed to have columns for the most frequently and widely used fields. In addition, you can add any columns you like. Columns can be added via Preferences->Interface.
|
||||
|app| is designed to have columns for the most frequently and widely used fields. In addition, you can add any columns you like. Columns can be added via :guilabel:`Preferences->Interface->Add your own columns`.
|
||||
Watch the tutorial `UI Power tips <http://calibre-ebook.com/demo#tutorials>`_ to learn how to create your own columns.
|
||||
|
||||
How do I move my |app| library from one computer to another?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Simply copy the |app| library folder from the old to the new computer. You can find out what the library folder is by clicking the calibre icon in the toolbar. The very first item is the path to the library folder. Now on the new computer, start |app| for the first time. It will run the Welcome Wizard asking you for the location of the |app| library. Point it to the previously copied folder.
|
||||
|
||||
Note that if you are transferring between different types of computers (for example Windows to OS X) then after doing the above you should also go to Preferences->Advanced and click the Check database integrity button. It will warn you about missing files, if any, which you should then transfer by hand.
|
||||
Note that if you are transferring between different types of computers (for example Windows to OS X) then after doing the above you should also go to :guilabel:`Preferences->Advanced->Miscellaneous` and click the "Check database integrity button". It will warn you about missing files, if any, which you should then transfer by hand.
|
||||
|
||||
|
||||
Content From The Web
|
||||
|
@ -165,3 +165,19 @@ User Interface Actions
|
||||
:members:
|
||||
:member-order: bysource
|
||||
|
||||
Preferences Plugins
|
||||
--------------------------
|
||||
|
||||
.. autoclass:: calibre.customize.PreferencesPlugin
|
||||
:show-inheritance:
|
||||
:members:
|
||||
:member-order: bysource
|
||||
|
||||
.. autoclass:: calibre.gui2.preferences.ConfigWidgetInterface
|
||||
:members:
|
||||
:member-order: bysource
|
||||
|
||||
.. autoclass:: calibre.gui2.preferences.ConfigWidgetBase
|
||||
:members:
|
||||
:member-order: bysource
|
||||
|
||||
|
@ -46,8 +46,8 @@ The steps required to prepare the USB stick are as follows:
|
||||
* Deselect the options for creating Menu shortcuts; creating a calibre shortcut on the desktop; and adding Calibre to the path
|
||||
|
||||
* Create the CalibreLibrary folder inside the Calibre_Root_Folder. If you have an existing Calibre library copy it and all its contents to the CalibreLibrary folder. If you do not already have a library do not worry as a new one will be created at this location when Calibre is started.
|
||||
* Create the CalibreConfig folder inside the Calibre_Root_Folder. This will hold your personal Calibre configuration settings. If you have an existing Calibre installation and want to copy the current settings then copy the contents of your current configuration folder to the CalibreConfig folder. You can find the location of your current configuration folder by going to Preferences->Advanced and clicking the “Open calibre configuration Directory” button.
|
||||
* When you have started Calibre, go into Preferences->General and check that you have set the Job Priority to ‘Low’. This setting keeps single-processor Windows systems responsive without affecting Calibre performance to any noticeable degree. On multi-processor or multi-core systems this setting does not matter as much, but setting it will do no harm.
|
||||
* Create the CalibreConfig folder inside the Calibre_Root_Folder. This will hold your personal Calibre configuration settings. If you have an existing Calibre installation and want to copy the current settings then copy the contents of your current configuration folder to the CalibreConfig folder. You can find the location of your current configuration folder by going to :guilabel:`Preferences->Advanced->Miscellaneous` and clicking the “Open calibre configuration Directory” button.
|
||||
* When you have started Calibre, go into :guilabel:`Preferences->Interface->Behavior` and check that you have set the Job Priority to ‘Low’. This setting keeps single-processor Windows systems responsive without affecting Calibre performance to any noticeable degree. On multi-processor or multi-core systems this setting does not matter as much, but setting it will do no harm.
|
||||
|
||||
Using calibre-portable.bat
|
||||
---------------------------
|
||||
|
@ -18,7 +18,7 @@ Starting the viewer
|
||||
You can view any of the books in your |app| library by selecting the book and pressing the View button. This
|
||||
will open up the book in the e-book viewer. You can also launch the viewer by itself, from the Start menu in windows
|
||||
or using the command :command:`ebook-viewer` in Linux and OS X (you have to install the command line tools on OS X
|
||||
first by going to Preferences->Advanced).
|
||||
first by going to :guilabel:`Preferences->Advanced->Miscellaneous`).
|
||||
|
||||
Navigating around an e-book
|
||||
-----------------------------
|
||||
|
@ -5,8 +5,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: calibre 0.7.17\n"
|
||||
"POT-Creation-Date: 2010-09-05 17:35+MDT\n"
|
||||
"PO-Revision-Date: 2010-09-05 17:35+MDT\n"
|
||||
"POT-Creation-Date: 2010-09-07 13:11+MDT\n"
|
||||
"PO-Revision-Date: 2010-09-07 13:11+MDT\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: LANGUAGE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -103,8 +103,8 @@ msgstr ""
|
||||
#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:249
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:323
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:330
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:289
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:292
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:290
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:293
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:137
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:144
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42
|
||||
@ -129,13 +129,13 @@ msgstr ""
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:186
|
||||
#: /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:375
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:387
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1057
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1126
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1825
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1827
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1954
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:376
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:388
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1059
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1128
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1826
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1828
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1955
|
||||
#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:211
|
||||
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137
|
||||
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:140
|
||||
@ -173,12 +173,12 @@ msgstr ""
|
||||
msgid "User Interface Action"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:376
|
||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:383
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:17
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:150
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:213
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:234
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:187
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:251
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:273
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206
|
||||
msgid "Preferences"
|
||||
msgstr ""
|
||||
@ -642,9 +642,9 @@ msgstr ""
|
||||
#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:823
|
||||
#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:851
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:244
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:192
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:205
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1694
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:193
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:206
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1695
|
||||
#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:132
|
||||
msgid "News"
|
||||
msgstr ""
|
||||
@ -2767,10 +2767,10 @@ msgstr ""
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:115
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:203
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:75
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:141
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:177
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:204
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:91
|
||||
msgid "No books selected"
|
||||
msgstr ""
|
||||
@ -2888,7 +2888,7 @@ msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:186
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:53
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:100
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:102
|
||||
msgid "Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
@ -3060,7 +3060,7 @@ msgid "Deleting books from device."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:160
|
||||
msgid "The selected books will be <b>permanently deleted</b> and the files removed from your computer. Are you sure?"
|
||||
msgid "The selected books will be <b>permanently deleted</b> and the files removed from your calibre library. Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:179
|
||||
@ -3166,39 +3166,39 @@ msgstr ""
|
||||
msgid "Merge into first selected book - keep others"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:73
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74
|
||||
msgid "Cannot download metadata"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:96
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:97
|
||||
msgid "social metadata"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:99
|
||||
msgid "covers"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:99
|
||||
msgid "metadata"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:103
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:104
|
||||
msgid "Downloading %s for %d book(s)"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:124
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:125
|
||||
msgid "Failed to download some metadata"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:125
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:126
|
||||
msgid "Failed to download metadata for the following:"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:128
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:129
|
||||
msgid "Failed to download metadata:"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:129
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:130
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:607
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:65
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:112
|
||||
@ -3206,29 +3206,29 @@ msgstr ""
|
||||
msgid "Error"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:139
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:175
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176
|
||||
msgid "Cannot edit metadata"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:202
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:203
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:206
|
||||
msgid "Cannot merge books"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:206
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:207
|
||||
msgid "At least two books must be selected for merging"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:210
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:211
|
||||
msgid "All book formats and metadata from the selected books will be added to the <b>first selected book.</b><br><br> The second and subsequently selected books will not be deleted or changed.<br><br>Please confirm you want to proceed."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:222
|
||||
msgid "All book formats and metadata from the selected books will be merged into the <b>first selected book</b>.<br><br>After merger the second and subsequently selected books will be <b>deleted</b>. <br><br>All book formats of the first selected book will be kept and any duplicate formats in the second and subsequently selected books will be permanently <b>deleted</b> from your computer.<br><br> Are you <b>sure</b> you want to proceed?"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:233
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:234
|
||||
msgid "You are about to merge more than 5 books. Are you <b>sure</b> you want to proceed?"
|
||||
msgstr ""
|
||||
|
||||
@ -3852,8 +3852,8 @@ msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20
|
||||
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:550
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1657
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1675
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1658
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1676
|
||||
msgid "Catalog"
|
||||
msgstr ""
|
||||
|
||||
@ -5738,7 +5738,7 @@ msgid "Reset cover to default"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410
|
||||
msgid "Download &cover"
|
||||
msgid "Download co&ver"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411
|
||||
@ -6481,12 +6481,12 @@ msgid "Shift+Alt+T"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:138
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:26
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29
|
||||
msgid "version"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:139
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:27
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:30
|
||||
msgid "created by Kovid Goyal"
|
||||
msgstr ""
|
||||
|
||||
@ -6494,20 +6494,20 @@ msgstr ""
|
||||
msgid "Connected "
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:166
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:169
|
||||
msgid "Update found"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:210
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:204
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:214
|
||||
msgid "Book Details"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:212
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:206
|
||||
msgid "Alt+D"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:222
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:216
|
||||
msgid "Shift+Alt+D"
|
||||
msgstr ""
|
||||
|
||||
@ -6596,7 +6596,7 @@ msgid "Show books in the main memory of the device"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:648
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:650
|
||||
msgid "Card A"
|
||||
msgstr ""
|
||||
|
||||
@ -6605,7 +6605,7 @@ msgid "Show books in storage card A"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:650
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:652
|
||||
msgid "Card B"
|
||||
msgstr ""
|
||||
|
||||
@ -6946,7 +6946,7 @@ msgstr ""
|
||||
msgid "No matches found for this book"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/__init__.py:23
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/__init__.py:36
|
||||
msgid "Restore settings to default values. You have to click Apply to actually save the default settings."
|
||||
msgstr ""
|
||||
|
||||
@ -7073,15 +7073,15 @@ msgstr ""
|
||||
msgid "Use internal &viewer for:"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:94
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:96
|
||||
msgid "You must select a column to delete it"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:99
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:101
|
||||
msgid "The selected column is not a custom column"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:101
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:103
|
||||
msgid "Do you really want to delete column %s and all its data?"
|
||||
msgstr ""
|
||||
|
||||
@ -7405,37 +7405,41 @@ msgstr ""
|
||||
msgid "Show &text under icons:"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:172
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:215
|
||||
msgid "&Apply"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:175
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218
|
||||
msgid "&Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:184
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222
|
||||
msgid "Restore &defaults"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:185
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:223
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:186
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:224
|
||||
msgid "Cancel and return to overview"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:221
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:259
|
||||
msgid "Restoring to defaults not supported for"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:247
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:120
|
||||
msgid "Restart needed"
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:294
|
||||
msgid "Some of the changes you made require a restart. Please restart calibre as soon as possible."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:248
|
||||
msgid "Some of the changes you made require a restart. Please restart calibre as soon as possible."
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:297
|
||||
msgid "The changes you have made require calibre be restarted immediately. You will not be allowed set any more preferences, until you restart."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:302
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:120
|
||||
msgid "Restart needed"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:49
|
||||
@ -7830,7 +7834,7 @@ msgid "The tweaks you entered are invalid, try resetting the tweaks to default a
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:50
|
||||
msgid "Values for the tweaks are shown below. Edit them to change the behavior of calibre"
|
||||
msgid "Values for the tweaks are shown below. Edit them to change the behavior of calibre. Your changes will only take effect after a restart of calibre."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:51
|
||||
@ -7975,7 +7979,7 @@ msgid "Manage User Categories"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:435
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:300
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:301
|
||||
msgid "Searches"
|
||||
msgstr ""
|
||||
|
||||
@ -8110,7 +8114,7 @@ msgstr ""
|
||||
msgid "WARNING: Active jobs"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:573
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:579
|
||||
msgid "will keep running in the system tray. To close it, choose <b>Quit</b> in the context menu of the system tray."
|
||||
msgstr ""
|
||||
|
||||
@ -9133,33 +9137,33 @@ msgstr ""
|
||||
msgid "You must specify at least one file to add"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:329
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:330
|
||||
msgid ""
|
||||
"%prog remove ids\n"
|
||||
"\n"
|
||||
"Remove the books identified by ids from the database. ids should be a comma separated list of id numbers (you can get id numbers by using the list command). For example, 23,34,57-85\n"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:344
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:345
|
||||
msgid "You must specify at least one book to remove"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:363
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:364
|
||||
msgid ""
|
||||
"%prog add_format [options] id ebook_file\n"
|
||||
"\n"
|
||||
"Add the ebook in ebook_file to the available formats for the logical book identified by id. You can get id by using the list command. If the format already exists, it is replaced.\n"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:378
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:379
|
||||
msgid "You must specify an id and an ebook file"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:383
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:384
|
||||
msgid "ebook file must have an extension"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:391
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:392
|
||||
msgid ""
|
||||
"\n"
|
||||
"%prog remove_format [options] id fmt\n"
|
||||
@ -9167,11 +9171,11 @@ msgid ""
|
||||
"Remove the format fmt from the logical book identified by id. You can get id by using the list command. fmt should be a file extension like LRF or TXT or EPUB. If the logical book does not have fmt available, do nothing.\n"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:408
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:409
|
||||
msgid "You must specify an id and a format"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:426
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:427
|
||||
msgid ""
|
||||
"\n"
|
||||
"%prog show_metadata [options] id\n"
|
||||
@ -9180,15 +9184,15 @@ msgid ""
|
||||
"id is an id number from the list command.\n"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:434
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:435
|
||||
msgid "Print metadata in OPF form (XML)"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:443
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:444
|
||||
msgid "You must specify an id"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:456
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:458
|
||||
msgid ""
|
||||
"\n"
|
||||
"%prog set_metadata [options] id /path/to/metadata.opf\n"
|
||||
@ -9199,11 +9203,11 @@ msgid ""
|
||||
"show_metadata command.\n"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:472
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:474
|
||||
msgid "You must specify an id and a metadata file"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:492
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:494
|
||||
msgid ""
|
||||
"%prog export [options] ids\n"
|
||||
"\n"
|
||||
@ -9212,27 +9216,27 @@ msgid ""
|
||||
"an opf file). You can get id numbers from the list command.\n"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:500
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:502
|
||||
msgid "Export all books in database, ignoring the list of ids."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:502
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:504
|
||||
msgid "Export books to the specified directory. Default is"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:504
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:506
|
||||
msgid "Export all books into a single directory"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:511
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:513
|
||||
msgid "Specifying this switch will turn this behavior off."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:534
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:536
|
||||
msgid "You must specify some ids or the %s option"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:547
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:549
|
||||
msgid ""
|
||||
"%prog add_custom_column [options] label name datatype\n"
|
||||
"\n"
|
||||
@ -9241,19 +9245,19 @@ msgid ""
|
||||
"datatype is one of: {0}\n"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:556
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:558
|
||||
msgid "This column stores tag like data (i.e. multiple comma separated values). Only applies if datatype is text."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:560
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:562
|
||||
msgid "A dictionary of options to customize how the data in this column will be interpreted."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:573
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:575
|
||||
msgid "You must specify label, name and datatype"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:631
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:633
|
||||
msgid ""
|
||||
"\n"
|
||||
" %prog catalog /path/to/destination.(csv|epub|mobi|xml ...) [options]\n"
|
||||
@ -9263,29 +9267,29 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:645
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:647
|
||||
msgid ""
|
||||
"Comma-separated list of database IDs to catalog.\n"
|
||||
"If declared, --search is ignored.\n"
|
||||
"Default: all"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:649
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:651
|
||||
msgid ""
|
||||
"Filter the results by the search query. For the format of the search query, please see the search-related documentation in the User Manual.\n"
|
||||
"Default: no filtering"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:655
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:657
|
||||
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:505
|
||||
msgid "Show detailed output information. Useful for debugging"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:668
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:670
|
||||
msgid "Error: You must specify a catalog output file"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:710
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:712
|
||||
msgid ""
|
||||
"\n"
|
||||
" %prog set_custom [options] column id value\n"
|
||||
@ -9297,15 +9301,15 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:721
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:723
|
||||
msgid "If the column stores multiple values, append the specified values to the existing ones, instead of replacing them."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:732
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:734
|
||||
msgid "Error: You must specify a field name, id and value"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:751
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:753
|
||||
msgid ""
|
||||
"\n"
|
||||
" %prog custom_columns [options]\n"
|
||||
@ -9314,19 +9318,19 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:758
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:760
|
||||
msgid "Show details for each column."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:770
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:772
|
||||
msgid "You will lose all data in the column: %r. Are you sure (y/n)? "
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:772
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:774
|
||||
msgid "y"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:778
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:780
|
||||
msgid ""
|
||||
"\n"
|
||||
" %prog remove_custom_column [options] label\n"
|
||||
@ -9336,15 +9340,15 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:786
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:788
|
||||
msgid "Do not ask for confirmation"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:796
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:798
|
||||
msgid "Error: You must specify a column label"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:803
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:805
|
||||
msgid ""
|
||||
"\n"
|
||||
" %prog saved_searches [options] list\n"
|
||||
@ -9357,39 +9361,39 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:821
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:823
|
||||
msgid "Error: You must specify an action (add|remove|list)"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:829
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:831
|
||||
msgid "Name:"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:830
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:832
|
||||
msgid "Search string:"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:836
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:838
|
||||
msgid "Error: You must specify a name and a search string"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:839
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:841
|
||||
msgid "added"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:844
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:846
|
||||
msgid "Error: You must specify a name"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:847
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:849
|
||||
msgid "removed"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:851
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:853
|
||||
msgid "Error: Action %s not recognized, must be one of: (add|remove|list)"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:865
|
||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:867
|
||||
msgid ""
|
||||
"%%prog command [options] [arguments]\n"
|
||||
"\n"
|
||||
@ -9413,31 +9417,31 @@ msgstr ""
|
||||
msgid "%sAverage rating is %3.1f"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:646
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:648
|
||||
msgid "Main"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1980
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1981
|
||||
msgid "<p>Migrating old database to ebook library in %s<br><center>"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2009
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2010
|
||||
msgid "Copying <b>%s</b>"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2026
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2027
|
||||
msgid "Compacting database"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2119
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2120
|
||||
msgid "Checking SQL integrity..."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2160
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2159
|
||||
msgid "Checking for missing files."
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2182
|
||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2181
|
||||
msgid "Checked id"
|
||||
msgstr ""
|
||||
|
||||
@ -9833,7 +9837,7 @@ msgstr ""
|
||||
msgid "Failed to authenticate with server: %s"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:229
|
||||
#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:230
|
||||
msgid "Control email delivery"
|
||||
msgstr ""
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user